AWS S3.getSignedUrl() :到期语义

AWS S3.getSignedUrl() : semantics of expiry

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

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

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

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

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

S3 SDK documentation:

params (map) — parameters to pass to the operation. See the given operation for the expected operation parameters. In addition, you can also pass the "Expires" parameter to inform S3 how long the URL should work for (emphasis added).

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

直觉上,我觉得 getSignedUrl() returns 一个签名的 URL 有效期为 60 秒(在本例中),如果在签名 URL 有效期内触发 GET 请求=34=],即使将对象流式传输回请求者需要 15 分钟,AWS 也会授权请求并完成请求。只要在到期之前向基础对象发出 GET 请求,这就应该有效。这是正确的吗?

假设您的大型 object 可以在正确的 单个 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 秒内有效。