1

我有一个存储在 AWS S3 存储桶中的大型数据集。对 S3 存储桶的访问是非公开的,我正在使用 API 网关执行授权,然后才能访问 S3 存储桶。授权用户使用 S3.getSignedUrl() API 调用返回一个签名的 url,他们可以使用它来获取大对象。

我的问题是关于在参数对象中传递给 getSignedUrl 调用的到期持续时间的语义。

var params = {Bucket: 'bucket', Key: 'key', Expires: 60};
var url = s3.getSignedUrl('getObject', params);

我的理解是 URL 在 Expires 持续时间(本例中为 60 秒)后过期。

问题是:我可以使用一个简短的到期 URL 来返回一个大对象,而 GET 请求本身可能需要更长的时间(比如 15 分钟)?

S3 SDK 文档

params (map) — 传递给操作的参数。有关预期的操作参数,请参见给定的操作。此外,您还可以传递“Expires”参数来通知 S3 URL 应该 工作多长时间(强调添加)。

从安全的角度来看,我想避免提供比必要更长的过期时间。我试图理解文档中“ URL 应该工作多长时间”的含义。

直觉上,我觉得 getSignedUrl() 返回一个签名 URL,该 URL 有效期为 60 秒(在本例中),如果在签名 URL 到期内触发 GET 请求,AWS 将授权该请求并完成该请求,即使它将对象流回请求者需要 15 分钟。只要在到期之前发出对基础对象的 GET 请求,这应该可以工作。它是否正确?

4

1 回答 1

1

假设您的大对象可以在一个正确的 GET 请求中下载授权发生在您发出该请求时。

如果您需要多个带有 range-header 的 GET 请求,则每个请求都单独授权。

我尝试过这个:

$ URL=$(aws s3 presign s3://mb-demo-bucket-2020/130MB.txt --expires-in=10)
$ wget -q $URL                                                            
Time: 0h:00m:23s 

下载需要 23 秒,并且 URL 仅在 10 秒内有效。

于 2021-03-04T08:36:02.900 回答