CloudFormation中Fn::Join报错及安全组配置问题排查
分析你的CloudFormation模板错误
咱们一步一步拆解你遇到的问题:
1. 核心错误:Fn::Join 使用不当
你在 MyEC2Instance1 的 SecurityGroupIds 里用了 !Join,但这里犯了两个关键问题:
SecurityGroupIds属性本身接受列表类型,不需要把安全组ID拼接成逗号分隔的字符串,CloudFormation会直接处理列表。- 你的
Securitygroupid参数是List<AWS::EC2::SecurityGroup::Id>类型,!Ref Securitygroupid返回的是一个列表,而!Join要求第二个参数是纯字符串列表,你把一个列表和单个字符串(!Ref Lpsecurity)混在一起,格式完全不符合要求。
正确的写法应该直接传递列表,不需要 Join:
SecurityGroupIds: - !Ref Lpsecurity !Ref Securitygroupid # List类型的参数会自动展开为列表元素
如果只需要取参数列表里的第一个安全组ID,也可以这么写:
SecurityGroupIds: - !Ref Lpsecurity - !Select [0, !Ref Securitygroupid]
2. 资源定义里错误嵌入参数声明
你在 Lpsecurity 安全组的 Properties 里重复定义了 Securitygroupid 参数,这是完全错误的——参数只能在 Parameters 块里定义,资源的 Properties 里只能放该资源的合法属性(比如VpcId、GroupDescription等),这部分代码要完全删掉:
错误代码段(直接删除):
Securitygroupid: Description: enter sc Type: List<AWS::EC2::SecurityGroup::Id NoEcho: false Default: sg-05323df39f12d8034
3. 未定义的引用参数
你的模板里引用了 Vpc、Securitycab、ImageId、Subnets 这些参数,但没有在 Parameters 块里声明它们,CloudFormation会因为找不到这些参数而报错,需要补充这些参数的定义,比如:
Parameters: # 你的原有Securitygroupid参数 Securitygroupid: Description: enter sc Type: List<AWS::EC2::SecurityGroup::Id> NoEcho: false Default: sg-05323df39f12d8034 # 补充缺失的参数 Vpc: Type: AWS::EC2::VPC::Id Description: VPC ID for the security group Securitycab: Type: String Description: CIDR IP for ingress rules Default: 0.0.0.0/0 ImageId: Type: AWS::EC2::Image::Id Description: AMI ID for EC2 instance Default: ami-0c55b159cbfafe1f0 # 示例AMI,根据你的区域调整 Subnets: Type: List<AWS::EC2::Subnet::Id> Description: Subnets for EC2 instance
修正后的完整模板示例
AWSTemplateFormatVersion : 2010-09-09 Description: "simple web layer" Parameters: Securitygroupid: Description: enter sc Type: List<AWS::EC2::SecurityGroup::Id> NoEcho: false Default: sg-05323df39f12d8034 Vpc: Type: AWS::EC2::VPC::Id Description: VPC ID for the security group Securitycab: Type: String Description: CIDR IP for ingress rules Default: 0.0.0.0/0 ImageId: Type: AWS::EC2::Image::Id Description: AMI ID for EC2 instance Default: ami-0c55b159cbfafe1f0 Subnets: Type: List<AWS::EC2::Subnet::Id> Description: Subnets for EC2 instance Resources: Lpsecurity: Type: AWS::EC2::SecurityGroup Properties: VpcId: !Ref Vpc GroupDescription: Sample target security group SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: !Ref Securitycab - IpProtocol: tcp FromPort: 443 ToPort: 443 CidrIp: !Ref Securitycab MyEC2Instance1: Type: 'AWS::EC2::Instance' Properties: ImageId: !Ref ImageId InstanceType: t2.micro SubnetId: !Select [ 0, !Ref Subnets ] SecurityGroupIds: - !Ref Lpsecurity !Ref Securitygroupid
内容的提问来源于stack exchange,提问作者Ravi kiran Alapati
相关产品推荐
相关产品推荐

