每当我更新我的 CFN 堆栈时运行自定义资源

Posted

技术标签:

【中文标题】每当我更新我的 CFN 堆栈时运行自定义资源【英文标题】:Run Custom resource whenever i update my CFN Stack 【发布时间】:2019-04-17 10:41:58 【问题描述】:

我有一个自定义资源,用于从 API 网关获取 API 密钥并将其作为标头发送到 Cloudfront。当我创建堆栈时,我的custom:resource 正在触发,因为它是第一次创建逻辑 ID。但是当我更新堆栈时(即更改 API KEY 名称)然后AWS::ApiGateway::ApiKey 类型的 API 密钥资源将创建一个新的逻辑 ID,同时又创建一个新的 API 密钥,此时我的 custom:resource 没有调用,因为它具有相同的逻辑 ID,因为我的云端有旧的 API 密钥而不是新的。

每次我的堆栈发生更新时,有没有办法调用我的custom:resource? 作为一种解决方法,我将更改custom:resourceLogical Id 以在我更新堆栈中的资源时触发它。但这并不难,因为logicalId 被共享为对许多资源的引用。

顺便说一句,我的自定义资源附加到 lambda 函数。我什至尝试更改 Version 字段并尝试向属性字段添加值(即堆栈名称、参数等),但它仍然没有调用。


   "AWSTemplateFormatVersion" : "2010-09-09",
   "Resources" : 
      "MyFrontEndTest" : 
         "Type": "Custom::PingTester",
         "Version" : "1.0", -->Even changed the version to 2.0 
         "Properties" : 
            "ServiceToken": "arn:aws:lambda:us-east-1:*****",
            "InputparameterName" :  "MYvalue" -->Added this field
         
      
   

谢谢 任何帮助表示赞赏

【问题讨论】:

这里是一些用于构建自定义资源的出色示例代码:GitHub - stelligent/cloudformation-custom-resources 它展示了如何处理更新,这可能会对您有所帮助。 我可以在***.com/questions/41452274/…的帮助下解决问题 @Private 您采用了哪种方法?我陷入了类似的境地。你是如何让自定义资源每次都创建/更新的?提前致谢? @Developer 只需点击我在上述评论中提到的链接即可。正是它帮助我解决了这个问题。 我尝试遵循 wjordan 的回答,但是因为我的模板文件是从 CodePipeline 部署的,所以我无法将随机字符串/数字作为参数传递给我的 cloudformation 模板。每次运行代码管道时都会部署模板。但我不确定如何将参数从代码管道传递给模板文件 【参考方案1】:

让自定义资源在堆栈更新时执行 lambda 的一个技巧是配置自定义资源以将所有堆栈参数传递给 lambda 函数。如果堆栈更新时任何参数发生更改,自定义资源将更改并触发 lambda。只需忽略 lambda 事件数据中不需要的键。当仅更新模板时,这不会对场景做任何事情。

【讨论】:

以上是关于每当我更新我的 CFN 堆栈时运行自定义资源的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AWS Lambda CFN S3 响应在删除事件时返回 403?

Gradle插件开发 APK瘦身资源自定义7z压缩

Laravel 5.5 资源自定义 show($id) 方法

S3 错误:使用嵌套堆栈部署 CFN 模板时访问被拒绝

spring-boot 静态资源自定义配置

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