amazon:在VPC中自动分配弹性ip

amazon: assign elastic ip in VPC automatically

我有一个 VPC。现在我有一个脚本可以创建 ec2-instances 并配置它们。该配置取决于安装期间的 public IP。问题是我的实例在重启后配置错误。因为 public ip 已更改但配置包含旧 public IP。有没有办法定义弹性 IP 自动分配给特定 VPC 中的实例? (创建后立即分配弹性ip)

有两种方法

1) 使用 aws ec2 associate-address 中公开的 API 方法,参见 http://docs.aws.amazon.com/cli/latest/reference/ec2/associate-address.html

2) 使用 cloudformation 而不是脚本参见 http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-ec2.html#scenario-ec2-eip

VPC 内部没有使 EIP 自动附加到 EC2 实例的功能。

您需要使用您熟悉的 AWS API 语言编写自己的脚本来实现您自己的自动化。

1)准备: 分配弹性IP,记下EIP-id

2) 将 EIP-id 关联到 EC2 IP 分配工作: 使用 AWS API 脚本创建并启动您的 EC2 实例,捕获 EC2 实例 ID(或实例接口 ID)。 然后在同一个脚本中,使用 API ec2 关联地址(命名略有不同,具体取决于您使用的 AWS API 语言)将 EIP-id 附加到 EC2 实例 ID(或实例接口 ID) )

如果您使用API,您实际上可以使用"ec2 describe_addresse"来动态查找未关联到任何实例的空闲EIP-id。

如果您想不时停止 EC2 并重新启动它们,则需要提前考虑自动化:EC2 Instances will not keep elastic IP

我通常从 EC2 实例内部设置弹性 IP,而不是从创建实例的任何地方开始,使用用户数据,但我不明白为什么你不能从外部脚本做同样的事情.

这是我在启动应用程序时传递给用户数据的脚本。

注意,此脚本依赖于其他(父)脚本创建的变量 例如:

REGION = 一个字符串,其中包含您将实例启动到的区域
RESOURCE_ID = 包含新启动实例 ID 的字符串
IP = 包含原始 public IP 地址的字符串

您应该能够在初始启动的响应中获得这些变量。

您将需要创建额外的功能,这假定您已经启动了该实例,但是这应该可以帮助您完成大部分工作。

请注意,在启动和分配弹性 IP 地址之间无需重启实例。事实上,正如您提到的那样,这样做可能 "lose" public IP 地址(尽管我相信从控制台简单重启会保留 public IP)。

#!/bin/bash

EIPID=`aws ec2 allocate-address --domain vpc --region ${REGION} | grep -m 1 'AllocationId' | awk -F : '{print }' | sed 's|^ "||' | sed 's|"||'`
IP=`ec2metadata --public-ipv4`
EIP=${IP}

if [ -n "$EIPID" ]
then
    conf=`aws ec2 associate-address --instance-id ${RESOURCE_ID} --allocation-id ${EIPID} --region ${REGION} | grep -m 1 'AssociationId' | awk -F : '{print }' | sed 's|^ "||' | sed 's|"||'`
    if [ -n "$conf" ]
    then
        while [ "$IP" == "$EIP" ]
        do
            EIP=`ec2metadata --public-ipv4`
            sleep 2
        done
        echo "Elastic IP ${EIPID} successfully mapped";      
        echo "ELASTIC_IP=\"${EIP}\"" | sudo tee -a /etc/environment
    else
        echo "Failed to map Elastic IP Address: ${EIPID}";
    fi
else
    echo "Failed to acquire Elastic IP address: ${EIPID}";
fi

正如 的回答,我想说 VPC 内部没有任何功能可以使 EIP 自动附加到特定的 EC2 实例。此外,停止实例也会解除 EIP 与其的关联。所以EC2实例不会保留弹性IP。

有一个选项 。通过使用名为 DynamicURL 的服务来分配,该服务将您域 A 上的 IP 地址更改为分配给您的实例的 Public IP。因此,无论何时更改 IP,您的域都会与您的实例保持关联。