如何通过条件判断在AWS SSM中创建同键不同值的参数?
CloudFormation模板修正方案:根据环境和区域设置SSM参数
原模板存在的语法问题
- 参数
AccountEnv的Default字段格式错误,注释需用#标识,且字符串需正确包裹 - Conditions中的区域值未加双引号,CloudFormation要求字符串类型必须用引号包裹
- Mappings属于模板顶级元素,原模板错误嵌套在Conditions下,缩进层级错误
- 资源
ROSALOGGROUPDev1/ROSALOGGROUPDev2缩进层级错误,需作为顶级资源存在 !If函数使用不符合语法规范,需嵌套在Properties属性内部- 创建两个同名SSM参数会引发冲突(同一区域内参数名称唯一)
!FindInMap函数中存在多余引号,导致语法解析失败
修正后的完整模板
Parameters: AccountEnv: Type: 'AWS::SSM::Parameter::Value<String>' Default: '/account/environment' # 该参数存储环境类型(development/systems-integration/production) Conditions: IsFirstRegion: !Equals [!Ref "AWS::Region", "us-east-1"] IsSecondRegion: !Equals [!Ref "AWS::Region", "us-west-1"] Mappings: DomainMap: development: firstRegion: "local-application-logs" secondRegion: "local-2d-application-logs" systems-integration: firstRegion: "local-si-application-logs" secondRegion: "local2s-application-logs" production: firstRegion: "local1p-application-logs" secondRegion: "local2p-application-logs" Resources: LogGroupNameSSMParam: Type: AWS::SSM::Parameter Properties: Name: "local/logs/loggroupname" Type: "String" Value: !If - IsFirstRegion - !FindInMap [DomainMap, !Ref AccountEnv, firstRegion] - !FindInMap [DomainMap, !Ref AccountEnv, secondRegion] Description: "存储对应环境和区域的日志组名称"
修正逻辑说明
- 修复所有语法错误:调整缩进层级、补全字符串引号、修正注释格式、移除多余引号
- 合并为单个SSM参数资源:避免同名参数冲突,通过
!If函数根据当前区域动态选择映射值 - 保持逻辑完整性:通过Mappings维护不同环境、不同区域对应的日志组名称,便于后续维护
- 标准化命名:将
IssecondRegion改为IsSecondRegion,保持命名一致性
内容的提问来源于stack exchange,提问作者Chintamani
相关产品推荐
相关产品推荐

