代码之家  ›  专栏  ›  技术社区  ›  Yu Chen little_birdie

用于分配弹性IP的AWS EC2用户数据脚本

  •  0
  • Yu Chen little_birdie  · 技术社区  · 7 年前

    我正在尝试为专有网络创建自己的堡垒主机,并创建了一个自动缩放组,最小/最大实例数为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
    

    I've read from other StackOverflow posts 这必须在使用ASG时明确完成。

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

    enter image description here

    enter image description here

    我试图查看系统日志,查看初始化期间是否有任何错误消息,但一开始我看不到任何提示 associate-address 命令失败(内部) /var/log/cloud-init-output

    编辑:尝试调试:

    aws ec2 associate-address 那一部分,我遇到了

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

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

    有人能告诉我为什么我的用户数据关联弹性IP地址可能无法正常执行吗?

    3 回复  |  直到 7 年前
        1
  •  3
  •   John Rotenstein    7 年前

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

    #!
    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

        2
  •  3
  •   Nik Rotimi    7 年前

    您是否使用amazon提供的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}
    

        3
  •  2
  •   Pradeep Bhadani    7 年前

    看起来附加到此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": "*"
        }
    ]
    

    希望这有帮助。