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

Python 如何在连接到boto3 S3时指定凭据?,python,amazon-web-services,amazon-s3,boto3,Python,Amazon Web Services,Amazon S3,Boto3,在boto上,我使用以下方式指定连接到S3时的凭据: import boto from boto.s3.connection import Key, S3Connection S3 = S3Connection( settings.AWS_SERVER_PUBLIC_KEY, settings.AWS_SERVER_SECRET_KEY ) 然后,我可以使用S3执行我的操作(在我的例子中,从bucket中删除一个对象) 对于boto3,我发现的所有示例如下: import 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执行我的操作(在我的例子中,从bucket中删除一个对象)

对于boto3,我发现的所有示例如下:

import boto3
S3 = boto3.resource( 's3' )
S3.Object( bucket_name, key_name ).delete()
我无法指定我的凭据,因此所有尝试都失败,出现
InvalidAccessKeyId
错误

如何使用boto3指定凭据?

您可以创建:

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

s3 = session.resource('s3')

您可以使用新会话直接获得
客户端
,如下所示

 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
                      )

在仍然使用bot3.resource()的情况下,有许多方法可以存储凭据。 我自己也在使用AWS CLI方法。它工作得很好


我想详细介绍一下@justagy的答案。我喜欢的方法是使用AWS CLI创建配置文件。原因是,使用配置文件,
CLI
SDK
将自动在
~/.aws
文件夹中查找凭据。好的是
awscli
是用python编写的

如果您还没有cli,可以从pypi获取它。以下是从终端设置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,而无需指定密钥(除非您想使用不同的凭据)。

这是较旧的,但也将其放在此处供我参考。boto3.resource只是实现默认会话,您可以传递boto3.resource会话详细信息

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`.

您可以看到,它只接受与bot3.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()

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

此答案可能会帮助您:请参阅官方文档:works中的“配置凭据”部分,我将以此作为答案。他们到底为什么不把这当作一种显而易见的方式来记录呢?!!正如上面的评论中所提到的,这实际上是一个模拟问题。我最初想说的是,我在文档中找不到这个问题,但在“警告”一节中,它指出标记是可选的。我真的不明白你为什么要为此烦恼。@JimmyJames这是离题了,但你可以使用AWS STS生成临时凭证(例如,有效期为一小时)。在这种情况下,会话令牌是必需的,如果您忽略它,它将不起作用。@JimmyJames STS的用例是从具有有限权限的
aws\u access\u key\u id
aws\u secret\u access\u key
开始。它们不允许您访问S3,但允许您访问可以访问S3的对象。您进行AWS STS调用以承担该角色,这将返回一个新的
AWS\u访问密钥\u id
AWS\u密码\u访问密钥
AWS\u会话\u令牌
组合(密钥和访问密钥与原始密钥不同)。然后您使用这些凭据创建一个新会话来访问S3。这对于获取S3客户端是有效的,但是OP想要一个S3资源。我同意@Alasdair。文档没有显示如何对客户端执行任何操作,您也没有,因此我看不出此答案的相关性。我尝试了此操作,但出现了“找不到凭据”错误..我以前删除了~/.aws文件夹以测试此操作,因为我知道boto默认情况下会在那里查找凭据。。。
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()