AWS 获取带有自定义域的预签名 URL

Yoh*_*han 7 amazon-s3 amazon-web-services amazon-cloudfront pre-signed-url aws-sdk

以下是我正在做的事情。我正在使用自定义域为我的非公开 s3 存储桶资源生成预签名 URL。

https://files.customdomain.com/file123?AWSAccessKeyId=XXX&Expires=1541220685&Signature=XXXX

另外,为了添加证书,我为具有以下原始设置的存储桶创建了一个 Cloudfront 发行版

源域名:bucket-name.s3.amazonaws.com 源 ID:s3.bucket-name 限制存储桶访问:否

但我无法访问我的资源。抛出访问被拒绝错误。任何帮助,将不胜感激。

小智 8

有两种情况:

  1. 如果您的存储桶有常规名称。

在这种情况下,您应该使用 CloudFront 访问您的存储桶。就像上面提到的,URL 在这个答案中看起来像这样:

https://cloudfront-url/file123?AWSAccessKeyId=XXX&Expires=1541220685&Signature=XXXX

  1. 如果您的存储桶有 s3 静态网站名称。

在这种情况下,您的存储桶名称类似于 files.customdomain.com,您可以为此存储桶生成预签名的 url:

https://files.customdomain.com/file123?AWSAccessKeyId=XXX&Expires=1541220685&Signature=XXXX

在您的 DNS 中,您将有CNAME files.customdomain.com指向files.customdomain.com.s3.[bucket-region].amazonaws.com。

注意

当我通过 aws-cli 生成预签名 URL 时:

aws s3 presign s3://files.customdomain.com/file123 --endpoint-url https://files.customdomain.com
Run Code Online (Sandbox Code Playgroud)

我在路径中获得具有重复存储桶名称的 URL: https: //files.customdomain.com/files.customdomain.com/file123 ?AWSAccessKeyId=XXX&Expires=1541220685&Signature=XXXX

代替:

https://files.customdomain.com/file123?AWSAccessKeyId=XXX&Expires=1541220685&Signature=XXXX

我不知道它是否通过 SDK 具有相同的行为。


Yoh*_*han 3

我找到了这个问题的解决方案。需要从 s3 存储桶为 cloudfront url 端点生成签名 url。因此, 它需要是 https://cloudfront-url/file123?AWSAccessKeyId=XXX&Expires=1541220685&Signature=XXXX,而不是
https://files.customdomain.com/file123?AWSAccessKeyId=XXX&Expires=1541220685&Signature=XXXX

DNS 记录必须将自定义域解析为 cloudfront url。

  • 这种方法有效,主要是偶然的,但只要您了解几个重要的限制,它就会“有效”:(1) 仅当存储桶位于爱尔兰和弗吉尼亚等较旧的(2014 年之前)AWS 区域之一时,它才有效。 ,而不是伦敦和俄亥俄州等较新的地区...并且 (2) 所有请求都将缓存未命中,除非*相同的*签名 URL(相同的密钥、过期和签名)被多个客户端重复使用。CloudFront 不允许从缓存中提供不同的 S3 签名 URL,因为它无法验证身份验证,因此在首次使用时,它必须将每个唯一 URL 一路转发回 S3。 (4认同)