【问题标题】:AWS EC2 User Data script to allocate Elastic IP用于分配弹性 IP 的 AWS EC2 用户数据脚本
【发布时间】:2019-05-23 23:26:51
【问题描述】:

我正在尝试为 VPC 创建自己的堡垒主机,并创建了一个最小/最大实例为 1 的自动扩展组。在我的启动配置中,我为 ec2 用户数据指定以下内容:

#!

INSTANCE_ID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`

aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id eipalloc-my-eip-id --allow-reassociation

此用户数据的目标是立即将弹性 IP 地址与我新创建的 EC2 实例关联 - I've read from other StackOverflow posts,这在使用 ASG 时必须明确完成。

但是,在 ASG 实例启动并完成初始化后,我仍然在我的控制台输出中看不到该实例的任何弹性 IP:

我已确认该实例确实正在使用用户数据:

我试图查看系统日志内部以查看初始化期间是否有任何错误消息,但起初我看不到任何表明associate-address 命令失败的信息(在/var/log/cloud-init-output 内部)。

编辑:尝试调试:

但是,我随后手动将弹性 IP 与我的实例关联,通过 SSH 连接,并尝试运行上面的用户数据命令。有趣的是,当我到达aws ec2 associate-address 部分时,我遇到了

无法找到凭据。您可以通过运行配置凭据 “aws 配置”。

这似乎是问题的根源 - 我的 AWS 配置文件未配置。但是,我一直认为默认的 AWS 实例配置文件是为您设置的,当实例完成初始化时可以访问 AWS CLI。

谁能指出为什么我的用户数据关联弹性 IP 地址可能无法正常执行?

【问题讨论】:

    标签: amazon-web-services amazon-ec2


    【解决方案1】:

    看起来附加到此 EC2 实例的实例配置文件没有执行上述任务的权限。

    参考https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-ec2-console.html#ex-eip

    您能否确保您的实例配置文件允许以下操作?

    ec2:AllocateAddress: To allocate an Elastic IP address.
    
    ec2:ReleaseAddress: To release an Elastic IP address.
    
    ec2:AssociateAddress: To associate an Elastic IP address with an instance or a network interface.
    
    ec2:DescribeNetworkInterfaces and ec2:DescribeInstances: To work with the Associate address screen. The screen displays the available instances or network interfaces to which you can associate an Elastic IP address.
    
    ec2:DisassociateAddress: To disassociate an Elastic IP address from an instance or a network interface.
    

    示例策略如下所示:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeAddresses",
                "ec2:AllocateAddress",
                "ec2:DescribeInstances",
                "ec2:AssociateAddress"
            ],
            "Resource": "*"
        }
    ]
    

    }

    希望这会有所帮助。

    【讨论】:

    • 就是这样。这是使用#!(来自另一个答案)和允许我的 IAM 角色的正确地址关联操作的组合。
    【解决方案2】:

    用户数据脚本必须以#! 开头才能被识别为脚本。例如:

    #!
    INSTANCE_ID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`
    
    aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id eipalloc-xxx --allow-reassociation
    

    您可以查看生成的登录:/var/log/cloud-init-output.log

    【讨论】:

      【解决方案3】:

      您是否使用亚马逊提供的 AMI 运行您的 EC2 实例?

      如果是这样,配置文件确实应该设置。 但是,我们注意到您的个人资料中未设置默认区域。因此,在运行aws cli 命令时,您需要使用--region <your region> 指定区域或设置AWS_DEFAULT_REGION 环境变量。

      我们使用以下脚本在启动时为我们的服务器配置 EIP,作为 CloudFormation 模板的一部分:

      #!/bin/bash
      INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
      MAXWAIT=3
      ALLOC_ID=<your eip allocation id>
      AWS_DEFAULT_REGION=<your region>
      
      # Make sure the EIP is free
      echo "Checking if EIP with ALLOC_ID[$ALLOC_ID] is free...."
      ISFREE=$(aws ec2 describe-addresses --allocation-ids $ALLOC_ID --query Addresses[].InstanceId --output text)
      STARTWAIT=$(date +%s)
      while [ ! -z "$ISFREE" ]; do
          if [ "$(($(date +%s) - $STARTWAIT))" -gt $MAXWAIT ]; then
              echo "WARNING: We waited 30 seconds, we're forcing it now."
              ISFREE=""
          else
              echo "Waiting for EIP with ALLOC_ID[$ALLOC_ID] to become free...."
              sleep 3
              ISFREE=$(aws ec2 describe-addresses --allocation-ids $ALLOC_ID --query Addresses[].InstanceId --output text)
          fi
      done
      
      # Now we can associate the address
      echo Running: aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOC_ID --allow-reassociation}
      aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOC_ID --allow-reassociation}
      

      我们添加了检查 EIP 是否空闲的部分,因为它在自动缩放组中使用,我们注意到有时 EIP 仍在使用中,即使旧实例已经终止并且新实例已终止在运行 userdata 脚本时。

      【讨论】:

      • 不错的脚本!请参阅已接受的答案 - 我忘记在 ASG 的启动配置中为我的实例分配 IAM 角色。但是检查免费 EIP 地址是一个很好的选择!
      • 啊,很高兴听到您通过实例角色解决了这个问题!
      猜你喜欢
      • 2013-11-10
      • 2021-09-03
      • 2011-08-12
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多