【问题标题】:Using boto for AWS S3 Buckets for Signature V4将 boto 用于 AWS S3 存储桶以进行签名 V4
【发布时间】:2015-02-08 14:15:43
【问题描述】:

我在为法兰克福地区的 S3 存储桶使用 Python-Boto SDK 时遇到问题。根据Amazon link,该区域将仅支持 V4。 这个document 解释了如何为 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 配置文件中进行更改而不是尝试以编程方式进行更改,会发生什么?
  • 是的,我之前尝试过,但得到了相同的结果。你的方法应该有什么不同?
  • 可能没有,但您只是在您的环境中更改内存配置的值。如果在其他地方创建了另一个配置,它将不会获得更新,因为它将直接从配置文件中读取配置。我只是想知道这是否会有所作为。

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


【解决方案1】:

我在使用 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')

    【讨论】:

      【解决方案3】:

      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 的方法。
      • 问题是关于使用 boto 访问法兰克福的 S3 存储桶。明确指定法兰克福地区是一种方法(启用 v4 身份验证是另一种方法)。
      【解决方案4】:

      对于 boto2 -- 将其添加到 .boto 配置中工作

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

      【讨论】:

        猜你喜欢
        • 2019-01-27
        • 2012-06-23
        • 2021-09-12
        • 2014-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多