AWS 使用自定义域获得预签名 URL

AWS Get Pre-Signed URL with custom domain

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

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

还要添加证书,我已经为具有以下源设置的存储桶创建了云端分发

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

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

您是否尝试过使用自定义 url var S3 = new AWS.S3({endpoint: 'media.domain.com', s3BucketEndpoint: true}); 初始化 S3 更多信息 https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html 另外,确保签名也正确 https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version 参考:https://github.com/aws/aws-sdk-js/issues/891

将 S3 与 CloudFront 一起使用时,您不需要 S3 签名 URL...您需要 CloudFront 签名 URL。

阅读 CloudFront 开发人员指南中的 Configuring Security and Limiting Access to Content

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

并且 DNS 记录必须将自定义域解析到云端 url。

有两种情况:

  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

我得到 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 具有相同的行为。