无法通过自定义 cloudformation 资源调用 lambda 函数

Posted

技术标签:

【中文标题】无法通过自定义 cloudformation 资源调用 lambda 函数【英文标题】:Can't invoke lambda function by a custom cloudformation resource 【发布时间】:2017-07-23 08:30:52 【问题描述】:

我正在创建一个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】:

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

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

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

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

response.send(event, context, response.SUCCESS, responseData);

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

【讨论】:

以上是关于无法通过自定义 cloudformation 资源调用 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

无服务器错误,当自定义命名资源需要替换时,CloudFormation 无法更新堆栈

异步 Lambda 函数:返回 promise 或发送 responseURL 不会终止 CloudFormation 自定义资源调用

自定义资源 cloudformation 的堆栈策略

如何自定义 AWS Codestar / Cloudformation 模板来创建特定的代码构建项目?

AWS学习笔记--利用CloudFormation管理AWS资源

CloudFormation 将项目放入 DynamoDB 表中