2017-02-15 51 views
0

我正在创建一个创建一些资源(如EC2实例)的云信息模板。此模板将用于不同的AWS账户。 我们有3个账户,一个用于测试环境,一个用于开发环境,另一个用于生产。在每个账户中有2个VPC(所有账户中的相同区域)。将AZ映射到选定的子网,并将子网映射到选定的VPC

我的问题是,为了正确构建资源,在创建EC2时,我们需要选择VPC,同一VPC内的子网以及同一子网的可用区。我需要可用区域,因为我将EFS挂载到实例的userData中,以便实例可以连接到挂载目标。

众所周知,每个子网中都有一个目标数量,并且dns会根据AZ进行更改。以下是我放在用户数据装入目标:

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

这可以通过两种方式,来完成这取决于你的使用情况:

  1. VPCZoneIdentifier属性您AutoScalingGroup资源接受子网标识字符串列表。或者,AvailabilityZones属性接受可用性区域字符串列表。如果您只为Auto Scaling组指定单个可用区域/子网,则可以确保实例将在指定的可用区域内启动。

  2. 如果你的自动缩放集团可以启动多个可用性区域的情况下,你可以Retrieve Instance Metadata确定实例的当前可用区域,例如,通过对实例的用户数据脚本运行以下命令:

    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 
    
+0

难道是我还是在声明中的'AZ'前面忘记了'$'? – Somar

+0

Shell变量赋值通常采用[varname = value]的形式,如[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_23)所定义。 – wjordan

+0

你可以请检查这[问题](http://stackoverflow.com/questions/42270842/userdata-are-not-getting-executed-after-launching-the-instance-by-cloudformation)请谢谢你 – Somar

0

我不认为你可以在创建堆栈的过程中直接访问用户数据。但是,你可以参数化这个值并在两个你需要的地方参考这个参数吗?