将 AZ 映射到选定的子网,并将子网映射到选定的 VPC
Mapping the AZ to the selected subnet, and the subnets to the selected VPC
我正在创建一个 cloudformation 模板,用于创建一些资源,例如 EC2 实例。该模板将用于不同的 AWS 账户。
我们有 3 个帐户,一个用于测试环境,一个用于开发环境,一个用于生产环境。每个账户中有2个VPC(所有账户中的同一区域)。
我的问题是,为了正确构建资源,在创建 EC2 时,我们需要选择 VPC、同一 VPC 内的子网以及同一子网的可用区。我需要可用区,因为我将 EFS 安装在实例的 userData 中,以便实例可以连接到安装目标。
众所周知,每个子网都有一个amount target,dns是根据AZ变化的。这是我在 userData 中放置的用于挂载目标的内容:
echo "availability-zone.file-system-id.efs.aws-region.amazonaws.com:/ /efs-mount-point nfs4 nfsvers=4.1 0 0" >> /etc/fstab
我不是直接创建实例,而是通过创建启动配置和自动缩放组来创建实例。
"Launchconfig":{
"Type":"AWS::AutoScaling::LaunchConfiguration",
"Properties":{
"ImageId":{ "Fn::FindInMap":[ "AWSRegionToAMI", { "Ref":"AWS::Region" }, "AMIID" ] },
"SecurityGroups":[ { "Ref":"EcsSecurityGroup" } ],
"InstanceType": {"Ref":"InstanceType" },
"IamInstanceProfile":{ "Ref":"EC2InstanceProfile" },
"KeyName":{ "Fn::FindInMap" : [ "KeyPairMapping", {"Ref" : "EnvParam"}, "Key"] },
"UserData":{ "Fn::Base64" : {
"Fn::Join" : ["", [
"#!/bin/bash -xe\n",
"echo eu-west-1c.",{ "Fn::FindInMap" : [ "FileSystemMap", {"Ref" : "EnvParam"}, "FileSystemID"] },
".efs.",{ "Ref" : "AWS::Region" },".amazonaws.com:/ /efs-mount-target nfs defaults,vers=4.1 0 0",
" >> /etc/fstab\n"
]]}
}
}
},
"AutoScalingGroup":{
"Type":"AWS::AutoScaling::AutoScalingGroup",
"Properties":{
"VPCZoneIdentifier":{ "Ref":"SubnetID" },
"LaunchConfigurationName":{ "Ref":"Launchconfig" },
"MinSize":"1",
"MaxSize":{ "Ref":"MaxSize" },
"DesiredCapacity":{ "Ref":"DesiredCapacity" }
}
},
我的问题:通过映射,如何根据选择的子网获取用户数据中可用区的值?
我认为您无法在创建堆栈期间直接访问用户数据。但是你能参数化这个值并在你需要的两个地方引用这个参数吗?
这可以通过两种方式完成,具体取决于您的用例:
VPCZoneIdentifier
property for your AutoScalingGroup
resource accepts a List of subnet-identifier strings. Alternatively, the AvailabilityZones
属性 接受 availability-zone 字符串列表。如果您只为您的 Auto Scaling 组指定一个可用区/子网,您可以确保实例将在指定的可用区内启动。
如果您的 Auto Scaling Group 可以在多个可用区中启动实例,您可以Retrieve Instance Metadata确定实例的当前可用区,例如,通过运行以下命令实例上的 User-Data 脚本:
AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
echo "$AZ.${FileSystemId}.efs.${AWS::Region}.amazonaws.com:/ /efs-mount-point nfs4 nfsvers=4.1 0 0" >> /etc/fstab
我正在创建一个 cloudformation 模板,用于创建一些资源,例如 EC2 实例。该模板将用于不同的 AWS 账户。 我们有 3 个帐户,一个用于测试环境,一个用于开发环境,一个用于生产环境。每个账户中有2个VPC(所有账户中的同一区域)。
我的问题是,为了正确构建资源,在创建 EC2 时,我们需要选择 VPC、同一 VPC 内的子网以及同一子网的可用区。我需要可用区,因为我将 EFS 安装在实例的 userData 中,以便实例可以连接到安装目标。
众所周知,每个子网都有一个amount target,dns是根据AZ变化的。这是我在 userData 中放置的用于挂载目标的内容:
echo "availability-zone.file-system-id.efs.aws-region.amazonaws.com:/ /efs-mount-point nfs4 nfsvers=4.1 0 0" >> /etc/fstab
我不是直接创建实例,而是通过创建启动配置和自动缩放组来创建实例。
"Launchconfig":{
"Type":"AWS::AutoScaling::LaunchConfiguration",
"Properties":{
"ImageId":{ "Fn::FindInMap":[ "AWSRegionToAMI", { "Ref":"AWS::Region" }, "AMIID" ] },
"SecurityGroups":[ { "Ref":"EcsSecurityGroup" } ],
"InstanceType": {"Ref":"InstanceType" },
"IamInstanceProfile":{ "Ref":"EC2InstanceProfile" },
"KeyName":{ "Fn::FindInMap" : [ "KeyPairMapping", {"Ref" : "EnvParam"}, "Key"] },
"UserData":{ "Fn::Base64" : {
"Fn::Join" : ["", [
"#!/bin/bash -xe\n",
"echo eu-west-1c.",{ "Fn::FindInMap" : [ "FileSystemMap", {"Ref" : "EnvParam"}, "FileSystemID"] },
".efs.",{ "Ref" : "AWS::Region" },".amazonaws.com:/ /efs-mount-target nfs defaults,vers=4.1 0 0",
" >> /etc/fstab\n"
]]}
}
}
},
"AutoScalingGroup":{
"Type":"AWS::AutoScaling::AutoScalingGroup",
"Properties":{
"VPCZoneIdentifier":{ "Ref":"SubnetID" },
"LaunchConfigurationName":{ "Ref":"Launchconfig" },
"MinSize":"1",
"MaxSize":{ "Ref":"MaxSize" },
"DesiredCapacity":{ "Ref":"DesiredCapacity" }
}
},
我的问题:通过映射,如何根据选择的子网获取用户数据中可用区的值?
我认为您无法在创建堆栈期间直接访问用户数据。但是你能参数化这个值并在你需要的两个地方引用这个参数吗?
这可以通过两种方式完成,具体取决于您的用例:
VPCZoneIdentifier
property for yourAutoScalingGroup
resource accepts a List of subnet-identifier strings. Alternatively, theAvailabilityZones
属性 接受 availability-zone 字符串列表。如果您只为您的 Auto Scaling 组指定一个可用区/子网,您可以确保实例将在指定的可用区内启动。如果您的 Auto Scaling Group 可以在多个可用区中启动实例,您可以Retrieve Instance Metadata确定实例的当前可用区,例如,通过运行以下命令实例上的 User-Data 脚本:
AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone) echo "$AZ.${FileSystemId}.efs.${AWS::Region}.amazonaws.com:/ /efs-mount-point nfs4 nfsvers=4.1 0 0" >> /etc/fstab