CloudFormation自定义资源Lambda首次栈更新误触发Create逻辑
原因说明
CloudFormation 自定义资源的RequestType=Create触发规则,从来都不是和「栈执行create-stack操作」绑定的,判断维度是自定义资源自身是否为首次在栈中被创建。
你往已存在的栈里第一次添加这个自定义资源时,对CloudFormation而言这个资源是栈资源清单里不存在的全新资源,不管当前栈操作是创建还是更新,只要是首次部署这个资源,就会向绑定的Lambda发送Create类型的请求,这是完全符合产品定义的正常行为,不是配置错误。
这也能解释你观察到的现象:后续再执行栈更新时,这个自定义资源已经存在于栈资源列表中,只要不触发资源的删除重建,就不会再收到Create请求。
逻辑设计误区
你当前的代码把「收到Create类型请求」等价于「栈首次创建」,这个对应关系是不成立的,以下场景都会让自定义资源收到Create请求,和栈是不是第一次创建无关:
- 栈首次创建阶段,自定义资源随栈一起第一次部署
- 栈更新阶段,新增了之前不存在的自定义资源(就是你遇到的场景)
- 栈更新阶段,自定义资源的属性修改触发了资源替换(比如修改逻辑ID、修改了需要重建资源的属性),替换后的新资源会收到Create请求,同时旧资源收到Delete请求
调整建议
如果你的业务要求逻辑仅在整个栈第一次创建时运行,后续任何栈更新操作(哪怕是第一次新增这个自定义资源)都不能触发,不能仅靠RequestType做判断,可以参考以下方案:
- 在栈模板里给自定义资源加一个仅在栈首次创建时生成、后续永远不会变更的固定参数(比如栈创建时间戳、固定初始化标记),业务逻辑执行前先校验这个标记
- 在Lambda逻辑里通过请求携带的
StackId查询对应栈的元数据,判断当前操作是否发生在栈创建阶段
如果你的业务预期本来就是「这个自定义资源自身第一次被创建的时候执行逻辑,后续该资源的更新、删除都不处理」,那你现在遇到的现象就是完全符合预期的,不需要做调整——第一次把资源加到已有栈的更新操作触发Create,本身就是自定义资源的标准行为。
内容的提问来源于stack exchange,提问作者Varun Gawande
相关产品推荐
相关产品推荐

