无法通过自定义云信息资源调用lambda函数

时间:2017-03-03 09:39:15

标签: python json amazon-web-services amazon-cloudformation

我正在创建一个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内?

来自AWS Documentation

  

将Lambda函数与自定义资源相关联时,   每当创建,更新自定义资源时,都会调用函数   或删除

1 个答案:

答案 0 :(得分:0)

您是否在同一CF模板中创建lambda函数?

我没有仔细研究过这个问题,但我最初的印象是lambda函数没有完成让cloudformation知道它已经完成创建的要求。

关键是CF“response.SUCCESS”响应尚未发送回CF. CF将创建lambda函数,但它需要知道它是成功的。

这是你在node.js中的方法,我不知道python的语法。

37.139.14.547 ansible_user=root

请参阅http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html