2017-02-15 25 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

我不認爲你可以在創建堆棧的過程中直接訪問用戶數據。但是,你可以參數化這個值並在兩個你需要的地方參考這個參數嗎?