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

问题描述 投票:0回答:9

在 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 指定凭据?

python amazon-web-services amazon-s3 boto3
9个回答
341
投票

您可以创建会话

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')

170
投票

您可以直接通过新会话获得

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
                      )

18
投票

这是较旧的,但也将其放在这里供我参考。 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()

14
投票

我想扩展@JustAGuy 的答案。我更喜欢的方法是使用

AWS CLI
创建配置文件。原因是,使用配置文件,
CLI
SDK
将自动在
~/.aws
文件夹中查找凭据。好处是
AWS CLI
是用 python 编写的。

如果您还没有 cli,可以从 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,而无需指定密钥(除非您想使用不同的凭据)。


11
投票

如果您依靠

.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

2
投票

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

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


1
投票

添加此代码片段,可以轻松使用

~/.aws/config
中定义的多个配置文件:

import boto3


class AwsAccount:
    account_id: str
    session: boto3.Session
    user_arn: str
    user_id: str

    def __init__(self, account_id: str, session: boto3.Session, user_arn: str, user_id: str):
        self.account_id = account_id
        self.session = session
        self.user_arn = user_arn
        self.user_id = user_id

    @staticmethod
    def from_profile_name(profile_name: str):
        session = boto3.Session(profile_name=profile_name)
        identity = session.client('sts').get_caller_identity()

        return AwsAccount(
            account_id=identity['Account'],
            session=session,
            user_arn=identity['Arn'],
            user_id=identity['UserId'],
        )

使用示例:

default_account = AwsAccount.from_profile_name('default')
another_account = AwsAccount.from_profile_name('other')

s3 = default_account.session.client('s3')
s3.delete_object(Bucket='string', Key='string')

0
投票

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


0
投票
  1. 使用您的 AWS 配置文件

    session = boto3.Session(profile_name='demo-account')
    ec2 = session.resource('ec2')
    
  2. 设置AWS_PROFILE环境变量,boto3使用该变量中提到的配置文件。

    Windows:

    set AWS_PROFILE=demo-account
    

    Linux/MacOS:

    export AWS_PROFILE=demo-account
    
  3. 在代码中使用键(不推荐):

    直接在代码中嵌入密钥,这不是使用 boto3 访问 aws 资源的推荐方法。

    s3_client = boto3.client('s3', aws_access_key_id='ACCESS_KEY', aws_secret_access_key='SECRET_KEY',region_name=REGION_NAME)

© www.soinside.com 2019 - 2024. All rights reserved.