CloudFormation Fn::Sub参数错误:ECS容器环境变量配置问题
问题排查与修复方案
错误核心原因
你的!Sub函数使用格式不符合CloudFormation要求:!Sub的数组语法中,第二个元素必须是单一的键值映射对象(所有变量放在同一个结构里),而不是拆分多个独立的列表项(每个变量单独用-开头)。当前写法把每个变量拆成了单独的数组元素,导致CloudFormation无法识别正确的参数结构,触发报错。
修正后的代码
- Name: 'DB_URL' Value: !Sub - "mysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}" - DB_USER: application_user DB_PASSWORD: "{{resolve:ssm-secure:/${Prefix}/database/application_user/password}}" DB_NAME: "{{resolve:ssm:/${Prefix}/DB_NAME}}" DB_PORT: "{{resolve:ssm:/${Prefix}/DB_PORT}}" DB_HOST: "{{resolve:ssm:/${Prefix}/DB_HOST}}" Prefix: !Ref ParameterStorePrefix
关键说明
- 所有需要替换的变量必须放在
!Sub数组的第二个元素中,作为一个统一的YAML对象(保持缩进对齐,无需额外的-前缀)。 {{resolve:ssm}}和{{resolve:ssm-secure}}可以在!Sub的映射值中直接使用,CloudFormation会先解析!Ref ParameterStorePrefix,替换${Prefix}占位符后,再解析SSM参数值。
额外优化建议
如果你的数据库凭证存储在Secrets Manager而非SSM Secure String,可以改用{{resolve:secretsmanager}},示例:
DB_PASSWORD: "{{resolve:secretsmanager:/${Prefix}/db-creds:SecretString:password}}"
内容的提问来源于stack exchange,提问作者Sadiq hassan
相关产品推荐
相关产品推荐

