Ast*_*ode 8 rest amazon-s3 amazon-web-services
我正在尝试使用AWS S3 REST API检索存储桶的对象(我没有使用SDK),但不幸的是我遇到了以下问题:当我调用API时,我不知道它的区域.
这是我做的:
因此,这是我的问题:
有没有办法在不知道其区域的情况下获取桶的对象列表?或者有没有简单的方法来获得桶的区域?
信息:我读过有两种方式可以调用存储桶,"路径式"和"虚拟托管式",但每当我将请求发送到" https://s3.amazonaws.com/ [bucketname]时"相反,它给了我一个重定向的错误......
Mic*_*bot 14
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>
Run Code Online (Sandbox Code Playgroud)
V2签名不是特定于区域的,因此以前有一种简单的方法可以使用V2请求来学习桶的区域:
http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlocation.html
但是,有一个可以成为V4的catch-22,因为你必须知道桶的区域才能调用以发现桶的区域.
然后,第一个解决方案是捕获<Region>
错误响应中返回的内容,并使用该区域来标记存储桶的未来请求.显然,您希望缓存此信息,因为不这样做会降低性能并增加成本.
或者,还有一种方法问美国标准区域(美国东部-1)任何桶的位置,在任何地区,使用这种URL格式只:
https://s3.amazonaws.com/bucket-name?location
Run Code Online (Sandbox Code Playgroud)
使用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>
Run Code Online (Sandbox Code Playgroud)
您不能使用此URL构造实际列出其他区域中的存储桶对象,因为https://s3.amazonaws.com/
始终将您的请求路由到US-Standard(us-east-1),但您可以使用它来发现任何存储桶的区域,因为US-Standard具有可用信息.
更新/产生额外的
在某些时候,S3似乎添加了一个新的响应头,x-amx-bucket-region:
它似乎是REST API的一个未记录的添加,并且似乎被添加到许多S3错误响应中,特别是403错误.
如果您收到错误响应,这似乎是一种有用的自我纠正机制.
此外,上述有关询问美国标准区域任何桶位置的信息仍然准确,如果发送到任何区域S3 REST端点,而不仅仅是美国标准,则相同的请求应该有效,因为所有地区都知道所有其他水桶的位置:例如,https://s3-us-west-2.amazonaws.com/bucket-name?location
可以向全球任何水桶询问US-West-2(俄勒冈州),它也有相同的信息.在某些情况下,可能需要询问最近的区域.
归档时间: |
|
查看次数: |
10207 次 |
最近记录: |