使用boto处理AWS S3 Bucket的Signature V4签名

13

我在使用Python-Boto SDK操作位于法兰克福地区的S3 Bucket时遇到了问题。根据亚马逊链接,该地区仅支持V4。这个文档解释了如何为Boto SDK添加V4支持。我已经添加了一个新的章节:

if not boto.config.get('s3', 'use-sigv4'):
    boto.config.add_section('s3')
    boto.config.set('s3', 'use-sigv4', 'True')

然后我创建了新的连接并获取了所有的桶:

connection = S3Connection(accesskey, secretkey, host=S3Connection.DefaultHost)
buckets = connection.get_all_buckets()

它运行良好,但是我尝试获取我的存储桶中的所有密钥:

for bucket in buckets:
    bucket.get_all_keys()

然后我得到了以下内容:

S3ResponseError: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'eu-central-1'</Message><Region>eu-central-1</Region>
为什么会发生这种情况? 之后我连接到该地区并获取了所有所需数据:
region_con = boto.s3.connect_to_region('eu-central-1', aws_access_key_id=accesskey, aws_secret_access_key=secretkey)
bucket = region_con.get_bucket(bucket.name)
bucket.get_all_keys()

我该如何正确地修复它?


如果您在boto配置文件中进行更改而不是尝试以编程方式进行更改,会发生什么? - garnaat
是的,我之前尝试过,但结果相同。你的方法应该有什么不同呢? - Oleg
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - garnaat
4个回答

8

我使用Boto时遇到了同样的问题。区域是法兰克福,出现了关于错误区域的错误。对于我来说,解决方案就是将主机(从此页面获取的URI http://docs.aws.amazon.com/general/latest/gr/rande.html)指向's3.eu-central-1.amazonaws.com'而不是默认的's3.amazonaws.com'

s3 = boto.s3.connect_to_region('eu-central-1',
                               aws_access_key_id=accesskey,
                               aws_secret_access_key=secretkey,
                               host='s3.eu-central-1.amazonaws.com')

2

尝试从boto配置中移除s3,以下代码适用于我:

if 's3' in boto.config.sections(): boto.config.remove_section('s3')


1

hsrv上面的回答适用于boto 2。对于boto3,以下内容基本等效:

s3 = boto3.client('s3', region_name='eu-central-1')

或者,您可以在.aws/config中设置region字段:

[default]
output = json
region = eu-central-1

这将设置默认区域;您仍然可以像上面的Python代码一样选择特定区域。
区域的重要性因服务而异(例如,假设您不在VPC中,则可以从任何地方访问S3存储桶)。但在这种情况下,重要的是较新的区域(如法兰克福)只支持较新的身份验证方案(AWS4-HMAC-SHA256)。如果您尝试从仍使用旧方案的区域(如都柏林)连接到此类区域中的任何内容,则Boto会遇到问题。

这不是一个答案。你正在从法兰克福出发,而不是建议启用V4的方法。 - Nikolay Fominyh
这个问题是关于使用boto访问法兰克福的S3存储桶。明确指定法兰克福地区是一种方法(启用v4认证是另一种方法)。 - Rob Hague

0

对于boto2 -- 将此内容添加到.boto配置文件中即可生效

[s3]
use-sigv4 = True
host=s3.eu-central-1.amazonaws.com

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