get_bucket()为我没有通过Boto创建的S3存储桶提供"错误请求"

sed*_*nym 11 python amazon-s3 boto

我正在使用Boto尝试在Amazon S3中获取一个存储桶,但是当我对某些存储桶使用get_bucket()时它返回Bad Request.我开始怀疑这是否是Boto的错误,因为我可以使用get_all_buckets()来获取存储桶.

>>> from boto.s3.connection import S3Connection
>>> conn = S3Connection(S3_ACCESS_KEY, S3_SECRET_KEY)
>>> buckets = conn.get_all_buckets()
>>> buckets
[<Bucket: mysite-backups>]
>>> buckets[0]
<Bucket: mysite-backups>
>>> conn.get_bucket('mysite-backups')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/path/to/virtualenv/lib/python2.7/site-packages/boto/s3/connection.py", line 502, in get_bucket
    return self.head_bucket(bucket_name, headers=headers)
  File "/path/to/virtualenv/lib/python2.7/site-packages/boto/s3/connection.py", line 549, in head_bucket
    response.status, response.reason, body)
S3ResponseError: S3ResponseError: 400 Bad Request

>>> conn.create_bucket('mysite_mybucket')
<Bucket: mysite_mybucket>
>>> conn.get_bucket('mysite_mybucket')
<Bucket: mysite_mybucket>
Run Code Online (Sandbox Code Playgroud)

这似乎是一个问题,即使我使用相同的用户帐户登录,因为我正在使用访问信用卡并在AWS控制台中创建它.

知道为什么会这样吗?

sed*_*nym 18

事实证明这个问题是因为该地区(我在使用法兰克福).处理它的两种方法:

  1. 放弃法兰克福(@andpei指出目前有报道的问题)并在不同的地区重新创建桶.

  2. 连接时使用'host'参数指定区域(感谢@Siddarth):

    >>> REGION_HOST = 's3.eu-central-1.amazonaws.com'
    >>> conn = S3Connection(S3_ACCESS_KEY, S3_SECRET_KEY, host=REGION_HOST)
    >>> conn.get_bucket('mysite-backups')
    <Bucket: mysite-backups>
    
    Run Code Online (Sandbox Code Playgroud)

    您可以在此处找到相关的区域主机.

  • 法兰克福需要SSL SIGv4,请参阅https://github.com/boto/boto/issues/2741 (2认同)