Amazon-Ec2
通過 Java 獲取 EC2 實例的 instance-id
我有一個部署為伺服器的 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 實例執行