只从EC2实例配置文件中获取boto3凭证

12

boto3 文档列出了搜索凭据的顺序,只有在最后从EC2实例元数据服务中获取凭证。

如何强制boto3仅从EC2实例配置文件或实例元数据服务中提取凭据?

我发现这个可以让我从元数据服务中获取临时凭据,然后传递给创建boto3会话。

但是我的问题是是否有更好的方法来实现这一点?是否可能通过指定要使用的provider来创建boto3会话,例如InstanceMetadataProvider - 链接? 我尝试过查找文档,但是无法弄清楚。

原因是此脚本运行的上下文还具有设置AWS密钥的环境变量,这显然具有优先权,但我需要该脚本仅使用分配给EC2实例的IAM角色运行。


你的意图是不在文件中保存AWS凭证。如果你可以接受这一点,那么我们可以使用--profile profile-name,如果没有提供profile标志,则可以使用IAM角色。 - Sumit Murari
是的,我不想担心管理AWS凭证或设置配置文件。分配给节点的实例IAM角色具有脚本运行所需的权限。 - Vivek Thomas
请您详细说明一下我们可以使用`--profile profile-name`,如果未给出配置文件标志,则可以使用IAM角色如果我不提供“配置文件”它将优先使用已设置在脚本运行上下文中的环境变量中的AWS凭据。如何强制使用boto3选择EC2实例角色 - Vivek Thomas
3个回答

13

所以我最终做了这个,效果如预期。它始终使用实例角色的临时凭证。脚本寿命短暂,因此凭证的有效性不是问题。

from botocore.credentials import InstanceMetadataProvider, InstanceMetadataFetcher

provider = InstanceMetadataProvider(iam_role_fetcher=InstanceMetadataFetcher(timeout=1000, num_attempts=2))
creds = provider.load().get_frozen_credentials()
client = boto3.client('ssm', region_name='us-east-1', aws_access_key_id=creds.access_key, aws_secret_access_key=creds.secret_key, aws_session_token=creds.token)

如果有更好的方法,请随意发布。


0
import boto3
import botocore

botocore_session = botocore.session.get_session()
credential_provider = botocore_session.get_component('credential_provider')
instance_metadata_provider = credential_provider.get_provider('iam-role')
credential_provider.insert_before('env', instance_metadata_provider)
boto3_session = boto3.Session(botocore_session=botocore_session)

client = boto3_session.client(...)
resource = boto3_session.resource(...)

0

你也可以使用boto3。

>>> session = boto3.Session(region_name='foo_region')
>>> credentials = session.get_credentials()
>>> credentials = credentials.get_frozen_credentials()
>>> credentials.access_key
u'ABC...'
>>> credentials.secret_key
u'DEF...'
>>> credentials.token
u'ZXC...'
>>> access_key = credentials.access_key
>>> secret_key = credentials.secret_key

这是一个类似的想法,但我发现它返回得更快。


3
这并不会强制使用EC2实例配置文件凭证,它只是从初始化的会话中获取密钥和令牌。 - Tuukka Mustonen
@TuukkaMustonen 那些会话中的密钥和令牌是基于 EC2 实例凭证的。当 EC2 使用 IAM 角色初始化时,它没有像个人一样的单独凭证。从实例会话中获取冻结凭证是在其他地方使用凭证的唯一方法。 - Jhirschibar
1
如果会话是使用 EC2 实例配置文件凭据初始化的,则会显示该凭据。但是,如果您读取 OP 的描述(最后一段),则可以看到他有 AWS 凭据作为环境变量,并且在您的示例中会话将使用环境变量进行初始化,而不是使用 EC2 实例配置文件,这才是问题所在。 - Tuukka Mustonen

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