如何在CloudFormation的Conditions块中实现Fn::Contains等效功能?
在CloudFormation Conditions中实现CommaDelimitedList的包含判断
因为CloudFormation的Fn::Contains只能在Rules块里使用,没法直接放到Conditions中判断列表是否包含某个选项,这里给你一个无需新增布尔参数、不用切换Terraform的替代方案——通过字符串拼接+拆分对比实现等效判断。
核心思路
把传入的CommaDelimitedList参数转成首尾都带逗号的格式化字符串(比如将OptionA,OptionB转换为,OptionA,OptionB,),再用目标选项的包裹版本(比如,OptionA,)作为分隔符拆分该字符串。如果拆分后的第一个元素和原字符串完全一致,说明列表里没有匹配项;反之则说明包含目标选项,最后用Fn::Not取反得到最终布尔判断结果。
完整YAML示例
1. 定义参数
Parameters: OptionParameterList: Type: CommaDelimitedList Description: 输入要启用的选项,用逗号分隔,例如OptionA,OptionB
2. 编写Conditions判断
以判断是否包含OptionA为例:
Conditions: IsOptionAEnabled: Fn::Not: - Fn::Equals: - !Select [0, !Split [",OptionA,", !Sub ",${OptionParameterList},"]] - !Sub ",${OptionParameterList},"
3. 关联到Thing资源
需要控制创建的Thing资源直接绑定这个Condition即可:
Resources: OptionAThing: Type: AWS::IoT::Thing Condition: IsOptionAEnabled Properties: ThingName: OptionAThing # 填写你的Thing资源其他属性
批量处理多个选项
要判断其他选项(比如OptionB),直接复制Condition块并替换目标选项值即可:
Conditions: IsOptionAEnabled: Fn::Not: - Fn::Equals: - !Select [0, !Split [",OptionA,", !Sub ",${OptionParameterList},"]] - !Sub ",${OptionParameterList}," IsOptionBEnabled: Fn::Not: - Fn::Equals: - !Select [0, !Split [",OptionB,", !Sub ",${OptionParameterList},"]] - !Sub ",${OptionParameterList},"
注意事项
- 选项名称不能包含逗号,因为
CommaDelimitedList类型本身不允许元素带逗号 - 字符串匹配是大小写敏感的,传入的选项名称要和判断逻辑里的完全一致
内容的提问来源于stack exchange,提问作者Ti Strga
相关产品推荐
相关产品推荐

