【问题标题】:How to find the IP address of an amazon EC2 instance on reboot如何在重启时找到亚马逊 EC2 实例的 IP 地址
【发布时间】:2011-11-23 10:51:28
【问题描述】:

重启时,亚马逊实例的 IP 地址会发生变化。如何使用 java API 找到新的 IP 地址?

【问题讨论】:

  • 为什么不分配一个固定的弹性IP?

标签: amazon-ec2 reboot


【解决方案1】:

我使用的是domain=$(hostname | cut -d "." -f1),但它获取的 ip 为 ip-1-2-3-4。你不能用hostname -i

【讨论】:

    【解决方案2】:

    您可以对 AWS 资源使用 CLI CRUD 应用程序。 AWS-CRUD-Manager

    查找所有 ec2 实例

    ./awsconsole.py ec2 all
    

    查找一个 ec2 实例的所有数据(包括 IP priv 和 public)

    ./awsconsole.py ec2 find -i <id-insta`ce>
    

    【讨论】:

      【解决方案3】:

      公有 IPv4 地址也可从 EC2 实例获得,如下所示:

      curl checkip.amazonaws.com
      

      公共主机名是:

      dig -x $(curl -s checkip.amazonaws.com) +short
      

      【讨论】:

      • 这实际上效果更好。上面的答案 /public-ipv4 直到最近才起作用,不确定 AWS 是否更改了某些内容或限制通过 ELB 的流量产生了影响,但是我在两个实例上都报告了我的弹性 IP。然而,curl checkip 做得正确,我的弹性 ip 在一个上,一个随机分配在另一个上。
      【解决方案4】:

      你可以使用这个。

                      var ipofnewServer = string.Empty;    
                      while (string.IsNullOrEmpty(ipofnewServer))
                      {
                          var statusRequest1 = new DescribeInstancesRequest
                          {
                              InstanceIds = new List<string>() { instanceId }
                          };
      
                          var result = amazonEc2client.DescribeInstances(statusRequest1);
                          var status = result.Reservations[0].Instances.FirstOrDefault();
                          if (status != null)
                          {
                              ipofnewServer = status.PublicIpAddress;
                          }
                      }
      

      【讨论】:

        【解决方案5】:

        它们具有便于访问 EC2 元数据的 util 类。 比如

        EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicHostname();
        EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicIPv4s();
        

        【讨论】:

          【解决方案6】:

          为了获取实例的公共 IP,您首先需要获取该实例的实例 ID。您可以使用以下java代码获取实例的实例id。

           List<Instance> instances = runInstancesResult.getReservation().getInstances();
          
           String instanceId = instances.get(0).toString().substring(13, 23);
          

          现在为了获得公共 IP,您可以使用以下 java 代码。

          public void fetchInstancePublicIP() {
              DescribeInstancesRequest request = new   DescribeInstancesRequest().withInstanceIds("i-d99ae7d2");
              DescribeInstancesResult result= ec2.describeInstances(request);
              List <Reservation> list  = result.getReservations();
          
              for (Reservation res:list) {
                   List <Instance> instanceList= res.getInstances();
          
                   for (Instance instance:instanceList){
          
                           System.out.println("Public IP :" + instance.getPublicIpAddress());     
                           System.out.println("Public DNS :" + instance.getPublicDnsName());
                           System.out.println("Instance State :" + instance.getState());
                           System.out.println("Instance TAGS :" + instance.getTags());
                   }     
              }
          }
          

          【讨论】:

            【解决方案7】:

            这就是我在 VPC 中的 Ubuntu 12.04 EC2 实例上的做法:

            curl ifconfig.me
            

            不知道为什么,但在元数据 url 下找不到 public-ipv4

            【讨论】:

            • 适用于 CentOS 7
            【解决方案8】:

            重启后,EC2 实例的 IP 地址不会改变。它们通常会在非 VPC EBS 启动实例的停止/启动时发生变化。

            在此处查看我对您相关问题的回答:

            https://stackoverflow.com/questions/7533871/difference-between-rebooting-and-stop-starting-an-amazon-ec2-instance

            也就是说,您可以通过 API 调用以您的特定语言对DescribeInstances 查找私有和公共 IP 地址。

            如果您在实例本身上,您还可以使用简单的 HTTP 通过用户数据 API 找到 IP 地址:

            http://instance-data/latest/meta-data/local-ipv4
            http://instance-data/latest/meta-data/public-ipv4
            

            例如,

            wget -qO- http://instance-data/latest/meta-data/public-ipv4
            

            Elastic IP addresses 建议为特定服务或服务器保持一致(静态)面向外部的 IP 地址。这些需要在停止/启动后重新分配给实例(但不是在重新启动后)。

            【讨论】:

            • 这是一个可靠的完整答案。 “wget”提供了具体的正确答案,周围的散文也很有帮助/有用。
            【解决方案9】:
            curl http://169.254.169.254/latest/meta-data/public-ipv4
            

            【讨论】:

            • 这应该是公认的答案,也是他们在文档中所说的。 docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
            • 那个奇怪的IP是什么?从自己的服务器调用这个未知 IP 是否会构成安全威胁? :D 我建议编辑解释该 IP 并且看起来它没有被接受
            • @RavindranathAkila 不,您可以在 EC2 实例内部使用此命令
            • 这不再有效,他们显然已经更新了元数据 API。
            【解决方案10】:

            假设您不想分配弹性 IP 地址(并​​且有一些原因表明这并不总是一个解决方案)然后只需在重新启动的实例上调用 DescribeInstances,它会返回一堆信息,包括公共 IP 地址。

            这是有关该主题的AWS EC2 Java API Documentation

            【讨论】:

            • 我支持你八位大师。您是否知道任何简单的方法来获取最后创建的实例的 InstanceID 以立即关联 ElasticIP?据我所知,它需要解析来自ec2-run-instances 的返回信息或使用bash 解析JSON,并从aws ec2 run-instances 返回JSON。试图避免额外的依赖。
            • 为了澄清上面的DescribeInstances 命令,我喜欢使用这个:aws ec2 describe-instances | grep "Value\|PublicIpAddress"(当然你需要安装aws cli)
            • 谢谢你,善良的匿名投票者。您通过责备我六岁接受的答案来略微降低我的代表的原因是如此明显,无需评论!
            【解决方案11】:

            假设您重新启动实例并且没有从头开始启动,那么您可以分配一个始终保留在 ec2 实例中的弹性 IP(除非您将 IP 移动到另一台服务器)。这使您可以将所有 DNS 指向该 IP,而不必担心重新启动会导致问题。

            我认为这就是您要问的问题,但您还可以问其他问题。服务器的内部 IP 更改(如果您重新启动实例而不是重新启动)并且您无法“保留”它,因此您可能需要创建一个脚本来保留新 IP(如果您将内部服务指向它)。

            希望对你有帮助

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-12-28
              • 2017-01-24
              • 2018-03-16
              • 2020-07-27
              • 2014-10-08
              • 2014-03-30
              • 2020-05-12
              • 1970-01-01
              相关资源
              最近更新 更多