无法从AWS boto3下载生成的签名网址

时间:2017-12-04 11:46:14

标签: python amazon-web-services amazon-s3 boto3

我尝试将文件上传到现有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轻松下载,而不会生成复杂的标题?

为什么官方文档中的示例代码在我的案例中不起作用?

2 个答案:

答案 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