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

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

假设您不想分配一个弹性IP地址(并且有原因说明这并不总是一个解决scheme),那么只需在重新启动的实例上调用DescribeInstances ,它将返回一组信息,包括公共IP地址。

这是关于主题的AWS EC2 Java API文档 。

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

在这里看到我对你的相关问题的答案:

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

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

如果您位于实例本身,则还可以使用简单的HTTP通过user-data APIfindIP地址:

 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地址。 这些需要重新分配给一个实例停止/启动后(但不是在重新启动后)。

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

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

 curl checkip.amazonaws.com 

公共主机名是:

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

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

 curl ifconfig.me 

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

为了获取实例的公共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()); } } } 

他们有util类,这有助于访问EC2元数据。 例如

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

假设你重启实例,而不是从头开始,你可以指定一个弹性的IP,它始终保留在EC2实例中(除非你把IP移到另一个服务器上)。 这使您可以将您的所有DNS指向该IP,而不用担心重新启动会导致您的问题。

我想那是你的问题,但还有其他的东西你可以问。 服务器的内部IP会发生变化(如果重新启动实例而不重新启动),并且不能“保留”它,所以您可能需要创build一个脚本来为您保留新的IP(如果指向内部服务的话)。

希望有所帮助

你可以使用这个。

  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; } }