【问题标题】:Boto3: get credentials dynamically?Boto3:动态获取凭据?
【发布时间】:2016-03-29 14:49:16
【问题描述】:

我正在努力找出如何从我的代码中动态获取我的 aws_access_key_id 和 aws_secret_access_key。

在 boto2 中我可以执行以下操作:boto.config.get_value('Credentials', 'aws_secret_access_key') 但我似乎在 boto3 中找不到类似的方法。如果我查看boto3.Session()._session._credentials,我就能找到钥匙,但这对我来说似乎是所有黑客之母,我宁愿不走那条路。

【问题讨论】:

  • 您能否解释一下为什么需要直接访问代码中的凭据?
  • 我需要它,因为我将数据从 S3 复制到 Redshift,所以我需要 aws_access_key_idaws_secret_access_key。我宁愿不必编写进入配置/凭据文件的代码,并在 Boto 已经这样做时找到它们。
  • 是的,将这些密钥传递给 Redshift 以进行 S3 访问是一件很痛苦的事情。我希望他们允许我们为 Redshift 分配一个 IAM 角色以避免这样做。我担心您的解决方案不适用于使用 IAM 实例配置文件或 Lambda 函数的 EC2 实例。
  • @Mo.我同意马克B。它不是便携式解决方案。检查我的解决方案,看看它是否有效。
  • 如何将密钥放入凭据配置中并为其指定一个新的配置文件名称而不是 [default] ?并使用 profile_name= 指向显式配置文件键?

标签: python-3.x amazon-web-services boto3


【解决方案1】:

最好只使用use temporary credentials。您可以使用STS.get_session_token 获取临时凭据。

编辑:从this PR 开始,您可以像这样访问当前会话凭据:

import boto3

session = boto3.Session()
credentials = session.get_credentials()

# Credentials are refreshable, so accessing your access key / secret key
# separately can lead to a race condition. Use this to get an actual matched
# set.
credentials = credentials.get_frozen_credentials()
access_key = credentials.access_key
secret_key = credentials.secret_key

redshift = session.client('redshift')
...

我仍然建议使用完全符合 redshift 需求的临时凭证。

【讨论】:

  • 嗨@Jordon Phillips,如果我们使用get_frozen_credentials(),令牌会再次过期吗?还是会继续工作而无需再刷新令牌?
【解决方案2】:

使用 botocore

>>> import botocore.session
>>> session = botocore.session.get_session()

>>> session.get_credentials().access_key
'AKIAABCDEF6RWSGI234Q'

>>> session.get_credentials().secret_key
'abcdefghijkl+123456789+qbcd'

>>> session.get_config_variable('region')
'us-east-1'

【讨论】:

  • 这些是 IAM 的程序访问密钥吗?如果没有 ARN,这些是如何生成的,请您解释一下
  • @sudhirtataraju Boto 可以通过多种方式之一获取密钥。该代码显示了如何检索 Boto 看到的密钥。例如,当您提供凭据时,Boto 会给出访问错误。您可能需要确认您传递的凭据是否与 Boto 使用的凭据相同。见:boto3.amazonaws.com/v1/documentation/api/latest/guide/…
【解决方案3】:

我能否建议使用 boto3 访问密钥是错误的:

import boto3
session = boto3.Session(profile_name="my-profile")

dynamodb = session.resource(
    "dynamodb",
    region_name=session.region_name,
    # aws_access_key_id=session.get_credentials().access_key,
    # aws_secret_access_key=session.get_credentials().secret_key,
)

注意,我注释掉了访问密钥,因为 1

从此会话创建的任何客户端都将使用来自~/.aws/credentials[my-profile] 部分的凭据。

【讨论】:

  • 很好,这正是我所需要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 2011-05-09
  • 2018-09-04
  • 2021-03-10
相关资源
最近更新 更多