Python 如何在连接到boto3 S3时指定凭据?
在boto上,我使用以下方式指定连接到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 =
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()