PUT 的预签名 S3 URL 以动态文件名/密钥开头

Presigned S3 URL for PUT with dynamic filename / key starts with

是否可以使用预签名的 key-starts-with 策略 PUT 到 S3 以允许上传多个或任意命名的文件?

这很容易使用基于浏览器的 PresignedPost 技术,但我一直无法找到一种方法来使用普通的简单 PUT 来上传以相同密钥开头的任意文件。

这不可能...不能直接做到。

POST 上传的独特之处在于它们支持嵌入式策略文档,这允许像 starts-with.

这样的逻辑

PUT 和所有其他请求都需要签名与请求精确匹配,因为签名完全来自请求本身的可观察属性。

一种可能的解决方法是将存储桶连接到 CloudFront,并使用带有适当通配符的 CloudFront pre-signed URL。在验证 CloudFront URL 之后,CloudFront 原始访问身份实际上会在后台处理请求到 S3 的签名以匹配确切的请求。在存储桶策略中为源访问身份授予 s3:PutObject 权限,然后应该允许该操作。

我认为这应该可行,但我还没有尝试过,因为 CloudFront 文档表明客户端需要将 x-amz-content-sha256 header 添加到 PUT 请求以获得完全兼容性与所有 S3 区域。同一页面警告您分配给原始访问身份的任何权限都将起作用(例如 DELETE),因此,将存储桶策略设置得过于宽松将允许通过已签名的 URL 执行任何操作 - - CloudFront 签名 URL 不限于特定的 REST 动词。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html

请注意,没有上传 "to" CloudFront 这样的概念。上传 通过 CloudFront 到原始服务器,在本例中为 S3。