我正在尝试使用 AWS S3 REST API 检索存储桶的对象(我没有使用 SDK),但不幸的是我遇到了以下问题:当我调用 API 时,我不知道它的区域。
这就是我所做的:
因此这是我的问题:
有没有办法在不知道其区域的情况下获取存储桶的对象列表?或者有什么简单的方法来获取桶的区域?
信息:我读过有两种调用存储桶的样式,“路径样式”和“虚拟托管样式”,但是每当我将请求发送到“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/