在EC2实例中如何使用boto3

3
我有一个Python应用程序在由ECS管理的EC2实例上的Docker容器中运行(好吧,那是我想要的...)。然而,为了使用像SSM这样的服务,我需要知道实例运行的区域。我不需要任何凭据,因为我使用为实例授予访问该服务的角色,所以默认的Session就可以了。
我知道可以使用curl获取动态元数据来获取区域,但是否有更优雅的方法在EC2实例内部使用区域名称(或凭证)实例化客户端?
我查看了boto3的文档并发现:
请注意,如果您已配置了IAM角色的EC2实例,则无需在boto3中设置任何显式配置即可使用这些凭据。如果在上述任何其他位置都找不到凭据,Boto3将自动使用IAM角色凭据。
那么为什么我需要为SSM客户端传递区域名称呢?是否有解决方法?

AWS中的区域是供服务客户调用的。 - smac2020
2个回答

3

区域是SSM客户端的必需参数,用于确定它应该与哪个地区进行交互。即使您在AWS云中,它也不会尝试去假设。

如果您希望容器中的SSM客户端自动假定当前区域,则最简单的实现方式是使用AWS环境变量

在您的容器定义中,指定环境属性并指定一个名为AWS_DEFAULT_REGION的变量和您当前区域的值。

这样一来,在容器中就不必在SDK中指定区域。

此示例使用环境属性提供了更多信息。


谢谢,我知道这个。但是在Java SDK中,区域是从元数据中获取的,为什么boto3不能这样做呢?https://github.com/boto/boto3/issues/375 - GuillaumeA
我猜你能做的就是你已经做的(在 GitHub 上添加问题)。这是因为不同的 SDK 是由不同的开发人员编写的,所以功能会有所不同,遗憾的是。 - Chris Williams

0

以下是如何使用实例配置文件凭据从参数存储检索参数的方法:

#!/usr/bin/env python3

from ec2_metadata import ec2_metadata
import boto3

session = boto3.Session(region_name=ec2_metadata.region)
ssm = session.client('ssm')
parameter = ssm.get_parameter(Name='/path/to/a/parameter', WithDecryption=True)
print(parameter['Parameter']['Value'])

client部分替换为您选择的服务,然后您就可以开始了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接