通过Java获取EC2实例的实例ID

通过Java获取EC2实例的实例ID

我有一个 AWS EC2 实例部署为服务器,我需要找出它的公共 IP。但是,要知道这一点,我必须首先知道我的实例的实例 ID。

客观的:

  • 我的实例中正在运行 Java 代码,我希望该代码找出正在运行它的实例的当前 IP 或实例 ID。

在阅读亚马逊文档后,我想出了一个返回所有实例 IP 的 Java 方法,但这不是我想要的,我想要一个仅返回正在运行的实例的instance-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 的问题(甚至是询问编程答案的问题)以及有人真正回答了我的问题这一事实证明了我的观点 - 这是提出这个问题的正确地方。

我留下这条评论是为了表示对你行为的不满,正是你这样的人赶走了新用户我知道我已将此标记为已回答,但我仍在这样做。为什么?因为这是最重要的原则。

答案1

您可以使用此处记录的实例元数据http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html

下面我写了一段简单的 Java 代码,打印正在运行的实例 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 实例执行

相关内容