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

时间:2018-11-03 04:54:29

标签: amazon-web-services amazon-s3 aws-sdk amazon-cloudfront pre-signed-url

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

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

还要添加证书,我已经为具有以下原始设置的存储桶创建了Cloudfront发行版

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

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

4 个答案:

答案 0 :(得分:2)

有两种情况:

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

在这种情况下,您应该使用 CloudFront 访问您的存储桶。 就像上面提到的 URL 在 this answer 中的样子:

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。< /p>

注意

当我通过 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 具有相同的行为。

答案 1 :(得分:1)

您是否尝试过使用自定义网址初始化S3 var S3 = new AWS.S3({endpoint:'media.domain.com',s3BucketEndpoint:true}); 更多信息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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

并且DNS记录必须将自定义域解析为Cloudfront网址。