在 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 指定凭据?
您可以创建一个 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')
您可以像下面这样直接获得带有新会话的 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
)
这是较旧的,但也将其放在这里供我参考。 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()
我想扩展@JustAGuy 的答案。我更喜欢的方法是使用 AWS CLI
创建配置文件。原因是,通过配置文件,CLI
或 SDK
将自动在 ~/.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]
在仍然使用 boto3.resource() 的同时,有很多方法可以存储凭据。我自己正在使用 AWS CLI 方法。它完美地工作。
如果您依靠您的 .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
您可以为密钥和访问密钥设置默认 aws env 变量 - 这样您就不需要更改默认客户端创建代码 - 尽管如果您有非默认凭据,最好将其作为参数传递
不定期副业成功案例分享
aws_access_key_id
和aws_secret_access_key
开始。它们不允许您访问 S3,但它们允许您访问可以访问 S3 的 assume a role。您进行 AWS STS 调用以代入该角色,这将返回一个新的aws_access_key_id
、aws_secret_access_key
和aws_session_token
组合(密钥和访问密钥与原始密钥不同)。然后,您可以使用这些凭据创建一个新会话来访问 S3。