代码之家  ›  专栏  ›  技术社区  ›  Peter Uhnak

对S3存储桶的公共ish写访问,并限制文件大小

  •  1
  • Peter Uhnak  · 技术社区  · 8 年前

    我想提供对S3 bucket的公共ish写访问,但可以选择限制上传大小。

    通过bucket策略启用对bucket的公共写访问是不够的,因为没有这样的策略 s3 condition 限制上载大小。

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

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

    • (a) 创建lambda端点 我将文件上载到其中

      lambda函数将验证文件大小,并将文件复制到S3 bucket。文件大小限制很小(最多~ MB),因此lambda执行时间限制应该不会有问题。

    • (b) 创建一个lambda端点 生成签名后策略

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

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

      与b)基本相同。

    问题 :

    • 推荐的方法是什么/每种方法的优缺点是什么?
    • 使用签名后策略和预签名URL之间有实际区别吗?特别是考虑到预签名的URL无论如何都使用相同的POST策略。
    2 回复  |  直到 6 年前
        1
  •  1
  •   Peter Uhnak    8 年前

    最后我决定 预先签署的帖子 并出于以下原因拒绝其他两项:

    • a) lambda上传: 我已经想要S3 API本机提供的东西,所以我必须自己实现所有验证,这既是潜在的问题来源,也是长期的额外维护,特别是如果我选择不同的API。尽管如此,如果有一些非常复杂的验证场景无法用声明性条件表示,那么这将是一条必须走的路。

    • c) 预签名URL: 原则上,这与预签名帖子相同,但有一个主要区别:它无法调试。预签名的URL不再包含策略信息。因此,无论我是会犯错误,还是会打破条件,结果都是一样的:提供的数据的签名与预先签名的数据不匹配,因此它会失败,我也不知道为什么。

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

        2
  •  0
  •   Kannaiyan    8 年前

    您可以在预签名帖子中指定内容长度,

    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将失败。

    希望有帮助。