将 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" }
        }
      },

我的问题:通过映射,如何根据选择的子网获取用户数据中可用区的值?

我认为您无法在创建堆栈期间直接访问用户数据。但是你能参数化这个值并在你需要的两个地方引用这个参数吗?

这可以通过两种方式完成,具体取决于您的用例:

  1. VPCZoneIdentifier property for your AutoScalingGroup resource accepts a List of subnet-identifier strings. Alternatively, the AvailabilityZones 属性 接受 availability-zone 字符串列表。如果您只为您的 Auto Scaling 组指定一个可用区/子网,您可以确保实例将在指定的可用区内启动。

  2. 如果您的 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