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

CloudFormation模板创建栈报错:安全组与子网分属不同网络

解决CloudFormation中安全组与子网不属于同一网络的错误

嘿,这个错误我之前帮人排查过好多次啦,本质就是你指定的安全组sg-xxxxx和子网subnet-xxxxx不在同一个VPC里——毕竟安全组是绑定特定VPC的资源,子网也属于某个VPC,两者不配对的话,AWS肯定不让你把实例放进去呀。

从你给出的模板片段来看,你已经创建了自定义VPC TwitterappVPC,那问题大概率出在这两个方向:要么你用的安全组是默认VPC或者其他VPC里的,要么你引用的子网和这个VPC不匹配。

具体解决方案

1. 模板内统一创建同VPC的安全组和子网

如果你的子网和安全组都打算通过这个CloudFormation栈创建,那一定要把它们都关联到TwitterappVPC上,示例代码如下:

"Resources" : {
  "TwitterappVPC": {
    "Type": "AWS::EC2::VPC",
    "Properties" : {
      "CidrBlock" : "10.0.0.0/16",
      "EnableDnsSupport" : "true",
      "EnableDnsHostnames": "true"
    }
  },
  "SwarmNodeSubnet": {
    "Type": "AWS::EC2::Subnet",
    "Properties": {
      "VpcId": {"Ref": "TwitterappVPC"},
      "CidrBlock": "10.0.1.0/24",
      "AvailabilityZone": "us-east-1a" // 替换成你需要的可用区
    }
  },
  "SwarmSecurityGroup": {
    "Type": "AWS::EC2::SecurityGroup",
    "Properties": {
      "GroupDescription": "Docker Swarm节点通信安全组",
      "VpcId": {"Ref": "TwitterappVPC"},
      "SecurityGroupIngress": [
        {
          "IpProtocol": "tcp",
          "FromPort": 22,
          "ToPort": 22,
          "CidrIp": "0.0.0.0/0"
        },
        {
          "IpProtocol": "tcp",
          "FromPort": 2377,
          "ToPort": 2377,
          "CidrIp": "10.0.0.0/16" // 允许VPC内节点通信
        }
      ]
    }
  },
  "SwarmNodeInstance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "InstanceType": "t2.micro",
      "ImageId": "ami-0c55b159cbfafe1f0", // 替换成你所在区域的合适AMI
      "SubnetId": {"Ref": "SwarmNodeSubnet"},
      "SecurityGroupIds": [{"Ref": "SwarmSecurityGroup"}]
    }
  }
}

这里的关键就是子网和安全组都通过{"Ref": "TwitterappVPC"}绑定到同一个VPC,之后实例引用这两个资源,就不会出现跨网络的问题了。

2. 引用现有资源时验证VPC一致性

如果你要使用已经存在的子网或安全组,先手动确认它们的VPC是否一致:

  • 登录AWS控制台,进入EC2控制台的「安全组」页面,找到sg-xxxxx,查看它的VPC ID
  • 再进入「子网」页面,找到subnet-xxxxx,查看它的VPC ID
  • 如果两者的VPC ID不一样,要么把其中一个资源迁移到同一个VPC,要么在模板里创建对应VPC下的新资源

3. 修正模板中外部资源的引用

如果你的模板里引用了外部子网(比如用Fn::ImportValue或者直接写死子网ID),而安全组是模板内创建的,那要确保安全组的VpcId和现有子网的VPC完全匹配。比如现有子网属于VPC vpc-123456,那安全组的配置要改成这样:

"SwarmSecurityGroup": {
  "Type": "AWS::EC2::SecurityGroup",
  "Properties": {
    "GroupDescription": "Docker Swarm节点通信安全组",
    "VpcId": "vpc-123456", // 这里填写现有子网所属的VPC ID
    // 其他安全组规则...
  }
}

总的来说,核心原则就是安全组和子网必须属于同一个VPC,不管是模板内创建的还是引用外部的,只要验证并保证这一点,这个错误就能解决啦。

内容的提问来源于stack exchange,提问作者Quinten Scheppermans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:54:07