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

在AWS CloudFormation中,能否让AWS根据VPC CIDR与子网大小自动分配CIDR块?

自动分配子网CIDR的解决方案

当然有办法,CloudFormation内置的Fn::Cidr函数可以直接从VPC的CIDR范围内自动划分出符合你要求的子网块,彻底告别手动静态声明的麻烦和错误。

具体实现

以下是完整的模板片段示例,假设你的VPC资源已经声明:

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: !Sub "${DomainName}-vpc"

  SubnetPublic:
    Type: AWS::EC2::Subnet
    Properties:
      # 核心逻辑:用Fn::Cidr自动生成/29规格的子网CIDR
      CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 1, 29]]
      VpcId: !Ref VPC
      MapPublicIpOnLaunch: True
      Tags:
        - Key: Name
          Value: !Sub "${DomainName}-public"

关键函数说明

  • !Cidr是CloudFormation的内置函数,三个参数分别对应:

    1. 基础CIDR范围:用!GetAtt VPC.CidrBlock直接引用VPC的CIDR,不用硬编码
    2. 要生成的子网数量:这里填1,仅生成一个子网
    3. 子网前缀长度:你需要支持8台主机,对应前缀长度为29(即/29的CIDR块)
  • !Select [0, ...]:!Cidr返回的是一个数组(比如["10.0.0.0/29"]),用这个函数取出数组的第一个元素作为当前子网的CIDR。

如果需要创建多个同规格的子网,只需调整子网数量参数,并用不同索引取结果即可:

# 一次性生成3个/29的子网
SubnetPublic1:
  Type: AWS::EC2::Subnet
  Properties:
    CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 3, 29]]
    VpcId: !Ref VPC
    MapPublicIpOnLaunch: True
    Tags:
      - Key: Name
        Value: !Sub "${DomainName}-public-1"

SubnetPublic2:
  Type: AWS::EC2::Subnet
  Properties:
    CidrBlock: !Select [1, !Cidr [!GetAtt VPC.CidrBlock, 3, 29]]
    VpcId: !Ref VPC
    MapPublicIpOnLaunch: True
    Tags:
      - Key: Name
        Value: !Sub "${DomainName}-public-2"

SubnetPublic3:
  Type: AWS::EC2::Subnet
  Properties:
    CidrBlock: !Select [2, !Cidr [!GetAtt VPC.CidrBlock, 3, 29]]
    VpcId: !Ref VPC
    MapPublicIpOnLaunch: True
    Tags:
      - Key: Name
        Value: !Sub "${DomainName}-public-3"

这种方式生成的子网CIDR会按顺序自动划分,不会出现重叠,完全满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:05:18