【问题标题】:aws cloudformation "NetworkInterfaces" in Autoscaling launchconfig group自动缩放启动配置组中的 aws cloudformation“NetworkInterfaces”
【发布时间】:2016-10-02 06:10:24
【问题描述】:

在 aws cloudformation 中,如何在 Autoscaling launchconfig 组中添加“NetworkInterfaces”,因为我想配置每个启动的实例并且我需要“NetworkInterfaces”与 AWS::EC2::Instance 相同?

【问题讨论】:

  • 您能否详细说明您要完成的工作?
  • 我很好奇是否需要为自动缩放组中启动的每个实例添加网络接口。但后来发现我不需要。谢谢你的回复,埃德温。
  • @Edwin 当您希望 ASG 的单例成员使用相同的网络接口重新启动时,就会出现这种情况。

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

我目前使用的解决方案是确保每个实例都使用允许包含策略的IAM Instance Profile 启动

"PolicyDocument": {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:CreateTags",
                "ec2:DescribeSubnets",
                "ec2:AttachNetworkInterface",
                "ec2:CreateNetworkInterface",
                "ec2:ModifyNetworkInterfaceAttribute"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

用于创建AutoScalingGroupLaunchConfiguration 的My Cloud Formation 模板接收SubnetsSecurity Groups 的参数以附加到每个附加的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 属性

  1. 确保安装了 awscli
  2. 通过解析instance metadata 身份文件设置要使用的区域
  3. instance metadata获取实例ID
  4. instance metadata获取实例的可用区
  5. 使用 awscli describe-subnets 调用从传入的子网中找到第一个与我的实例 AZ 匹配的子网
  6. 在我选择的子网中创建一个网络接口,并使用 awscli create-network-interface 调用向其中添加安全组
  7. 使用awscli create-tags 呼叫标记我的ENI
  8. 使用awscli attach-network-interface 调用将ENI 附加到我的实例
  9. 使用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)"
           ]
        ]
      }
    }

如果您不想将 Subnets 传递到 Cloud Formation 模板,您可以尝试通过在 awscli describe-subnets 调用中向 --query 添加标签来查找它们,前提是您的基础架构允许您识别它们方式。

【讨论】:

  • 这种方法不需要访问密钥 ID 和秘密访问密钥来在 EC2 实例中执行“aws ec2 attach-network-interface”命令吗?
  • 如果您使用的是 IAM 实例配置文件,那么这些配置文件不需要托管在 EC2 实例中 - 身份管理和授权由 Ec2 和 IAM 处理
猜你喜欢
  • 2019-04-04
  • 2017-01-30
  • 2019-02-27
  • 2021-11-26
  • 2012-06-19
  • 2016-07-28
  • 2018-01-29
  • 2020-10-26
  • 2021-03-22
相关资源
最近更新 更多