启动实例后分配 EC2 EIP 的最佳做法是什么?

启动实例后分配 EC2 EIP 的最佳做法是什么?

我想在实例启动时自动为其分配 EIP。我知道我可以编写一个脚本来停止/启动实例并使用 EC2 工具分配我想要的 EIP,但这取决于我是否停止/启动服务器。如果发生 EC2 中断或硬件故障,Amazon 会停止/启动我的实例,则不会重新分配 EIP。

我之前问过别人这个问题,他们含糊地提到,这可以在启动后通过盒子内部的脚本完成。然后他们下线了,所以我无法跟进。

有没有办法在启动时将 EIP 绑定到实例?

答案1

同意 Eric 的观点,从安全角度来看,这种选择并不明智。另一种选择是让另一台机器负责响应来自其他机器的请求,该机器中装有凭证。例如:具有我的凭证的机器是 EC2-1。您可能启动 2 台机器来运行您的 Web 服务器,EC2-2 和 EC2-3。当它们启动时,它们可以“向”EC2-1“发出信号”,EC2-1 反过来将运行 API 调用以将 EC2-2 和 EC2-3 关联到两个弹性 IP。这样,您必须使 EC2-1 非常安全,并且其他机器不会给您带来风险。

最好的,

西蒙尼

答案2

您可以在相关服务器的 /etc/rc.local 中使用类似下面的命令来执行此操作:

ec2-associate-address --private-key /root/private_key.pem --cert /root/public_key.pem <eip-address> -i `curl http://169.254.169.254/latest/meta-data/instance-id

答案3

使用 VPC,那么您就不必担心该问题。

这是我编写的一个 bash,通过使用友好的 Name="tag" 来更改任何 VPC 实例上的 EIP,您还可以指定默认区域,或将其添加到命令中。

#change vpc instance public IP address (EIP -> NIC|INSTANCE)
#usage "changeip [instance friendly tag=Name] [region]"
#example "changeip my.instnace us-west-1"
#dafault region is us-west-1 (you must include --region for $region default)
#for VPC instances only
function changeip {
    if [[ ! $1 ]]; then
        echo 'Error : You must provide tag name for instance'
        echo 'Example:  changeip [friendly name]'
        return
    fi
    if [[ $2 ]]; then
        region='--region '$2
        echo 'Using region '$2
    else
        region='--region us-west-1' #sets default region
        echo 'Using default '$region
    fi  
    name=$1
    instance=$(ec2-describe-instances $region | grep Name | grep $name | cut -f3)
    if [[ ! $instance =~ ^('i-'[A-Za-z0-9]*)$ ]]; then
        echo 'Error : Getting the instance id'
        echo $instance
        return
    fi
    echo 'Applying to '$1 '=> '$instance
    echo 'Please wait....'
    ip_new=$(ec2-allocate-address $region -d vpc | cut -f2)
    if [[ ! $ip_new =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        echo 'Error : Getting a new IP address'
        echo $ip_new
        return
    fi
    new_idas=$(ec2-describe-addresses $region $ip_new | cut -f 5) >> /dev/null
    if [[ ! $new_idas =~ ^('eipalloc-'[A-Za-z0-9]*)$ ]]; then
        echo 'Error : Getting New IP allocation id eipalloc'
        echo $new_idas
        return  
    fi
    ip_old=$(ec2-describe-addresses $region | grep $instance | cut -f2)
    if [[ ! $ip_old =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        echo 'Error : Getting old IP address'
        echo $ip_old
        return
    fi
    id_dis=$(ec2-describe-addresses $region $ip_old | cut -f 6)
    if [[ ! $id_dis  =~ ^('eipassoc-'[A-Za-z0-9]*)$ ]]; then
        echo 'Error : Dissasociating Old IP'
        echo $id_dis
        return
    fi
    id_release=$(ec2-describe-addresses $region $ip_old | cut -f 5) >> /dev/null
    if [[ ! $new_idas =~ ^('eipalloc-'[A-Za-z0-9]*)$ ]]; then
        echo 'Error : Release Old IP'
        echo $id_release
        return
    fi
    ec2-disassociate-address $region -a $id_dis  >> /dev/null
    sleep 8
    ec2-release-address $region -a $id_release >> /dev/null
    ec2-associate-address $region -i $instance -a $new_idas >> /dev/null
    echo 'SUCCESS!'
    echo 'Old = '$ip_old
    echo 'New = '$ip_new
}

相关内容