【问题标题】:public-ish write access to S3 bucket with file size limiting对具有文件大小限制的 S3 存储桶的公开写访问权限
【发布时间】:2018-09-03 06:37:09
【问题描述】:

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

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

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

经过进一步研究,我看到了以下选项:

  • a) 创建一个 lambda 端点我将文件上传到该端点

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

  • b) 创建一个生成签名的 POST 策略

    的 lambda 端点

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

  • c) 创建一个 生成预签名 URL 的 lambda 端点

    和 b) 差不多。

问题

  • 推荐的方法是什么/每种方法的优缺点是什么?
  • 使用签名的 POST 策略和预签名的 URL 之间有实际区别吗?尤其是考虑到预签名 URL 无论如何都使用相同的 POST 策略。

【问题讨论】:

  • POST 策略要求用户拥有 IAM 凭证。使用预签名 URL,您可以与没有 IAM 凭证的任何用户共享该 URL,并且他们可以上传/下载文件。所以例如如果您希望您的客户将文件上传到您的 S3 存储桶但不想创建 AWS IAM 用户。您可以根据需要 IAM 凭据的 POST 策略生成预签名 URL。
  • 另请参阅此答案:stackoverflow.com/a/31419311/119861

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


【解决方案1】:

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

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

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

    最后我决定使用 pre-signed POSTs 并拒绝其他两个,原因如下:

    • a) lambda 上传:我已经想要 S3 API 原生提供的东西,所以我必须自己实现所有验证,这都是潜在的问题来源,以及长期的额外维护,特别是如果我要选择不同的 API。然而,如果有一些非常复杂的验证场景无法用声明性条件表达,那么这将是可行的方法。

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

    使用 pre-signed POST 我总是会收到失败的实际原因——无论是缺少/额外的键还是条件不匹配,这从调试和处理的角度都很有用—— - 我可以对每种情况做出不同的反应。 (请注意,如果我想对用户隐藏信息,可以考虑使用预签名 URL,当然要以调试/处理为代价。)

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 2019-07-14
      • 2014-10-21
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2022-08-12
      • 2019-06-18
      • 2019-04-23
      相关资源
      最近更新 更多