EC2实例的一个IP地址在重启后被改变了

21 人关注

我正在运行一个EC2 Linux实例。出于一些维护的目的,我关闭了该实例,并再次启动它。然而,现在EC2的IP已经改变了。

如何保持亚马逊EC2实例的IP地址在停止和重新启动后保持不变?

1 个评论
amazon-web-services
amazon-ec2
cloud
S_K
S_K
发布于 2019-03-29
5 个回答
Rahul Goti
Rahul Goti
发布于 2019-03-29
已采纳
0 人赞同

实际上,当你停止/启动你的实例时,IP地址会改变。如果你重新启动实例,它将保持相同的IP地址。不幸的是,我们不可能给你的实例重新分配地址,因为这个地址会被释放回其他EC2实例使用的池中。

如果你想在未来避免这个问题,取决于你的需求。

  • 如果你只需要一个固定的公共IP地址,你可以给你的实例分配一个弹性IP地址。
  • 如果你需要公共和私有IP地址在实例的整个生命周期内保持不变,你可以在VPC中启动你的实例来代替。在VPC中分配给实例的私有IP地址会一直伴随着实例,直到终止。
  • 要了解更多信息,请看aws文档中 的分配弹性IP

    请注意,如果你通过公共IP进行通信,你会被收取流量费。通过私人IP的通信是免费的。
    @RahulGoti, 我的公共IP已经改变了。我也将弹性IP与我的实例相关联。但问题是Nginx的配置没有受到影响,因为IP地址已经改变。有什么办法能让它在新生成的IP上工作吗?
    这里的答案是: stackoverflow.com/questions/54128771/.. ....声称私人IP永远是一样的,永远不会改变。
    @JaynaTanawala 也许动态DNS可以解决你的问题......如果你的公共IP改变了,动态DNS会用你的域名更新新的IP......查看这个 链接
    Srihari Karanth
    Srihari Karanth
    发布于 2019-03-29
    0 人赞同

    是的,你可以。

    进入 Elastic IP ,创建一个。

    然后选择新创建的 Elastic IP ,并选择 Associate 弹性IP,并选择你想将其与之关联的 Instance ID

    这就是了。现在,即使你重新启动你的EC2,该IP也会被分配。

    请注意,AWS对每个弹性IP收取 0.005美元/小时 的费用,对每月超过100个的额外重新映射的弹性IP地址收取0.10美元的费用。

    Brian
    Brian
    发布于 2019-03-29
    0 人赞同

    弹性IP有其 局限性

    如果你已经达到了一个地区的弹性IP地址的最大数量,而你想要的是一个持续的方式来连接到EC2实例,我建议使用route53记录,而不是使用IP地址。

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

    而保持记录指向EC2地址的方法是通过 运行一个脚本,在EC2启动时改变route53记录

    这里是我的EC2的 用户数据

    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}"
    # change route53 record 
    /usr/bin/aws route53 change-resource-record-sets \
      --hosted-zone-id <hosted_zone_of_my-company.com> \
      --change-batch file://input.json >
    

    这里我使用my-domain.my-company.com 作为我的EC2的route53记录。

    通过使用这种方法,你可以得到一个指向你的EC2实例的route53记录。而且,当你停止和启动EC2时,该记录不会改变。所以你可以一直使用route53记录来连接到你的EC2。

    记得给EC2实例分配一个有route53权限的IAM角色,这样你就可以无误地运行用户数据。

    并且记住,我提供的用户数据是为亚马逊Linux 2使用的,这些命令可能对其他Linux发行版不起作用。

    这个问题下的答案: stackoverflow.com/questions/54128771/ ......声称EC2实例的私有地址从未改变。如果是这样,使用弹性IP或route53的意义何在?难道我们就不能使用相同的私有IP来连接到实例吗?
    @mangusta 你可以从VPC之外用公共IP连接到EC2实例。我不确定这里的情况是否如此。问题是关于从外部世界连接到具有公共IP的特定EC2实例。
    @DipeshRaichana 嗯,事实上,不清楚OP是否想要公开访问或私人访问--他发布了他的问题后就消失了,笑。
    Steve HOUEL
    Steve HOUEL
    发布于 2019-03-29
    0 人赞同

    这取决于你说的是哪个IP。

  • 公共IP:尝试使用弹性IP,那么你就不会有这个问题了。你可以直接在AWS控制台或以编程方式给你的实例分配一个新的IP。但如果你使用的是自动扩展组,你将不得不在你的用户数据或云计算过程中这样做。

  • 私有IP:不幸的是,你不能给一个实例固定一个私有Ip地址。唯一的方法是使用DNS,在这种情况下,为你的VPC建立一个私有的DNS区域 (https://docs.aws.amazon.com/fr_fr/vpc/latest/userguide/vpc-dns.html) 。在这种情况下,不需要购买一个域名。

  •