繁体   English   中英

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

[英]How to specify credentials when connecting to 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 来执行我的操作(在我的例子中,从存储桶中删除了一个 object)。

对于 boto3,我发现的所有示例都是这样的:

import boto3
S3 = boto3.resource( 's3' )
S3.Object( bucket_name, key_name ).delete()

我无法指定我的凭据,因此所有尝试都因InvalidAccessKeyId错误而失败。

如何使用 boto3 指定凭据?

您可以创建一个会话

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 会话详细信息。

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创建配置文件。 原因是,使用配置文件, 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]:

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

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

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

如果您依赖.aws/credentials为用户存储 id 和 key,它将被自动提取。

例如

session = boto3.Session(profile_name='dev')
s3 = session.resource('s3')

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

[dev]
aws_access_key_id = AAABBBCCCDDDEEEFFFGG
aws_secret_access_key = FooFooFoo
region=op-southeast-2

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

通过运行pip install awscli安装 aws-cli

import os

os.system("aws configure set aws_access_key_id '****************ABCD'")
os.system("aws configure set aws_secret_access_key '****************123'")
os.system("aws configure set region 'eu-west-1'")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM