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

时间:2018-12-25 05:15:38

标签: amazon-web-services amazon-ec2

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

  

#!

     

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

     

aws ec2关联地址--instance-id $ INSTANCE_ID --allocation-id   eipalloc-my-eip-id --allow-reassociation

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

但是,在ASG实例启动并完成初始化之后,在该实例的控制台输出中我仍然看不到任何Elastic IP: enter image description here 我已经确认实例确实使用了用户数据: enter image description here 我试图查看系统日志,以查看初始化期间是否有任何错误消息,但是起初我看不到任何暗示self.player.seek(to: CMTime.zero)命令失败的信息(在 User { . . . , PostHistory{ Post1: [timestamp], Post2: [timestamp] . . . }, } 内部)。

编辑:尝试调试:

但是,我然后手动将Elastic IP与我的实例SSHed关联,并尝试运行上面的用户数据命令。有趣的是,当我进入associate-address部分时,我遇到了

  

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

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

有人能指出我为什么与弹性IP地址关联的用户数据可能无法正确执行的方向吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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": "*"
    }
]

}

希望这会有所帮助。

答案 2 :(得分:1)

您是否正在使用Amazon提供的AMI运行EC2实例? 如果是这样,应该确实设置概要文件。 但是,我们注意到您的个人资料中未设置默认区域。因此,在运行aws cli命令时,您将需要使用--region来指定区域,或者设置AWS_DEFAULT_REGION环境变量。

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

#!/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脚本时。