我尝试将文件上传到现有AWS s3存储桶,生成公共URL并使用该URL(在其他位置)下载该文件。 我密切关注example here:
import os
import boto3
import requests
import tempfile
s3 = boto3.client('s3')
with tempfile.NamedTemporaryFile(mode="w", delete=False) as outfile:
outfile.write("dummycontent")
file_name = outfile.name
with open(file_name, mode="r") as outfile:
s3.upload_file(outfile.name, "twistimages", "filekey")
os.unlink(file_name)
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'twistimages',
'Key': 'filekey'
}
)
response = requests.get(url)
print(response)
我希望从请求库中看到成功返回代码(200)。
相反,stdout是:< Response [400]>
此外,如果我使用webbrowser导航到相应的URL,我会收到一个错误代码为InvalidRequest
的XML文件,并显示错误消息:
不支持您提供的授权机制。请 使用AWS4-HMAC-SHA256。
如何使用boto3生成公共URL,任何用户都可以通过导航到相应的URL轻松下载,而不会生成复杂的标题?
为什么官方文档中的示例代码在我的案例中不起作用?
答案 0 :(得分:1)
AWS S3仍然支持美国地区的旧版v2签名(2014年之前)。但在新AWS区域下,仅允许AWS4-HMAC-SHA256(s3v4)。
要支持此功能,您必须在.aws / config文件中或在boto3.s3资源/客户端实例化期间明确指定它们。例如
# add this entry under ~/.aws/config
[default]
s3.signature_version = s3v4
[other profile]
s3.signature_version = s3v4
或明确声明
s3client = boto3.client('s3', config= boto3.session.Config(signature_version='s3v4'))
s3resource = boto3.resource('s3', config= boto3.session.Config(signature_version='s3v4'))
答案 1 :(得分:0)
我解决了这个问题。我正在eu-central-1
区域中使用S3存储桶,在配置文件中指定区域后,所有内容都按预期工作,脚本stdout为<Response [200]>
。
配置文件(~/.aws/config
)现在看起来像:
[default]
region=eu-central-1