我在使用适用于法兰克福地区的S3存储桶的Python-Boto SDK时遇到问题。根据{{3}},该地区仅支持V4。 这个Amazon link解释了如何为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()
如何正确修复?
答案 0 :(得分:7)
我使用Boto时遇到了同样的问题。该地区是法兰克福,错误地区出错。对我来说,解决方案只是将主机(从此页http://docs.aws.amazon.com/general/latest/gr/rande.html获取的URI)指向'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')
答案 1 :(得分:2)
尝试从boto配置中删除s3,以下代码适用于我
if 's3' in boto.config.sections():
boto.config.remove_section('s3')
答案 2 :(得分:0)
hsrv的上述答案适用于boto 2.对于boto3
,以下内容大致相同:
s3 = boto3.client('s3', region_name='eu-central-1')
或者,您可以在region
中设置.aws/config
字段:
[default]
output = json
region = eu-central-1
设置默认区域;你仍然可以在Python中选择一个特定的区域。
该地区的重要性因服务而异(例如,假设您没有坐在VPC中,您可以从任何地方访问S3存储桶)。然而,在这种情况下,重要的是较新的区域(例如法兰克福)仅支持较新的认证方案(AWS4-HMAC-SHA256)。如果您尝试从仍使用旧方案的区域(例如Dublin)连接到此类区域中的任何内容,Boto会遇到问题。
答案 3 :(得分:0)
对于boto2-将其添加到.boto配置中有效
[s3]
use-sigv4 = True
host=s3.eu-central-1.amazonaws.com