gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:30:24 25 4
gpt4 key购买 nike

我正在尝试使用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com