1

Ich rufe einen lambda function von einem custom resource in cloudformation Vorlage. Diese benutzerdefinierte Ressource hat eine Eigenschaft: den Namen des cloudformation Stapels. Ich brauche diesen Eigenschaftswert in der Lambda-Funktion, damit ich andere Variablen wie parameters und outputs des Stapels bekommen kann. Hier ist das ist custom resource:Abrufen des Namens des Wolkenbildungsstapels aus der Lambda-Funktion

"DeployApp": { 
    "Type" : "Custom::deployapplication", 
    "Properties" : { 
    "ServiceToken": { "Fn::GetAtt" : ["lambda" , "Arn"] }, 
    "StackName": { "Ref": "AWS::StackName" } 
    } 
} 

Im Moment habe ich den Stapel Namen in der Lambda-Funktion auf diese Weise:

import boto3 

def lambda_handler(event, context): 

    cf_client = boto3.client('cloudformation') 
    # Get the name of the stack 
    stack = context.invoked_function_arn.split(':')[6] 
    stack = stack.split('-')[:4] 
    stack_name = stack[0]+'-'+stack[1]+'-'+stack[2]+'-'+stack[3] 
    print('CloudFormation stack name : '+stack_name) 

hier immer habe ich den Namen des Stapels etwas wie folgt aus:

stack-cfn-lambda-app: 4 Wörter geteilt durch '-' Aber ich möchte es allgemeiner machen, so dass alle Namen Formate akzeptiert werden. Wie man das macht und den genauen Namen des Stapels erhält, ohne bereits zu wissen, wie das Format sein wird?

Mit anderen Worten, wie in Python kann ich aus dieser Zeichenfolge (Funktion Lambda ARN) erhalten:

arn:aws:lambda:eu-west-1:53436693423891:function:stackName-ELATEDLEXZPS 

die Zeichenfolge zwischen :function: und ELATEDLEXZPS?

Antwort

1

Wenn Sie den Namen des Stapels bereits in den Funktionseigenschaften platziert haben, wie im ersten Codebeispiel, können Sie einfach über das Ereignisobjekt auf diese Eigenschaften zugreifen.

StackInfo: 
    Type: Custom::StackInfo 
    Properties: 
     ServiceToken: !GetAtt StackInfoFunction2.Arn 
     StackName: 
     Ref: "AWS::StackName" 

Lambda-Code:

import json 
import cfnresponse 
def handler(event, context): 
    print("stack name: " + event['ResourceProperties']['StackName']) 
    cfnresponse.send(event, context, cfnresponse.SUCCESS, {}) 
+0

Ja! Ich habe es Vielen Dank. Effektiv Ereignisvariable ist einfach das Ding – Somar

Verwandte Themen