【问题标题】:How to specify credentials when connecting to boto3 S3?连接boto3 S3时如何指定凭据?
【发布时间】:2018-02-09 10:32:33
【问题描述】:

在 boto 上,我曾经在以这种方式连接到 S3 时指定我的凭据:

import boto
from boto.s3.connection import Key, S3Connection
S3 = S3Connection( settings.AWS_SERVER_PUBLIC_KEY, settings.AWS_SERVER_SECRET_KEY )

然后我可以使用 S3 来执行我的操作(在我的例子中,从存储桶中删除一个对象)。

使用 boto3,我找到的所有示例都是这样的:

import boto3
S3 = boto3.resource( 's3' )
S3.Object( bucket_name, key_name ).delete()

我无法指定我的凭据,因此所有尝试都失败并出现 InvalidAccessKeyId 错误。

如何使用 boto3 指定凭据?

【问题讨论】:

  • 这个答案可能对你有帮助:stackoverflow.com/a/36913771/2681632
  • 参见官方文档中的“配置凭证”部分:boto3.readthedocs.io/en/latest/guide/configuration.html
  • 我觉得将其称为“AWS_SERVER_PUBLIC_KEY”非常奇怪。该名称是“访问密钥 ID”,与密钥对的公共部分无关。此外,对 s3 之类的服务的访问不应与服务器(主机)访问混淆。而且我建议不要让这个密钥 id 公开(即使它单独无用)

标签: python amazon-web-services amazon-s3 boto3


【解决方案1】:

你可以创建一个session:

import boto3
session = boto3.Session(
    aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY,
    aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY,
)

然后使用该会话获取 S3 资源:

s3 = session.resource('s3')

【讨论】:

  • 有效,我将其作为答案。他们到底为什么不将其记录为明显的方法呢?!!
  • 正如上面评论中提到的,这个其实在documentation中。
  • @Moot 我最初想说我在文档中找不到这个,但在“警告”部分的credentials 下,它指出令牌是可选的。我真的不明白你为什么会为此烦恼。
  • @JimmyJames 这是话题,但您可以使用 AWS STS 生成临时凭证(例如有效期为一小时)。在这种情况下,会话令牌是必需的,如果您省略它,它将不起作用。
  • @JimmyJames STS 的用例是您从权限有限的aws_access_key_idaws_secret_access_key 开始。他们不允许您访问 S3,但他们允许您访问可以访问 S3 的 assume a role。您进行 AWS STS 调用以代入该角色,这将返回一个新的 aws_access_key_idaws_secret_access_keyaws_session_token 组合(密钥和访问密钥与原始密钥不同)。然后,您可以使用这些凭据创建一个新会话来访问 S3。
【解决方案2】:

您可以像下面这样直接获得带有新会话的client

 s3_client = boto3.client('s3', 
                      aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY, 
                      aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY, 
                      region_name=REGION_NAME
                      )

【讨论】:

  • 这适用于获取 s3 client,但 OP 想要一个 s3 resource
  • 我同意@Alasdair。文档没有显示如何与客户做任何事情,你也没有,所以我看不出这个答案有什么相关性。
  • 我试过这个,但它给了我“无法找到凭据”错误..我之前删除了 ~/.aws 文件夹来测试这个,因为我知道 boto 默认会在那里寻找凭据.. .
  • 这是正确的答案,也是目前唯一有效的方法。我不知道你们在说什么,这没有用。您可以使用客户端执行任何操作,并且每个 AWS 服务都有大量文档。看看 S3:boto3.amazonaws.com/v1/documentation/api/latest/reference/…
【解决方案3】:

这是较旧的,但也将其放在这里供我参考。 boto3.resource 只是实现了默认的 Session,你可以通过 boto3.resource 的 session 细节。

Help on function resource in module boto3:

resource(*args, **kwargs)
    Create a resource service client by name using the default session.

    See :py:meth:`boto3.session.Session.resource`.

https://github.com/boto/boto3/blob/86392b5ca26da57ce6a776365a52d3cab8487d60/boto3/session.py#L265

你可以看到它只是采用与 Boto3.Session 相同的参数

import boto3
S3 = boto3.resource('s3', region_name='us-west-2', aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY, aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY)
S3.Object( bucket_name, key_name ).delete()

【讨论】:

    【解决方案4】:

    我想扩展@JustAGuy 的答案。我更喜欢的方法是使用AWS CLI 创建一个配置文件。原因是,使用配置文件,CLISDK 将自动在~/.aws 文件夹中查找凭据。好在AWS CLI 是用python 编写的。

    如果您还没有 pypi,您可以从 pypi 获取 cli。以下是从终端设置 cli 的步骤

    $> pip install awscli  #can add user flag 
    $> aws configure
    AWS Access Key ID [****************ABCD]:[enter your key here]
    AWS Secret Access Key [****************xyz]:[enter your secret key here]
    Default region name [us-west-2]:[enter your region here]
    Default output format [None]:
    

    在此之后,您可以访问boto 和任何 API,而无需指定密钥(除非您想使用不同的凭据)。

    【讨论】:

    • 您也可以指定要填写的列:-aws configure set aws_access_key_id [****************ABCD]-aws configure set aws_secret_access_key [****************xyz]
    【解决方案5】:

    在仍然使用 boto3.resource() 的同时,有多种方法可以存储凭据。 我自己正在使用 AWS CLI 方法。效果很好。

    https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html?fbclid=IwAR2LlrS4O2gYH6xAF4QDVIH2Q2tzfF_VZ6loM3XfXsPAOR4qA-pX_qAILys

    【讨论】:

      【解决方案6】:

      如果您依靠 .aws/credentials 为用户存储 id 和 key,它将被自动提取。

      例如

      session = boto3.Session(profile_name='dev')
      s3 = session.resource('s3')
      

      如果您的 credentials 文件包含以下内容,这将获取 dev 配置文件(用户):

      [dev]
      aws_access_key_id = AAABBBCCCDDDEEEFFFGG
      aws_secret_access_key = FooFooFoo
      region=op-southeast-2
      

      【讨论】:

        【解决方案7】:

        您可以为密钥和访问密钥设置默认 aws env 变量 - 这样您就不需要更改默认客户端创建代码 - 但如果您有非默认凭据,最好将其作为参数传递

        【讨论】:

          猜你喜欢
          • 2017-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-09
          • 1970-01-01
          • 2019-06-29
          • 1970-01-01
          相关资源
          最近更新 更多