【问题标题】:SubnetIds in CloudFormationCloudFormation 中的子网 ID
【发布时间】:2020-11-23 19:58:56
【问题描述】:
在 CloudFormation 堆栈中,我正在创建一个接口类型 VPC 端点,它需要 SubnetIds 作为参数之一。我想在配置 VPC 和子网的同一 CloudFormation 堆栈中配置 VPC 端点。
问题是 - 如何为在同一堆栈中创建的子网引用 SubnetIds? Subnet 的内部函数 GetAtt 不支持检索子网 ID。
【问题讨论】:
标签:
amazon-web-services
amazon-cloudformation
amazon-vpc
【解决方案1】:
您可以在您的子网资源上使用Ref intrinsic function,如下例所示。
除了属性,每个 CloudFormation 资源还可以支持 Ref 值,对于子网,这是子网 ID。
Resources:
mySubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: myVPC
CidrBlock: 10.0.0.0/24
AvailabilityZone: "us-east-1a"
Ec2Instance:
Type: AWS::EC2::Instance
Properties:
SubnetId:
Ref: mySubnet
只需对附加资源使用模板中的Ref 函数,这还将创建依赖关系,防止资源在依赖子网时被创建。
【解决方案2】:
需要 SubnetIds 作为参数之一。
如果您将子网 ID 作为模板参数的一部分,您可以使用带有List<AWS::EC2::Subnet::Id> 类型的参数:
Parameters:
Subnets:
Type: List<AWS::EC2::Subnet::Id>
然后在其余代码中,可以引用整个列表或单个子网,如下所示:
!Ref Subnets # entire list
!Select [0, !Ref Subnets] # first subnet provided in the list
如果您在模板中创建子网:
Resources:
MySubnet1:
Type: AWS::EC2::Subnet
Properties:
# properties
MySubnet2:
Type: AWS::EC2::Subnet
Properties:
# properties other subnet
然后要引用他们的id,可以使用Ref whichreturnssubnet id:
!Ref MySubnet1
!Ref MySubnet2
但是,如果您想在模板中使用在 CloudFormation 之外定义的现有子网,则可以将现有子网导入堆栈:
但这不是自动过程。您必须先手动修改模板才能使其正常工作。