【问题标题】:amazon: assign elastic ip in VPC automaticallyamazon:自动在 VPC 中分配弹性 ip
【发布时间】:2016-03-16 14:20:54
【问题描述】:

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

【问题讨论】:

  • 实例在重启期间不会丢失其公共 IP 地址。但是,如果实例停止并启动,则公共 IP 地址可能不同。为防止这种情况,请分配一个弹性 IP 地址——它不会在启动/停止操作之间发生变化。
  • 如果您的问题的答案在这里可以接受,请考虑选择一个。

标签: amazon-web-services amazon-ec2 amazon-vpc elastic-ip


【解决方案1】:

我通常使用用户数据从 EC2 实例中设置弹性 IP,而不是从创建实例的任何内容开始,但我不明白为什么您不能从外部脚本执行相同的操作。

这是我在启动应用程序时传递给 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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      有两种方法

      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

      【讨论】:

        【解决方案4】:

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

        有一个选项,does not require an Elastic IP.to 使用名为 DynamicURL 的服务分配,该服务将您的域 A 上的 IP 地址更改为分配给您的实例的公共 IP。因此,无论何时更改 IP,您的域都会与您的实例保持关联。

        【讨论】:

          猜你喜欢
          • 2013-08-25
          • 1970-01-01
          • 1970-01-01
          • 2020-12-15
          • 2012-06-16
          • 1970-01-01
          • 2015-07-29
          • 2018-07-09
          • 2019-01-05
          相关资源
          最近更新 更多