Java 从正在运行的实例获取弹性IP

Java 从正在运行的实例获取弹性IP,java,amazon-ec2,amazon-web-services,Java,Amazon Ec2,Amazon Web Services,通过运行在EC2实例上的java应用程序,我想知道我自己的弹性IP地址是从管理控制台手动分配的。有没有办法为此查询EC2 API?您可以调用-它返回一组信息,包括公共IP地址(IP地址过滤器) 替代方案(不是最清晰的解决方案),可能是请求这样的外部服务来了解您的公共IP。 编辑:我发现了一个很好的返回json或文本格式的服务 如果您使用linux ec2实例,这应该可以: 命令: curl http://169.254.169.254/latest/meta-data/public-ipv4

通过运行在EC2实例上的java应用程序,我想知道我自己的弹性IP地址是从管理控制台手动分配的。有没有办法为此查询EC2 API?

您可以调用-它返回一组信息,包括公共IP地址(
IP地址
过滤器)

替代方案(不是最清晰的解决方案),可能是请求这样的外部服务来了解您的公共IP。


编辑:我发现了一个很好的返回json或文本格式的服务

如果您使用linux ec2实例,这应该可以:

命令:

curl http://169.254.169.254/latest/meta-data/public-ipv4
Java代码:

public static String getIP() throws IOException, InterruptedException {
    Process p = Runtime.getRuntime().exec("curl http://169.254.169.254/latest/meta-data/public-ipv4");
    int returnCode = p.waitFor();
    if ( returnCode == 0 ) {
        BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String ip = r.readLine();
        r.close();
        return ip;
    }
    else {
        //handle error
        return null;
    }
}

是的,我试过了,但它没有告诉我哪一个是我的。从sdlc的角度考虑。我有一个develec2实例和一个生产EC2实例。我希望develec2实例连接到devel数据库,生产实例指向生产数据库。我不想创建要部署的自定义应用程序、配置等。我想问问亚马逊我目前使用的弹性IP地址是什么。我想要这个能力还有很多其他原因。这只是一个例子。@hockey\u dave,您如何创建开发/测试实例?您只需创建一个实例,然后根据需要使用它。EC2没有开发实例的概念。这是我们自己的内部名称。我们为我们的实例添加了一个有意义的标记,这样我们就可以很容易地分辨出AWS控制台中的内容?这对我来说没有任何意义。@aviad试着从商业的角度来考虑它。供应商锁定对企业来说不是一件好事。将他的应用程序从AWS移植到(例如)OpenStack需要某种适应层。如果需要包装的API更少,那么更换提供程序的成本和风险就会降低。我认为您的方法可能有一些不习惯的地方。也许有更好的方法来实现您的最终目标,但我自己对EC2还不熟悉,所以我无法告诉您常见的sdlc模式是什么。然而,我认为,除了某些特殊情况外,可能不需要您的建议(即在运行时需要找出您自己的ip)。我试图把我的解释范围限制在一些简单易懂的东西上,这在一定程度上妨碍了你。看来我对你的回答失败了。基本上,我想说的是,我在寻找确切问题的答案,而不是权宜之计,因为我有非常特殊的理由需要这样做,我不想详细解释。:)谢谢,我将做一些类似的工作,因为这似乎是唯一可行的方法。我希望能有更多的直接API调用,但我可以将上述内容包装成一个jax-rs调用,使其更符合API要求。:)好的,我已经将其实现为一个jaxrs服务,并且对此感到满意。看来我们没有得到更优雅的答案,所以我接受你的答案。谢谢。它确实有效,但是当然需要解析响应。
public static String getIP() throws IOException, InterruptedException {
    Process p = Runtime.getRuntime().exec("curl http://169.254.169.254/latest/meta-data/public-ipv4");
    int returnCode = p.waitFor();
    if ( returnCode == 0 ) {
        BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String ip = r.readLine();
        r.close();
        return ip;
    }
    else {
        //handle error
        return null;
    }
}