ChatGPT解决这个技术问题 Extra ChatGPT

连接boto3 S3时如何指定凭据?

在 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 公开(即使它单独无用)

A
Alasdair

您可以创建一个 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。
A
Alasdair

您可以像下面这样直接获得带有新会话的 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 客户端,但 OP 想要一个 s3 资源。
我同意@Alasdair。文档没有显示如何与客户做任何事情,你也没有,所以我看不出这个答案是如何相关的。
我试过这个,但它给了我“无法找到凭据”错误..我之前删除了 ~/.aws 文件夹来测试这个,因为我知道 boto 默认会在那里查找凭据...
这是正确的答案,也是今天唯一有效的方法。我不知道你们在说什么,这没有用。您可以使用客户端执行任何操作,并且每个 AWS 服务都有大量文档。看看 S3:boto3.amazonaws.com/v1/documentation/api/latest/reference/…
D
DataDecay

这是较旧的,但也将其放在这里供我参考。 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()

x
x85ms16

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

如果您还没有,可以从 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]
J
JustAGuy

在仍然使用 boto3.resource() 的同时,有很多方法可以存储凭据。我自己正在使用 AWS CLI 方法。它完美地工作。

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


B
Bernard

如果您依靠您的 .aws/credentials 来存储用户的 ID 和密钥,它将被自动提取。

例如

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

D
Den Roman

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