46

重新启动时,亚马逊实例的 IP 地址会更改。如何使用 java API 找到新的 IP 地址?

4

11 回答 11

104

重新启动时,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

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

于 2011-09-24T01:16:33.957 回答
52
curl http://169.254.169.254/latest/meta-data/public-ipv4
于 2012-05-15T05:08:17.233 回答
41

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

curl checkip.amazonaws.com

公共主机名是:

dig -x $(curl -s checkip.amazonaws.com) +short
于 2016-04-04T11:38:48.790 回答
5

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

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

于 2011-09-23T08:57:40.627 回答
3

这就是我在 VPC 中的 Ubuntu 12.04 EC2 实例上执行此操作的方式:

curl ifconfig.me

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

于 2014-02-11T03:04:02.160 回答
1

为了获取实例的公共 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());
         }     
    }
}
于 2014-08-08T09:56:03.407 回答
1

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

EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicHostname();
EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicIPv4s();
于 2015-07-13T10:01:41.560 回答
0

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

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

希望有帮助

于 2011-09-23T08:09:43.970 回答
0

你可以使用这个。

                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;
                    }
                }
于 2016-02-12T08:18:36.887 回答
0

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

查找所有 ec2 实例

./awsconsole.py ec2 all

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

./awsconsole.py ec2 find -i <id-insta`ce>
于 2018-10-15T09:23:20.663 回答
0

然而,我使用domain=$(hostname | cut -d "." -f1)的是 ip 作为 ip-1-2-3-4。你不能使用吗hostname -i

于 2021-06-21T19:19:01.103 回答