从 lambda 函数中检索 cloudformation 堆栈名称

retrieve the cloudformation stack name from the lambda function

我从 cloudformation 模板中的 custom resource 调用了 lambda function。此自定义资源有一个 属性 :cloudformation 堆栈的名称。我在 lambda 函数中需要这个 属性 值,这样我就可以获得其他变量,例如堆栈的 parametersoutputs。这是 custom resource:

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

目前,我通过这种方式在 lambda 函数中获取堆栈名称:

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)

在这里,我总是将堆栈的名称设置为这样的名称:

stack-cfn-lambda-app : 4个单词被'-'分割 但我想让它更通用,以便接受所有名称格式。 如何做到这一点并在不知道格式将如何的情况下获得堆栈的确切名称?

换句话说,在 python 我如何从这个字符串(函数 lambda ARN)中得到:

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

:function:ELATEDLEXZPS 之间的字符串 ?

如果您已经将堆栈名称放在函数属性中,就像您在第一个代码示例中所做的那样,您可以简单地通过事件对象访问这些属性。

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

Lambda 代码:

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