2011-09-23 246 views

回答

4

假设你不想分配一个弹性IP地址(也有原因,这并不总是一个解决方案),那么只需拨打DescribeInstances在重新启动实例,它返回一串信息包括公共IP地址。

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

+0

我向你提供了八位上师。你知道任何简单的方法来获取最后创建的实例的InstanceID,以便立即关联ElasticIP吗?据我所知,它需要从'ec2-run-instances'解析返回的信息,或者使用bash和'aws ec2 run-instances'中的返回JSON解析JSON。试图避免额外的依赖。 – JohnAllen

+0

为了阐明上面的'DescribeInstances'命令,我喜欢使用这个命令:'aws ec2 describe-instances | grep“Value \ | PublicIpAddress”'(当然你需要安装aws cli) – modulitos

+0

为什么感谢你,善良的匿名downvoter。通过严厉批评我六年前接受的答案,你的理由让我的代表略微下降是非常明显的,不需要任何评论! –

0

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

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

希望帮助

97

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

+1

这是一个可靠的完整答案。 “wget”提供了特定的正确答案,而周围的散文也很有帮助/有用。 – javadba

47
curl http://169.254.169.254/latest/meta-data/public-ipv4 
+1

这应该是公认的答案,也是他们在文档中说的。 http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html – jontsai

+1

这是什么奇怪的IP?从服务器中调用这个未知IP是否是安全威胁? :D 我建议编辑解释IP,看起来好像不被接受 –

+0

@RavindranathAkila不能,你可以在你的EC2实例中使用这个命令 –

3

这是我做这件事是一个Ubuntu 12.04 EC2实例的VPC内:

curl ifconfig.me 

不知道为什么,但公众的IPv4没有元数据网址下找到

+1

我试过了:它没有响应挂起 – javadba

+0

在CentOS 7上工作 –

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()); 
     }  
    } 
} 
1

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

EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicHostname(); 
EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicIPv4s(); 
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; 
        } 
       } 
30

公共IPv4地址也可以从EC2实例,像这样:

curl checkip.amazonaws.com 

而且公众主机名是:

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

这实际上效果更好。上面的回答/ public-ipv4一直在运行直到最近,不确定AWS是否改变了某些东西,或者限制了通过ELB的流量产生了影响,但是我得到了两个实例上报告的弹性IP。然而,curl checkip正确无误,我的弹性ip在一个上,另一个是随机分配的。 –