我想提供对S3存储桶的公共写入权限,但可以选择限制上传大小。
通过存储桶策略启用对存储区的公共写入权限是不够的,因为没有限制上传大小的s3 condition。
另一个推荐的解决方案是使用带有content-length-range
的签名POST policy,但我不能直接使用它,因为该策略需要一个到期日期,这显然会针对每个请求进行更改。我无法使用实际凭据部署(桌面)应用程序,这意味着我无法签署策略。
进一步研究后,我看到以下选项:
a)创建我上传文件的lambda端点
lambda函数将验证文件大小,并将文件复制到S3存储桶。文件大小限制很小(最多约MB),因此lambda执行时间限制应该不是问题。
b)创建生成签名POST策略的lambda端点
上传文件将导致两个请求:(1)发出GET请求以获取新的签名策略,以及(2)使用检索到的策略将文件直接上传到S3。
c)创建生成预签名网址的lambda端点
与b)非常相似。
问题:
答案 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,当然是以调试/处理为代价。)