我正在创建一个cloudformation
模板,用于创建DynamoDB table
。我想将模板的参数值放在DynamoDB table
中。为此,我创建了一个lambda函数,它接受堆栈参数并将它们放在表项中,如下所示:
import boto3
def lambda_handler(event, context):
parameters = {}
outputs = {}
cf_client = boto3.client('cloudformation')
dynamodb = boto3.resource('dynamodb')
# Get the name of the stack cloudformation
stack_name = context.invoked_function_arn.split(':')[6].rsplit('-', 2)[0]
response = cf_client.describe_stacks(StackName=stack_name)
# Get the outputs of the stack
for r in response['Stacks'][0]['Outputs']:
outputs[r['OutputKey']] = r['OutputValue']
policy_table_name = outputs['PolicyDDBTableName']
# Get the parametres of the stack
for e in response['Stacks'][0]['Parameters']:
parameters[e['ParameterKey']] = e['ParameterValue']
DefaultRetentionDays = parameters['DefaultRetentionDays']
CustomTagName = parameters['CustomTagName']
AutoSnapshotDeletion = parameters['AutoSnapshotDeletion']
response = dynamodb.put_item(
TableName=policy_table_name,
Item={'SolutionName': {'S': 'EbsSnapshotScheduler'},
'DefaultRetentionDays': {'S': DefaultRetentionDays},
'CustomTagName': {'S': CustomTagName},
'AutoSnapshotDeletion': {'S': AutoSnapshotDeletion}
})
然后在模板cloudformation
中,我创建了一个custom resource
来调用该函数:
"PutInDB" : {
"Type" : "Custom::customhelper",
"Properties" : {
"ServiceToken": { "Fn::GetAtt" : ["FunctionHelper" , "Arn"] },
"StackName": {"Ref": "AWS::StackName" }
}
},
该函数及其角色也在同一堆栈中创建。
当我创建堆栈时,custom resource
挂起并且无法使用错误创建:
Custom Resource failed to stabilize in expected time
。我在这里错过了什么吗?
如何成功创建custom resource
并调用该函数,以便将堆栈的参数插入DynamoDB table
内?
将Lambda函数与自定义资源相关联时, 每当创建,更新自定义资源时,都会调用函数 或删除
答案 0 :(得分:0)
您是否在同一CF模板中创建lambda函数?
我没有仔细研究过这个问题,但我最初的印象是lambda函数没有完成让cloudformation知道它已经完成创建的要求。
关键是CF“response.SUCCESS”响应尚未发送回CF. CF将创建lambda函数,但它需要知道它是成功的。
这是你在node.js中的方法,我不知道python的语法。
37.139.14.547 ansible_user=root