是否通过签名URL通过CloudFront上传到S3?

时间:2019-03-13 17:57:43

标签: amazon-web-services amazon-cloudfront

我有使用S3起源的CloudFront。我希望能够生成签名的URL,以便通过CloudFront发行版将值上传到S3。

我一直在仔细研究文档,但是对此一无所获。我以为只要传递查询参数,情况就是这样吗?

Not a duplicate of this: I'm using signed URLs.

3 个答案:

答案 0 :(得分:2)

是的,您可以使用 CloudFront 分配来提取 S3 文件上传。

根据您的设置,S3 Transfer Acceleration suggested in another answer 可能仍然是更好的选择,它当然有更好的文档和更多的实现示例!

创建一个新的 CF 发行版

  • 使用目标 S3 存储桶作为源
  • 配置源 S3 存储桶访问以使用 CloudFront 源访问身份。虽然您可以自动更新存储桶策略(具有 s3:GetObject 访问权限)作为起点,但我们无论如何都会将其添加/更改为 s3:PutObject
<块引用>

Configure S3 bucket access to use a CloudFront origin access
identity

  • 配置“允许的 HTTP 方法”以包含 POST
<块引用>

Configure allowed HTTP methods

  • 我们将允许写入存储桶,因此最好“限制查看者访问”并要求 CloudFront signed URLs 或签名 Cookie 进行访问。
<块引用>

Require signed URLs or cookies

配置 S3 存储桶策略

  • 如果您开始使用上述自动更新的存储桶策略,则您的存储桶策略应包含如下内容,其中 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",

使用 CloudFront 分配将文件上传到 S3

更新分配后,您就可以使用 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进行签名,而实际上并不知道存储桶名称。