重新启动后更改EC2实例的IP地址

时间:2019-03-29 09:32:14

标签: amazon-web-services amazon-ec2 cloud

我正在运行EC2 Linux实例。为了进行一些维护,我关闭了实例,然后再次启动它。但是,EC2 IP现在已更改。

如何在停止后重新启动Amazon EC2实例的IP地址并保持不变?

5 个答案:

答案 0 :(得分:4)

弹性IP的名称为limitations

如果您在一个区域内已达到最大的弹性IP地址数量,而您想要的只是一种恒定的方式来连接到EC2实例,那么我建议您使用route53记录而不是IP地址。

我创建一个route53记录,该记录指向我的EC2实例的IP地址。停止EC2时,记录不会更改。

使记录指向EC2地址的方法是通过running a script that changes the route53 record when the EC2 launches

这是我的EC2的user data

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash

# get the public ip address
# Ref: https://stackoverflow.com/questions/38679346/get-public-ip-address-on-current-ec2-instance
export public_ip=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)

cat <<EOF > input.json
{
  "Comment": "optional comment about the changes in this change batch request",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "my-domain.my-company.com",
        "Type": "A",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "${public_ip}"
          }
        ]
      }
    }
  ]
}
EOF

# change route53 record 
/usr/bin/aws route53 change-resource-record-sets \
  --hosted-zone-id <hosted_zone_of_my-company.con> \
  --change-batch file://input.json >
--//

在这里,我将my-domain.my-company.com用作EC2的route53记录。

通过使用此方法,您将获得一个指向EC2实例的route53记录。停止并启动EC2时,记录不会更改。因此,您始终可以使用route53记录连接到EC2。

请记住为EC2实例分配一个具有route53权限的IAM角色,以便您可以正确运行用户数据。

请记住,我提供的用户数据旨在用于Amazon Linux 2,并且这些命令可能不适用于其他Linux发行版。

答案 1 :(得分:3)

实际上,当您停止/启动实例时,IP地址将更改。如果重新启动实例,它将保留相同的IP地址。不幸的是,我们无法将地址重新分配给您的实例,因为该地址将被释放回其他EC2实例使用的池中。

如果您想根据需要避免以后再发生此问题:

  • 如果仅需要固定的公共IP地址,则可以为实例分配弹性IP地址。
  • 如果在实例的整个生命周期中都需要公共IP地址和私有IP地址保持不变,则可以在VPC中启动实例。在VPC中分配给实例的私有IP地址一直保留到实例直到终止。

要了解更多信息,请参见aws文档this

答案 2 :(得分:1)

是的,可以。

转到Elastic IP并创建一个。

然后选择新创建的Elastic IP并选择Associate弹性IP并选择要与之关联的Instance ID

就是这样。现在,即使重新启动EC2,也会分配IP。

请注意,AWS对每个弹性IP收取 0.005美元/小时,对于每月超过100次的其他重新映射,每个弹性IP地址重新映射收取0.10美元

答案 3 :(得分:0)

如果您不希望在停止和启动EC2实例后更改IP地址,请使用弹性IP 。 有关如何使用弹性IP的更多参考:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html

答案 4 :(得分:0)

这取决于您所谈论的IP:

  • 公共IP:尝试使用Elastic Ip,那么您将不再有此问题。您可以直接在AWS Console上或以编程方式为实例分配一个新实例。但是,如果您使用的是自动伸缩组,则必须在用户数据或cloud-init进程上进行。

  • 私有IP:很遗憾,您无法将私有Ip地址固定到实例。唯一的方法是使用DNS,在这种情况下,将为您的VPC(https://docs.aws.amazon.com/fr_fr/vpc/latest/userguide/vpc-dns.html)使用私有DNS区域。在这种情况下,无需购买域名。

我还建议在第一种情况下,在您拥有域名的情况下使用DNS,而不是使用IP地址