我有使用S3起源的CloudFront。我希望能够生成签名的URL,以便通过CloudFront发行版将值上传到S3。
我一直在仔细研究文档,但是对此一无所获。我以为只要传递查询参数,情况就是这样吗?
答案 0 :(得分:2)
是的,您可以使用 CloudFront 分配来提取 S3 文件上传。
根据您的设置,S3 Transfer Acceleration suggested in another answer 可能仍然是更好的选择,它当然有更好的文档和更多的实现示例!
s3:GetObject
访问权限)作为起点,但我们无论如何都会将其添加/更改为 s3:PutObject
。POST
XXXXX
是 OAI ID,而 YOUR-TARGET-BUCKET
是您的目标存储桶:< /li>
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXX"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR-TARGET-BUCKET/*"
}
]
}
s3:PutObject
作为允许的操作,但如果您将分发设置为仅用于内容摄取(即通过另一个分发提供,或者根本不公开提供)您可以替换允许的操作: "Action": "s3:PutObject",
更新分配后,您就可以使用 Postman 或其他方式向 PUT
发出 https://your-distribution-url/desired-s3-key-name
请求,从而将文件添加到您的存储桶中。如果您已配置,请记住在此处使用签名网址。
您的客户端与 CF 边缘的连接应该始终更快,而 S3 加速 speed comparison 并不总是有利的。
如果我正确理解 AWS 定价,您将需要支付“Regional Data Transfer Out to Origin”($0.02-$0.16/GB,具体取决于区域)与 S3 Transfer Acceleration 的费用($0.04-$0.08/GB,具体取决于区域)。 )
答案 1 :(得分:0)
原因是要为来自世界各地的用户将文件上传到中央存储桶提供低延迟的访问吗?在这种情况下,我建议使用S3传输加速代替。
您可能想在存储桶上使用Transfer Acceleration进行各种操作 原因,包括以下内容:
您的客户从世界各地上传到集中式存储桶。
您可以在各大洲之间定期将千兆字节的数据传输到TB的数据。
上传到Amazon S3时,您将无法利用Internet上的所有可用带宽。
https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html
Amazon S3传输加速是在场景下使用Cloudfront。
Transfer Acceleration充分利用了Amazon CloudFront的全球优势 分布的边缘位置。当数据到达边缘位置时, 数据通过优化的网络路径路由到Amazon S3。
答案 2 :(得分:0)
我想只要传递查询参数,是这样吗?
不完全是。可以将CloudFront配置为传递查询字符串参数,但是它仍然不支持此用例,因为CloudFront在发送给S3的请求中注入了X-Amz-Cf-Id
头。因为标头以X-Amz-*
开头,所以S3要求对其进行签名...但这是不可能的,因为您无法知道其值。
可以授予CloudFront原始访问身份写入存储桶的权限,但这也很麻烦,因为那时CloudFront可以读取的任何路径也可以写入-CloudFront签名的URL允许“访问”-不管是哪种类型如果CloudFront通过OAI允许写入存储桶,则CloudFront本身具有访问权限-并且不能将其配置为只读。
Transfer Acceleration是更好的解决方案,因为它使用CloudFront网络进行传输,但是可以理解本机S3签名的URL。您想要在Lambda函数中使用域名而不是存储桶名称来对URL进行签名的论点失败了……因为您在任何情况下都无法对S3 URL进行签名,而实际上并不知道存储桶名称。