rest - 使用 AWS S3 REST API 在不知道存储桶区域的情况下检索存储桶的对象

标签 rest amazon-web-services amazon-s3

我正在尝试使用 AWS S3 REST API 检索存储桶的对象(我没有使用 SDK),但不幸的是我遇到了以下问题:当我调用 API 时,我不知道它的区域。

这就是我所做的:

  • 我向“https://[bucketname] .s3.amazonaws.com/”
  • 构建了一个请求
  • 我使用设置为“us-west-1”的默认区域对请求进行签名(使用 AWS4 签名过程)
  • 但想象一下我试图获取的存储桶设置为区域“us-west-2”,AWS 向我抛出错误

  • 因此这是我的问题:

    有没有办法在不知道其区域的情况下获取存储桶的对象列表?或者有什么简单的方法来获取桶的区域?

    信息:我读过有两种调用存储桶的样式,“路径样式”和“虚拟托管样式”,但是每当我将请求发送到“https://s3.amazonaws.com/ [bucketname]”时,它都会给我一个重定向永久错误...

    最佳答案

    AWS V4 身份验证 需要 您知道存储桶的区域,以便您可以正确签署请求。除此以外:

    HTTP/1.1 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 'us-west-2'</Message>
      <Region>us-west-2</Region>
      <RequestId>xxxx</RequestId>
      <HostId>xxxx</HostId>
    </Error>
    

    V2 签名不是特定于区域的,因此以前有一种简单的方法可以使用 V2 请求来了解存储桶的区域:

    http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlocation.html

    但是,V4 似乎有一个 catch-22,因为您必须先知道存储桶的区域,然后才能进行调用以发现存储桶的区域。

    那么,第一个解决方案是捕获 <Region>在错误响应中返回,并使用该区域对存储桶的 future 请求进行签名。显然,您希望缓存这些信息,因为不这样做会降低性能并增加成本。

    或者,有一种方法可以使用此 URL 格式 向美国标准区域 (us-east-1) 询问任何区域中任何存储桶的位置。仅限 :
    https://s3.amazonaws.com/bucket-name?location
    

    使用 us-east-1 区域签署此请求,无论存储桶在哪里,您都会收到响应。请注意,如果存储桶位于 us-east-1(美国标准)中,则 LocationConstraint返回为空。
    <?xml version="1.0" encoding="UTF-8"?>
    <LocationConstraint xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
      us-west-2
    </LocationConstraint>
    

    您不能使用此 URL 构造来实际列出其他区域中的存储桶对象,因为 https://s3.amazonaws.com/始终将您的请求路由到 US-Standard (us-east-1),但您可以使用它来发现任何存储桶的区域,因为 US-Standard 有该信息可用。

    更新/附加

    在某些时候,S3 似乎添加了一个新的响应 header x-amx-bucket-region:这似乎是对 REST API 的无证补充,并且似乎被添加到许多 S3 错误响应中,尤其是 403 错误。

    如果您收到错误响应,这似乎是一种有用的自我纠正机制。

    此外,上述关于向美国标准区域询问任何存储桶位置的信息仍然是准确的,如果将相同的请求发送到任何区域 S3 REST 端点,而不仅仅是美国标准,因为所有区域都知道所有其他桶的位置:例如https://s3-us-west-2.amazonaws.com/bucket-name?location会询问 US-West-2 (Oregon),它也有相同的可用信息,用于全局任何存储桶。在某些情况下,询问您最近的区域可能是可取的。

    关于rest - 使用 AWS S3 REST API 在不知道存储桶区域的情况下检索存储桶的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27091816/

    相关文章:

    json - 如何在 JSON 响应中拆分参数的多个值?

    rest - REST 中的 PATCH 和 null

    amazon-web-services - 无法将消息从 lambda 发送到 aws sqs,并且 aws-sdk 没有返回任何错误

    amazon-s3 - 您可以在 AWS 中标记单个 S3 对象吗?

    python - Boto3 S3,按上次修改对桶进行排序

    c# - 即使在 C# 中使用 REST API 获取成功状态代码后,图像也不会在 Azure 中删除

    java - 处理可同步或异步调用的 REST API 路径的正确方法

    node.js - 密码保护 AWS Node EB 应用程序

    amazon-web-services - 如果 GSI 不包含更新的属性,则会消耗 WCU?

    amazon-web-services - AWS存储桶和区域