如何在CloudFormation中为ECS集群VPC子网枚举可用区?
用CloudFormation自动按可用区创建ECS Fargate专属VPC及子网
核心思路:利用内置函数动态获取可用区
CloudFormation提供Fn::GetAZs内置函数,无需硬编码就能获取当前部署区域的所有可用区列表。搭配Fn::Cidr、Fn::Sub等函数,可自动为每个可用区创建对应子网。
最佳实践模板示例
以下是可直接复用的模板,会自动创建专属VPC,并为每个可用区生成一个适配Fargate的子网(示例为公有子网,支持互联网访问):
AWSTemplateFormatVersion: '2010-09-09' Description: 为ECS Fargate创建专属VPC及每个可用区对应子网 Parameters: VPCCidr: Type: String Default: 10.0.0.0/16 Description: VPC的CIDR块 SubnetCidrBits: Type: Number Default: 24 Description: 每个子网的CIDR掩码位数(从VPC Cidr中划分) Resources: # 创建专属VPC ECSFargateVPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VPCCidr EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: ECS-Fargate-VPC # 为每个可用区创建子网 ECSFargateSubnets: Type: AWS::EC2::Subnet Properties: VpcId: !Ref ECSFargateVPC CidrBlock: !Select - !Ref 'AWS::StackIndex' - !Cidr - !Ref VPCCidr - !GetAZs '' - !Ref SubnetCidrBits AvailabilityZone: !Select - !Ref 'AWS::StackIndex' - !GetAZs '' MapPublicIpOnLaunch: true # 公有子网配置,私有子网可设为false Tags: - Key: Name Value: !Sub ECS-Fargate-Subnet-${!Select [!Ref 'AWS::StackIndex', !GetAZs '']} Outputs: VPCId: Description: ECS Fargate专属VPC ID Value: !Ref ECSFargateVPC SubnetIds: Description: 所有可用区对应的子网ID列表 Value: !Join [",", !Ref ECSFargateSubnets]
模板关键部分说明
!GetAZs '':传入空字符串,自动获取当前栈部署区域的所有可用区。!Cidr:从VPC的CIDR块中,按指定掩码位数划分出与可用区数量匹配的子网CIDR列表。AWS::StackIndex:创建多实例资源时,该伪参数为每个实例分配索引(0、1、2...),实现每个可用区对应一个子网。MapPublicIpOnLaunch:若Fargate任务需访问互联网则设为true,若仅内网通信可设为false并搭配NAT网关。
额外建议
- 若需区分公有/私有子网,可复制子网资源分别配置
MapPublicIpOnLaunch,为每个可用区各创建一个公有和私有子网。 - 补充创建互联网网关、路由表等资源,完善VPC网络配置,确保Fargate任务网络连通性符合需求。
内容的提问来源于stack exchange,提问作者Garret Wilson
相关产品推荐
相关产品推荐

