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 动词。
请注意,没有上传 "to" CloudFront 这样的概念。上传 通过 CloudFront 到原始服务器,在本例中为 S3。
是否可以使用预签名的 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 动词。
请注意,没有上传 "to" CloudFront 这样的概念。上传 通过 CloudFront 到原始服务器,在本例中为 S3。