You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:52:47