2011-09-23 80 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在一個上,另一個是隨機分配的。 –