就执行时间而言,Java JVM 确定它是否在 AWS EC2 实例上运行的最快方法是什么?
我当前的方法是对 进行 http 提取http://169.254.169.254/latest/instance-id
,但是当我不在 AWS 上运行时,这需要几秒钟才能超时。
更新:
我的解决方案是查看 Java 系统属性“user.name”,看看它是否包含“ec2”。我们总是在“ec2-user”用户名下运行我们的应用程序,所以这种方法既快速又可靠。
就执行时间而言,Java JVM 确定它是否在 AWS EC2 实例上运行的最快方法是什么?
我当前的方法是对 进行 http 提取http://169.254.169.254/latest/instance-id
,但是当我不在 AWS 上运行时,这需要几秒钟才能超时。
更新:
我的解决方案是查看 Java 系统属性“user.name”,看看它是否包含“ec2”。我们总是在“ec2-user”用户名下运行我们的应用程序,所以这种方法既快速又可靠。
AWS 有以下文档:确定应用程序的当前区域。
关于他们的 API “新的 Regions.getCurrentRegion() 方法使这变得更容易。例如,如果您在 us-west-1 中启动 Amazon EC2 实例并在该实例上运行您的应用程序,它会知道它正在我们中运行 - west-1,您可以使用该信息轻松配置您的应用程序以与 us-west-1 中的其他服务通信。”
.. 这是一个代码片段,其中包含您正在寻找的关键词,以帮助您朝着正确的方向前进:
// When running on an Amazon EC2 instance, this method
// will tell you what region your application is in
Region region = Regions.getCurrentRegion();
您或许可以更改 DNS 超时和重试设置以减少花费的时间。将以下内容添加到 /etc/resolv.conf 文件中,看看是否有帮助。resolv.conf 上的联机帮助页将提供详细信息。
options timeout:1 attempts:1 rotate
这不是直接修复,但可能会解决您当前方法的问题。对 resolv.conf 的更改也应立即生效。
我对我的系统上的同样的事情感兴趣。
使用 Amazon 默认 Linux 的 EC2 实例运行 SSM 代理 ( https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-install-ssm-agent.html ),所以我只检查它的存在。它通常是比用户更好的指标,尽管它不像您的更新那样查找环境属性那么快。您当然可以在启动 JVM 时设置该属性并获得相同的结果:
boolean isEC2 = new java.io.File("/usr/bin/amazon-ssm-agent").exists();