aws cloudformation で、起動するすべてのインスタンスを構成する必要があるため、Autoscaling launchconfig グループに「NetworkInterfaces」を追加する方法と、「NetworkInterfaces」が同じ AWS::EC2::Instance に存在する必要がありますか?
2368 次
1 に答える
1
私が現在使用している解決策は、すべてのインスタンスが、ポリシーを含むことを許可するIAM インスタンス プロファイルで起動されるようにすることです。
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:CreateTags",
"ec2:DescribeSubnets",
"ec2:AttachNetworkInterface",
"ec2:CreateNetworkInterface",
"ec2:ModifyNetworkInterfaceAttribute"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
AutoScalingGroupとLaunchConfigurationを作成するための My Cloud Formation Template は、追加の各ENIにアタッチするサブネットとセキュリティ グループのパラメーターを受け取ります。
"SecondaryNICSubnetIds":{
"Type" : "CommaDelimitedList",
"Description" : "Ensure that the spread of Availability Zones for these Subnets matches the SubnetIds used to create Instances, as when creating a Secondary ENI it must exist in the same AZ as the Instance"
},
"SecondaryNICSecurityGroupIds":{
"Type" : "CommaDelimitedList",
"Description" : "Security Groups to associate to the Secondary ENI"
},
次に、LaunchConfigurationにはUserDataプロパティが含まれています。
- awscli がインストールされていることを確認します
- インスタンス メタデータID ドキュメントを解析して使用するリージョンを設定します
- インスタンス メタデータからインスタンス ID を取得します
- インスタンスのメタデータからインスタンスの可用性ゾーンを取得します
- 渡されたサブネットから、 awscli describe-subnets呼び出しを使用して、インスタンス AZ に一致する最初のものを見つけます
- 選択したサブネットにネットワーク インターフェイスを作成し、 awscli create-network-interface呼び出しを使用してそれにセキュリティ グループを追加します
- awscli create-tags呼び出しを使用してENIにタグを付ける
- awscli attach -network-interface呼び出しを使用してENIをインスタンスにアタッチします
- アタッチメントを変更して、 modify-network-interface-attribute呼び出しを使用してインスタンスの終了時にENIを削除します
"UserData": {
"Fn::Base64" : {
"Fn::Join": [ "\n",
[
"#!/bin/bash -xe",
"sudo apt-get install -y awscli",
"export AWS_DEFAULT_REGION=$(curl -sS http://169.254.169.254/latest/dynamic/instance-identity/document | python -c 'import sys, json; print(json.load(sys.stdin)[\"region\"])')",
"INSTANCE_ID=$(curl -sS http://169.254.169.254/latest/meta-data/instance-id)",
"AZ=$(curl -sS http://169.254.169.254/latest/meta-data/placement/availability-zone)",
"echo Availability Zone: ${AZ}",
{"Fn::Sub":[
"SUBNET_ID=$(aws ec2 describe-subnets --subnet-ids ${SubnetNetIds} --filters Name=availabilityZone,Values=${!AZ} --query 'Subnets[0].SubnetId' --output text)",
{"SubnetNetIds": {"Fn::Join": [" ", {"Ref": "SecondaryNICSubnetIds"} ] }}
]},
"echo Subnet Id: ${SUBNET_ID}",
{"Fn::Sub":[
"ENI_ID=$(aws ec2 create-network-interface --subnet ${!SUBNET_ID} --description 'Secondary ENI' --groups ${SecurityGroups} --query 'NetworkInterface.NetworkInterfaceId' --output text)",
{"SecurityGroups": {"Fn::Join": [" ", {"Ref": "SecondaryNICSecurityGroupIds"}]} }
]},
"echo ENI ID: ${ENI_ID}",
"aws ec2 create-tags --resources ${!ENI_ID} --tags Key=Some,Value=Tag",
"ATTACHMENT_ID=$(aws ec2 attach-network-interface --network-interface-id ${ENI_ID} --instance-id ${INSTANCE_ID} --device-index 1 --output text)",
"echo Attachment ID: ${ATTACHMENT_ID}",
"echo Delete On Termination: $(aws ec2 modify-network-interface-attribute --network-interface-id ${ENI_ID} --attachment AttachmentId=${ATTACHMENT_ID},DeleteOnTermination=true --output text)"
]
]
}
}
サブネットを Cloud Formation テンプレートに渡したくない場合は--query
、awscli describe-subnets呼び出しにタグを追加して検索を試みることができます (インフラストラクチャでこの方法でサブネットを識別できる場合)。
于 2016-10-01T21:27:39.173 に答える