public-ish写入具有文件大小限制的S3存储桶的访问权限

时间:2018-03-24 19:37:18

标签: amazon-web-services amazon-s3 file-upload aws-lambda

我想提供对S3存储桶的公共写入权限,但可以选择限制上传大小。

通过存储桶策略启用对存储区的公共写入权限是不够的,因为没有限制上传大小的s3 condition

另一个推荐的解决方案是使用带有content-length-range的签名POST policy,但我不能直接使用它,因为该策略需要一个到期日期,这显然会针对每个请求进行更改。我无法使用实际凭据部署(桌面)应用程序,这意味着我无法签署策略。

进一步研究后,我看到以下选项:

  • a)创建我上传文件的lambda端点

    lambda函数将验证文件大小,并将文件复制到S3存储桶。文件大小限制很小(最多约MB),因此lambda执行时间限制应该不是问题。

  • b)创建生成签名POST策略的lambda端点

    上传文件将导致两个请求:(1)发出GET请求以获取新的签名策略,以及(2)使用检索到的策略将文件直接上传到S3。

  • c)创建生成预签名网址的lambda端点

    与b)非常相似。

问题

  • 建议的方法是什么/每种方法的优缺点是什么?
  • 使用签名的POST政策和预先签名的网址之间是否存在实际差异?特别是考虑到预先签名的URL无论如何都使用相同的POST策略。

2 个答案:

答案 0 :(得分:0)

您可以在Presigned帖子中指定内容长度,

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#createPresignedPost-property

https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html

查找Specifying Ranges

我们已经解决了使用lambda为帖子生成预先签名的URL。

  

浏览器 - Lambda(PreSignedPost) - 浏览器 - 将其发布到S3

如果长度范围(最小值和最大值之间)不匹配,则会失败。

希望它有所帮助。

答案 1 :(得分:0)

最后我决定使用预先签名的帖子,并拒绝其他两个,原因如下:

  • a)lambda upload:我本来想要的东西是由S3 API本身提供的,所以我必须自己实现所有的验证,这既是潜在的问题来源,以及长期的额外维护,特别是如果我选择不同的API。然而,如果有一些非常复杂的验证方案无法用声明性条件表达,那么这就必须要走了。

  • c)预签名网址:原则上这与预签名的POST相同,但有一个主要区别:无法调试。预签名URL不再包含策略信息。所以我是否会犯错,或者我会打破条件,结果会是相同的:提供的数据的签名与预先签名的签名不匹配,所以它会失败,我也不会更聪明至于为什么。

使用预先签名的POST 我总是会收到失败的实际原因 - 无论是丢失/额外的密钥还是条件不匹配,这从调试的角度来看都是有用的,以及处理一个 - - 我可以对每种情况作出不同的反应。 (请注意,如果我想隐藏用户的信息,可以考虑预先签名的URL,当然是以调试/处理为代价。)