在我们的代码中,为了获取ec2示例的区域,我们使用了EC2MetadataUtils.getEC2InstanceRegion()
,我们刚刚意识到我们不能使用EC2MetadataUtils
,因为它是一个内部API,可能会发生变化。
注意:这是一个内部API,可能会发生变化。SDK的用户不应该依赖于此。
做了一些谷歌搜索,但无法找到一个替代的解决方案,是否有任何替代的解决方案,以获得ec2示例的区域?
感谢您的任何帮助!
在我们的代码中,为了获取ec2示例的区域,我们使用了EC2MetadataUtils.getEC2InstanceRegion()
,我们刚刚意识到我们不能使用EC2MetadataUtils
,因为它是一个内部API,可能会发生变化。
注意:这是一个内部API,可能会发生变化。SDK的用户不应该依赖于此。
做了一些谷歌搜索,但无法找到一个替代的解决方案,是否有任何替代的解决方案,以获得ec2示例的区域?
感谢您的任何帮助!
2条答案
按热度按时间mctunoxg1#
下面是
class
的实现:https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/util/EC2MetadataUtils.java我没有找到Java的替代方案,尽管在谷歌上搜索,所以,我意识到需要更深入的研究。我描述了您拥有的可能性如下:
1.您可以保持原样
这个警告清楚地表明使用替代方案是个好主意,但是不存在现成的替代方案以及
class
未来版本的可能好处是很好的反驳,所以现在可以忽略这个说明。2.下载开源库,搜索该方法的调用
如果您在库中的其他地方找到了此方法的调用,并且您能够以某种方式使用它,那么这可能是一种替代方案。例如,使用
并搜索该方法的出现:
我得到了这些结果:
第一个匹配项是方法的定义。
第二场比赛看起来像这样:
因此,
InstanceMetadataRegionProvider
的getRegion
方法看起来像是您正在寻找的替代方法。第三场比赛看起来像这样:
因此,
getCurrentRegion
和Regions
看起来像是另一种选择。如果你成功地使用了其中一个,那么重构就会很容易,而且相应地重构也是有意义的。3.复制并重命名类
如果前两个选项对您来说不可行,那么您可以复制并重命名
class
,这样您就可以确保即使内部API发生更改,该方法也不会改变。这不是一种非常优雅的方法,也不容易实现,因为class
具有依赖性,因此,您将有一些困难需要解决,但我们事先知道这是一种可能的解决方案。4.最后,自己动手的方法
这是一篇关于检索示例元数据的文章:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
我们可以看到,在示例的元数据信息中,可以找到region:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html
使用curl和jq的命令示例如下所示
可以在这里找到:https://www.howtouselinux.com/post/find-ec2-instance-region-info-in-aws
fnvucqvd2#
EC2示例运行的区域信息作为示例标识文档的一部分提供。
正如in the AWS documentation所解释的,以及@LajosArpad在他非常好的回答中所指出的,可以从EC2示例内部的以下URL获得此信息,例如运行
curl
:提供的响应将类似于以下内容:
请注意
region
字段。当然,
EC2MetadataUtils
基本上也会以更详细、更结构化的方式阅读这些信息,以给予示例运行的EC2区域。您可以尝试在自己的代码中复制
EC2MetadataUtils
公开的功能的最小版本。具体的方式取决于你想要用来执行任务的库,但是,独立于它们,你需要读取返回的文档,将其解析为JSON,并获取
region
字段。例如,使用JSON处理的标准Java API,并使用documentation中提供的示例,您可以尝试以下操作来获取一行中的区域:
正如我所说的,你可以使用其他库(Jackson,org.json,Gson,...用于JSON处理或commons-io等。到URL/
InputStream
读和写)。该代码使用IDMSv 1,并且可以通过许多不同的方式进行改进,例如验证身份文档签名等。