我对此有一个复杂的用例,
但简而言之,当一个实例正在运行时,我可以将弹性 IP 切换到另一个吗?以及在此时间间隔内会发生什么(在解除关联和重新关联之间[可能是 10-30 分钟]).. 它不能通过互联网进行通信吗?
编辑: 到目前为止答案很好,但这回答了问题的第二部分,主要是,如何在运行时更改 IP?
我对此有一个复杂的用例,
但简而言之,当一个实例正在运行时,我可以将弹性 IP 切换到另一个吗?以及在此时间间隔内会发生什么(在解除关联和重新关联之间[可能是 10-30 分钟]).. 它不能通过互联网进行通信吗?
编辑: 到目前为止答案很好,但这回答了问题的第二部分,主要是,如何在运行时更改 IP?
您的所有问题或多或少都在功能指南:Amazon EC2 Elastic IP Addresses中得到解决,例如:
在大多数情况下,从您指示我们重新映射弹性 IP 开始,这通常需要不到几分钟的时间,我们将继续努力使其更快。[我实际上没有经历过这个过程花费超过一分钟的时间]
它不能通过互联网进行通信吗?
这取决于手头的情况,但作为简化,您可能应该根据以下两个常见问题解答这个假设:
如果从实例中删除弹性 IP,该实例是否可以从 Internet 访问?
从实例中删除弹性 IP 会暂时使实例没有公共 IP 地址。云中的后台进程会在短时间内为实例重新分配一个新的公共 IP。在此过程中,实例仍可通过其私有 IP 地址从云内部访问。
为什么在我将新 IP 地址关联到实例后,现有连接仍然有效?
当您将弹性 IP 重新映射到实例时,即使在重新映射之后,您的一些预先存在的通信(到旧的且现在未映射的 IP 地址)仍将继续工作。例如,如果您通过系统分配的公共 IP 地址与实例建立了开放的 ssh 连接,随后将您的弹性 IP 地址之一与该实例相关联,则 ssh 会话可能会在一段时间内继续正常运行。这种行为是预期的,但不可靠。我们强烈建议您通过重新映射的新 IP 地址重新建立连接,以确保您的软件正常运行。
您的后续问题的答案也嵌入/暗示在上述指南中,但在弹性 IP 地址 (EIP)章节中进行了更详细的讨论,特别是在将弹性 IP 地址与 Amazon EC2 中的运行实例关联和关联Amazon EC2 中具有不同运行实例的弹性 IP 地址:
有关该主题的更多详细信息,请参阅 EC2 IP 信息常见问题解答。
我创建了这个 bash 脚本来更改 VPC 中正在运行的实例的公共 ip (eip)。您只需提供您为该实例指定的名称 (TAG Name=""),以便它将名称标签转换为实例 ID。更改您的公共 DNS 总是需要时间。在 aws gui 中更改 EIP 地址很烦人。解除旧IP,获取新IP,关联新IP,释放旧IP。鼠标点击很臭。
#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
}
弹性 IP 是使用 NAT 分配的。您的实例有一个 NAT 到弹性 IP 的内部 IP。虽然实例没有关联的弹性 IP,但它将具有来自池的任意 IP,因此仍然能够与 Internet 通信(假设访问规则已正确配置)。
您始终可以使用公共 DNS 名称访问系统。通过互联网交流没有问题。
从实例进行 curl 以了解要使用的私有/公共地址
HTTP:// 169。254. 169. 254/最新/元数据/local-ipv4
http : // 169. 254. 169. 254/latest/meta-data/public-ipv4
参考:http ://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
是:您可以更改正在运行的实例的 IP 地址。只需将第二个弹性 IP 地址与实例关联,它将替换现有的。