以下是我在做什么。我正在使用自定义域为不公开的s3存储桶资源生成预签名URL。
https://files.customdomain.com/file123?AWSAccessKeyId=XXX&Expires=1541220685&Signature=XXXX
还要添加证书,我已经为具有以下原始设置的存储桶创建了Cloudfront发行版
原始域名:bucket-name.s3.amazonaws.com 来源ID:s3.bucket-name 限制存储桶访问:否
但是我无法访问我的资源。引发访问被拒绝错误。任何帮助,将不胜感激。
答案 0 :(得分:2)
有两种情况:
在这种情况下,您应该使用 CloudFront 访问您的存储桶。 就像上面提到的 URL 在 this answer 中的样子:
https://cloudfront-url/file123?AWSAccessKeyId=XXX&Expires=1541220685&Signature=XXXX
在这种情况下,您的存储桶名称类似于 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网址。