如何在AWS CloudFormation中为子资源类型设置创建条件
解决方案
错误原因分析
- 尝试1:CloudFormation不支持直接在YAML数组的单个元素前添加行内条件判断,语法不生效
- 尝试2:
!If返回的是单个对象,而BackupPlanRule要求必须传入数组类型,触发类型校验报错 - 尝试3:
!If分支逻辑错误,两个分支分别只返回单个规则,没有实现条件为真时同时返回两个规则的要求
正确写法
写法1:无需重复配置(推荐)
利用AWS::NoValue伪参数,条件不满足时CloudFormation会自动删除数组中的对应元素:
Parameters: # 注意条件参数必须用String类型,允许值为true/false,不能用Boolean类型 Createbackuprule2: Type: String AllowedValues: [true, false] Default: false RuleName1: Type: String RuleName2: Type: String BackupPlanName: Type: String Resources: StorageBackupPlan: Type: AWS::Backup::BackupPlan Properties: BackupPlan: BackupPlanName: !Ref BackupPlanName BackupPlanRule: # 规则1固定存在,完整配置写在这里 - RuleName: !Ref RuleName1 # 补充规则1其他配置:ScheduleExpression、RetentionPeriod等 # 规则2仅当Createbackuprule2为true时保留 - !If - Createbackuprule2 - RuleName: !Ref RuleName2 # 补充规则2其他配置 - !Ref AWS::NoValue
写法2:全量分支返回
通过!If直接返回对应场景的完整规则数组:
Resources: StorageBackupPlan: Type: AWS::Backup::BackupPlan Properties: BackupPlan: BackupPlanName: !Ref BackupPlanName BackupPlanRule: !If - Createbackuprule2 # 条件为true时返回两个规则 - - RuleName: !Ref RuleName1 # 补充规则1所有配置 - RuleName: !Ref RuleName2 # 补充规则2所有配置 # 条件为false时仅返回规则1 - - RuleName: !Ref RuleName1 # 补充规则1所有配置,和上面分支的规则1配置完全一致
内容的提问来源于stack exchange,提问作者user9488542
相关产品推荐
相关产品推荐

