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

2022-09-03 08:19:58

我部署了一个 AWS EC2 实例,我需要找出其公有 IP。Howver,要知道我必须首先知道我的实例的实例 ID。

目的:

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

在阅读了 Amazon 文档后,我想出了一个返回所有实例的 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地址。

是否可以对以前的方法进行更改,以便为我提供所需的内容?有没有更有效的方法可以做到这一点?


答案 1

我建议/推荐使用适用于 Java 的 AWS 开发工具包。

// Resolve the instanceId
String instanceId = EC2MetadataUtils.getInstanceId();

// Resolve (first/primary) private IP
String privateAddress = EC2MetadataUtils.getInstanceInfo().getPrivateIp();

// Resolve public IP
AmazonEC2 client = AmazonEC2ClientBuilder.defaultClient();
String publicAddress = client.describeInstances(new DescribeInstancesRequest()
                                                    .withInstanceIds(instanceId))
                             .getReservations()
                             .stream()
                             .map(Reservation::getInstances)
                             .flatMap(List::stream)
                             .findFirst()
                             .map(Instance::getPublicIpAddress)
                             .orElse(null);

除非Java8可用,否则这将需要更多的锅炉代码。但简而言之,就是这样。

https://stackoverflow.com/a/30317951/525238 已经提到了EC2MetadataUtils,但这里也包括工作代码。