Amazon-Ec2

通過 Java 獲取 EC2 實例的 instance-id

  • April 17, 2014

我有一個部署為伺服器的 AWS EC2 實例,我需要找出它的公共 IP。但是,要知道我必須首先知道我的實例的實例 ID。

客觀的:

  • 我有一個 Java 程式碼在我的實例中執行,我希望該程式碼找出正在執行的實例的目前 IP 或實例 ID。

在閱讀了亞馬遜文件後,我想出了一個返回所有實例 IP 的 Java 方法,但這不是我想要的,我想要一個只返回實例 ID 或正在執行的實例的公共 IP 地址的方法。

   /**
    * Returns a list with the public IPs of all the active instances, which are
    * returned by the {@link #getActiveInstances()} method.
    * 
    * @return  a list with the public IPs of all the active instances.
    * @see     #getActiveInstances()
    * */
   public List<String> getPublicIPs(){
       List<String> publicIpsList = new LinkedList<String>();

       //if there are no active instances, we return immediately to avoid extra 
       //computations.
       if(!areAnyActive())
           return publicIpsList;

       DescribeInstancesRequest request =  new DescribeInstancesRequest();
       request.setInstanceIds(instanceIds);

       DescribeInstancesResult result = ec2.describeInstances(request);
       List<Reservation> reservations = result.getReservations();

       List<Instance> instances;
       for(Reservation res : reservations){
           instances = res.getInstances();
           for(Instance ins : instances){
               LOG.info("PublicIP from " + ins.getImageId() + " is " + ins.getPublicIpAddress());
               publicIpsList.add(ins.getPublicIpAddress());
           }
       }

       return publicIpsList;
   }

在這段程式碼中,我有一個包含所有活動實例的實例 ID 的數組,但我不知道它們是否是“我”。所以我假設我的第一步是知道我是誰,然後詢問我的公共 IP 地址。

我可以對以前的方法進行更改以提供我想要的嗎?有沒有更有效的方法呢?


編輯

真的嗎?有人可以解釋一下關於虛擬化伺服器的問題,在這種情況下,EC2 AWS 實例在論壇中詢問有關伺服器的問題時是題外話嗎?

這完全符合規則的以下兩點:

  • 伺服器和工作站作業系統、硬體和軟體;
  • 商業/企業級虛擬化。

此外,在這個論壇上有很多關於 EC2 的問題(甚至是詢問程式答案的問題),並且有人實際回答了我的問題這一事實證明了我的觀點——這是提問的正確地方。

我留下這條評論是因為不贊成你的行為,是像你這樣的人把新使用者趕走了。我知道我將此標記為已回答,但我仍在這樣做。為什麼?因為重要的是原則。

您可以使用此處記錄的實例元數據http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html

下面我寫了一段簡單的java程式碼,它列印出正在執行的instance-id

import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;

public final class Main {

 public static void main(String[] args) throws Exception {
   URL url = new URL("http://169.254.169.254/latest/meta-data/instance-id");
   URLConnection conn = url.openConnection();
   Scanner s = new Scanner(conn.getInputStream());
   if (s.hasNext()) {
     System.out.println(s.next());
   } 
 }
}

程式碼必須從正在執行的 ec2 實例執行

引用自:https://serverfault.com/questions/589194