如何正确使用安全组VpcId属性并修复CloudFormation模板报错
错误原因
你遇到的报错由三个核心问题导致:
- YAML语法解析错误:你给
!Join函数标签错误添加了冒号,同时缩进不规范,导致CloudFormation将VpcId的配置解析为了Type字段的子映射(map),而非SecurityGroup的属性,触发了「map keys必须为字符串」的格式校验错误。 - 无效属性冗余:
AWS::EC2::SecurityGroup资源本身没有InstanceId属性,你额外添加的这个字段也会干扰模板解析。 - 隐性逻辑问题:即使格式修正,CloudFormation的动态引用(
{{resolve:ssm:...}})不支持通过!Join动态拼接生成,动态引用的解析优先级高于模板函数执行,拼接后的字符串不会被识别为有效的SSM参数拉取规则。
可行解决方案
直接用!Sub函数替代!Join生成SSM动态引用字符串,同时清理无效属性、规范缩进即可,修正后的代码如下:
ContainerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: "ECS Containers Security Group" VpcId: !Sub "{{resolve:ssm:/ca/config/network/vpc_id:${ParamVersion}}}" GroupName: !Sub "${Env}-${ServiceName}-sg" SecurityGroupIngress: - IpProtocol: tcp FromPort: 8080 ToPort: 8080 CidrIp: 10.49.63.0/24 - IpProtocol: tcp FromPort: 8080 ToPort: 8080 CidrIp: 10.93.0.0/16 - IpProtocol: tcp FromPort: 8080 ToPort: 8080 CidrIp: 10.97.0.0/16 - IpProtocol: tcp FromPort: 8080 ToPort: 8080 CidrIp: 10.50.128.0/21 - IpProtocol: tcp FromPort: 8080 ToPort: 8080 CidrIp: 10.50.144.0/24 - IpProtocol: tcp FromPort: 8080 ToPort: 8080 CidrIp: 172.25.0.0/16
如果你确实需要拼接复杂的SSM路径,可以先在模板参数或者Mappings中定义路径前缀,再通过!Sub统一拼接,避免使用!Join处理动态引用。
内容的提问来源于stack exchange,提问作者Gabriel Pulga
相关产品推荐
相关产品推荐

