添加CloudFormation Transform段为何导致规则断言停止执行?
CloudFormation添加AWS::CodeDeployBlueGreen Transform后断言规则失效的原因
问题场景
我有一个不含Transform段的CloudFormation模板,其验证断言规则可正常执行:当BlueGreen与Lambda参数值相等时,会显示AssertDescription,且CloudFormation控制台无法点击“下一步”。模板代码如下:
AWSTemplateFormatVersion: "2010-09-09" Parameters: BlueGreen: Type: String Default: Yes AllowedValues: - Yes - No Lambda: Type: String Default: No AllowedValues: - Yes - No Rules: ValidateBlueGreenOrLambda: Assertions: - AssertDescription: "Select BlueGreen or Lambda" Assert: !Not [!Equals [!Ref BlueGreen, !Ref Lambda]] Resources: MyBucket: Type: AWS::S3::Bucket
但当我为模板添加Transform: "AWS::CodeDeployBlueGreen"段后,规则断言不再执行,控制台可继续创建堆栈。请问为何添加Transform段会导致规则断言停止执行?
原因分析
当你添加AWS::CodeDeployBlueGreen Transform时,CloudFormation会将原模板转换为嵌套栈结构,以此实现蓝绿部署的资源切换逻辑。在这个转换过程中,原模板中的Rules段不会被纳入最终执行的有效模板中——该Transform的设计聚焦于蓝绿部署的资源编排,默认会跳过原模板的参数断言规则验证。
具体来说,CloudFormation在处理带有AWS::CodeDeployBlueGreen的模板时,会优先执行Transform的模板转换逻辑,原模板的Rules参数验证步骤会被直接忽略,导致你设置的断言规则不再生效。
替代方案
如果需要保留参数验证逻辑,可以尝试以下两种方式:
- 将
Rules段的验证逻辑迁移到蓝绿部署的目标栈模板中(即被AWS::CodeDeployBlueGreen引用的实际资源模板); - 通过Lambda自定义资源在堆栈创建/更新前实现参数验证逻辑,以此替代原生的
Rules断言。
内容的提问来源于stack exchange,提问作者RobertFrenette
相关产品推荐
相关产品推荐

