从 lambda 函数中检索 cloudformation 堆栈名称
retrieve the cloudformation stack name from the lambda function
我从 cloudformation
模板中的 custom resource
调用了 lambda function
。此自定义资源有一个 属性 :cloudformation
堆栈的名称。我在 lambda 函数中需要这个 属性 值,这样我就可以获得其他变量,例如堆栈的 parameters
和 outputs
。这是 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, {})
我从 cloudformation
模板中的 custom resource
调用了 lambda function
。此自定义资源有一个 属性 :cloudformation
堆栈的名称。我在 lambda 函数中需要这个 属性 值,这样我就可以获得其他变量,例如堆栈的 parameters
和 outputs
。这是 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, {})