【问题标题】:How to store & reuse response data from a CloudFormation Custom Resource Lambda function within the stack?如何在堆栈中存储和重用来自 CloudFormation 自定义资源 Lambda 函数的响应数据?
【发布时间】:2021-06-23 14:59:47
【问题描述】:

我正在按照this documentation 为 Cloudformation 自定义资源设计一个 AWS Lambda 函数。

创建自定义资源后,关联的 Lambda 函数应 (a) 创建外部资源,并 (b) 返回与该外部资源关联的 ID。

更新或删除自定义资源时,关联的 Lambda 函数应将现有外部资源的 ID 作为参数/属性,并相应地更新/删除该外部资源。

为此,CloudFormation 堆栈需要存储 Lambda 在创建自定义资源时返回的 ID。理想情况下,它还应该将该 ID 与自定义资源本身相关联。

如何做到这一点?

相关场景的示例代码:

Resources:
  CustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken:
        Fn::GetAtt: Lambda.Arn
      ID: <see-below>
  Lambda:
    Type: AWS::Lambda::Function
    Properties:
      ...

(其中ID在创建CustomResource之前不存在,但需要在创建时由Lambda的结果填充)

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-cloudformation aws-cloudformation-custom-resource


    【解决方案1】:

    你混淆了几件事。

    更新或删除自定义资源时,关联的 Lambda 函数应将现有外部资源的 ID 作为参数/属性,并相应地更新/删除该外部资源。

    这是通过PhysicalResourceId 属性处理的。创建资源时,您需要在响应中返回它。 CloudFormation 然后将此值传递给 Lambda 以进行更新或删除。

    该 ID 的内容对 CloudFormation 是不透明的,您最多可以在其中存储 1KB。因此,您可以在其中存储的内容中获得很大的创意。例如,您可以存储用于调用某些第三方网络服务的 URL。

    ID: &lt;see-below&gt;

    在这种情况下,您指定了一个属性,您将传递给自定义资源 Lambda。您将在事件的ResourceProperties 属性中找到它。您链接到的示例未显示任何自定义属性,但如果您记录调用,您将在那里看到ID

    返回与该外部资源关联的 ID

    您可能不应该返回外部资源的 ID;它应该是一个不透明的标识符。但是如果您确实想要返回它,那么您需要将Data 元素添加到自定义资源响应中。这是一个 JSON 对象,其中包含可以使用 Fn::GetAtt 检索的资源“属性”。

    有关自定义资源的更多信息,我推荐this doc,它指定了请求和响应对象中的所有字段。

    此外,如果您使用的是 cfnresponse 模块(出现在许多 AWS 官方文档中),则不应该:它依赖于 boto3 库中 requests 的“供应商”副本,并且已被弃用至少两年。在某些时候,您会发现您的模板停止工作(并且失败的自定义资源可能很难恢复)。

    【讨论】:

    • 感谢您的帮助和深入的回复。
    • 你推荐什么模块而不是cfnresponse - 也许是crhelper?此外,与 cfn-response 对应的 JavaScript 是否有同样的问题?使用 cfn-response 可以简化事情,因为我可以使用内联代码而无需打包 Lambda 代码和依赖项。
    • @GrantRoyster - 我只是直接使用requests 库。在您可以使用该资源之前,它确实需要一个构建步骤。我没有使用过等效的 JavaScript(也不知道有一个),但我相信 HTTP 库内置在 Node 运行时中,所以你应该没问题。
    猜你喜欢
    • 2021-03-09
    • 2016-06-09
    • 2015-12-25
    • 2017-07-23
    • 2016-09-03
    • 2021-03-15
    • 2021-05-11
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多