我能匿名使用boto3吗?

39

通过传递 anon= 关键字参数,我可以使用 boto 连接到公共 S3 存储桶而无需凭据。

s3 = boto.connect_s3(anon=True)

使用 boto3 是否可行?

3个回答

57

是的,您的凭证用于签署您发送的所有请求,因此您需要做的是将客户端配置为根本不执行签署步骤。您可以按以下方式进行操作:

import boto3
from botocore import UNSIGNED
from botocore.client import Config

s3 = boto3.client('s3', config=Config(signature_version=UNSIGNED))
# Use the client

5
更新这个答案以提供最新的解决方案将是不错的。 - weaver
我已经测试过,它可以在2022年正常工作。你只需要将region_name添加到客户端参数中,就像这样:s3 = boto3.client('s3', config=Config(signature_version=UNSIGNED),region_name='us-east-1') - kevininhe
即使设置了region_name,在2023年似乎也不再起作用。 - derchambers
这对我在一个已知的公共存储桶上有效,其中region_name设置为us-east-1,尽管我创建的是一个boto s3资源,而不是一个boto s3客户端。请参阅https://www.learnaws.org/2021/02/24/boto3-resource-client/ - undefined
最近在一个已知的公共存储桶上尝试了这个,即使没有region_name,它也可以正常工作。 - undefined

25

禁用签名

import boto3

from botocore.handlers import disable_signing
resource = boto3.resource('s3')
resource.meta.client.meta.events.register('choose-signer.s3.*', disable_signing)

如果凭据存在,这会阻止它们被使用吗?将其设置为默认值是否合适? - MRocklin
1
它将阻止凭据在该客户端上使用。您需要另一个客户端连接到受限制的S3存储桶。我的解决方案也是如此。注意:两个解决方案完全相同。 - Jordon Phillips

5

目前 boto3 版本(1.9.168)似乎都不起作用。这个方法(来自于 botocore 上未修复的 GitHub 问题)似乎能解决问题:

client = boto3.client('s3', aws_access_key_id='', aws_secret_access_key='')
client._request_signer.sign = (lambda *args, **kwargs: None)

3
在我使用的boto3 1.9.251上,Jordon Phillips的答案看起来适用。 - gerrit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接