如何在重启时找到亚马逊EC2实例的IP地址

时间:2011-09-23 07:34:12

标签: amazon-ec2 reboot

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

11 个答案:

答案 0 :(得分:102)

重新启动时,EC2实例的IP地址更改。它们通常会在非VPC EBS引导实例的停止/启动时更改。

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

  

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

也就是说,您可以通过您特定语言的DescribeInstances API调用找到私人和公共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地址。这些需要在停止/启动后重新分配给实例(但不是在重启后)。

答案 1 :(得分:51)

curl http://169.254.169.254/latest/meta-data/public-ipv4

答案 2 :(得分:38)

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

curl checkip.amazonaws.com

公共主机名是:

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

答案 3 :(得分:5)

假设您不想分配弹性IP地址(并且有理由说明这并不总是一个解决方案),那么只需在重新启动的实例上调用DescribeInstances,这会返回一堆信息,包括Public IP地址。

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

答案 4 :(得分:3)

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

curl ifconfig.me

不确定为什么但在meta-data url下找不到public-ipv4

答案 5 :(得分: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());
         }     
    }
}

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

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

我认为这就是你的要求,但还有其他一些你可以问的问题。服务器的内部IP会发生变化(如果重新启动实例而不是重新启动)并且您无法“保留”它,那么您可能需要创建一个脚本来保留新IP(如果您指向内部服务)。 / p>

希望有所帮助

答案 8 :(得分: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;
                    }
                }

答案 9 :(得分:0)

您可以对AWS资源使用CLI CRUD复制。 AWS-CRUD-Manage r

查找所有ec2实例

./awsconsole.py ec2 all

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

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

答案 10 :(得分:0)

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