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

Rob*_*rax 66 python amazon-s3 amazon-web-services boto3

在boto上我以这种方式连接S3时用来指定我的凭据:

import boto
from boto.s3.connection import Key, S3Connection
S3 = S3Connection( settings.AWS_SERVER_PUBLIC_KEY, settings.AWS_SERVER_SECRET_KEY )
Run Code Online (Sandbox Code Playgroud)

然后我可以使用S3来执行我的操作(在我的情况下从桶中删除一个对象).

使用boto3我发现的所有例子都是这样的:

import boto3
S3 = boto3.resource( 's3' )
S3.Object( bucket_name, key_name ).delete()
Run Code Online (Sandbox Code Playgroud)

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

如何使用boto3指定凭据?

Ala*_*air 93

您可以创建会话:

import boto3
session = boto3.Session(
    aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY,
    aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY,
)
Run Code Online (Sandbox Code Playgroud)

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

s3 = session.resource('s3')
Run Code Online (Sandbox Code Playgroud)

  • 工作,我会把它作为答案.为什么他们不记得这是明显的方法呢?!! (14认同)
  • 正如上面的评论中提到的,这实际上在 [文档](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html) 中。 (4认同)
  • @JimmyJames STS 的用例是从权限有限的 `aws_access_key_id` 和 `aws_secret_access_key` 开始。他们不允许您访问 S3,但允许您[承担一个可以访问 S3 的角色](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。您进行 AWS STS 调用来担任该角色,该角色将返回新的“aws_access_key_id”、“aws_secret_access_key”和“aws_session_token”组合(密钥和访问密钥与原始密钥和访问密钥不同)。然后,您可以使用这些凭据创建一个新会话来访问 S3。 (2认同)

Raj*_*jez 45

您可以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
                      )
Run Code Online (Sandbox Code Playgroud)

  • 这适用于获取s3*客户端*,但OP需要s3*资源*. (6认同)
  • 我同意@Alasdair 的观点。这些文档没有展示如何对客户做任何事情,你也没有,所以我不明白这个答案有什么相关性。 (2认同)
  • 这是正确的答案,也是今天唯一有效的方法。我不知道你们在说什么这没有用。您可以使用客户端执行任何操作,并且每个 AWS 服务都有大量文档。只需查看 S3:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html (2认同)

Ber*_*ard 13

如果您依赖于.aws/credentials存储用户的 ID 和密钥,它将自动获取。

例如

session = boto3.Session(profile_name='dev')
s3 = session.resource('s3')
Run Code Online (Sandbox Code Playgroud)

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

[dev]
aws_access_key_id = AAABBBCCCDDDEEEFFFGG
aws_secret_access_key = FooFooFoo
region=op-southeast-2
Run Code Online (Sandbox Code Playgroud)


小智 9

这是旧的,但也把它放在这里供我参考。boto3.resource 只是实现了默认的 Session,您可以通过 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`.
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)


x85*_*s16 6

我想扩展@JustAGuy 的回答。我更喜欢的方法是使用AWS CLI创建配置文件。原因是,使用配置文件,CLISDK将自动在~/.aws文件夹中查找凭据。好消息是它AWS CLI是用 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]:
Run Code Online (Sandbox Code Playgroud)

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