1

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

4

4 回答 4

3

我通常从 EC2 实例中设置弹性 IP,而不是从创建实例的任何东西开始,使用 userdata,尽管我不明白为什么你不能从外部脚本做同样的事情。

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

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

REGION = 保存您启动实例的区域的
字符串 RESOURCE_ID = 保存新启动实例 ID 的
字符串 IP = 保存原始公共 IP 地址的字符串

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

您将需要创建额外的功能,这假设您已经启动了实例,但这应该可以让您大部分时间到达那里。

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

#!/bin/bash

EIPID=`aws ec2 allocate-address --domain vpc --region ${REGION} | grep -m 1 'AllocationId' | awk -F : '{print $2}' | 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 $2}' | 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
于 2016-03-16T20:36:42.660 回答
1

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

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

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

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

如果您使用 API,您实际上可以使用“ec2 describe_addresse”来动态查找与任何实例无关的空闲 EIP-id。

如果您想不时停止 EC2 并重新启动它们,您需要提前考虑自动化:EC2 实例不会保留弹性 IP

于 2016-03-16T16:02:20.823 回答
0

有两种方法

1) 使用中公开的 API 方法aws ec2 associate-address,请参阅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

于 2016-03-16T14:44:57.147 回答
0

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

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

于 2016-07-20T21:52:50.713 回答