【问题标题】:Amazon s3: direct upload vs presigned url亚马逊 s3:直接上传与预签名 url
【发布时间】:2018-09-12 12:42:36
【问题描述】:

我正在使用适用于 .NET 的 AWS 开发工具包,我正在寻找一种让用户直接上传到 s3 存储的方法。

我遇到了 aws 提供的两种不同方式:

基于浏览器的上传:https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html

和预签名的网址:https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjectPreSignedURLDotNetSDK.html

似乎预签名的 url 更容易,因为 aws sdk 中已经存在一个方法来生成一个 url 传递给客户端,让他将对象直接放入存储桶(与浏览器上传相比,它似乎也很轻松,因为它不需要浏览器上传所需的所有密钥在帖子表单中)。

但我想知道为什么实际上有两种不同的方法。各有什么优缺点?

【问题讨论】:

    标签: c# amazon-web-services amazon-s3


    【解决方案1】:

    无论您是想使用 REST API 还是 AWS 开发工具包与 S3 交互,这都归结为重点。

    在这两种情况下,您都需要证明(身份验证/签名请求)您的身份,除非存储桶是公开的。

    a) 如果您使用 REST API,为了证明身份,您需要使用“AWS Signature version 4”(已弃用的版本 2 也存在)对您的请求进行签名,其中包括三种方法(一种你已经列出了)

    1. 验证请求:使用授权标头(AWS 签名版本 4)
    2. 验证请求:使用查询参数(AWS 签名版本 4)
    3. 验证请求:使用 POST(AWS 签名版本 4)基于浏览器的上传

    b) 如果您要使用 AWS SDK,您应该让 SDK 进行签名仪式(过程)。所以选择直接使用 SDK 来签署请求

    (部分问题)与浏览器上传相比,它似乎也很轻松,因为它不需要浏览器上传所需的所有密钥 p>

    对于下面的代码,s3Client 已经获得了您的信任,无论是来自 AWS-CLI-Profile(如果运行本地/笔记本电脑)、IAM 角色(如果是 EC2、lambda 等)

    string url = s3Client.GetPreSignedURL(request);
    

    【讨论】:

    • 那么,如果我已经在使用 .net sdk,那么 presignedurl 是否可行?我可以使用 presignedurl 设置最大文件大小吗?
    • 要走的路> => 是的。最大文件大小 => stackoverflow.com/questions/25991275/…
    • 所以没有带有签名网址的预上传方法。我已经计划使用 lambda 来调整上传的图像大小,所以我想我会坚持使用它添加一些完整性检查(我想我必须检查它们是真实图像,没有病毒或类似的东西)
    【解决方案2】:

    我发现的主要区别是内存消耗。如果您将同一张图片 (46KB) 上传 200 次(作为测试/基准),内存消耗会大不相同。

    PutObject3.3.21.19 以下的任何版本的AWSSDK.Core 一起使用116MB(SOH:66MB / LOH:50MB

    PutObject3.3.21.19 以上任何版本的AWSSDK.Core 一起使用99MB(SOH:98MB / LOH:0.4MB

    如果在PutObjectRequest上将UseChunkEncoding设置为false,可以进一步减少内存消耗:-

    PutObjectUseChunkEncoding 设置为 false 采用 52MB(SOH:52MB / LOH:0.4MB

    但是GetPreSignedURL从记忆的角度来看还是更好的;

    GetPreSignedURL 接受32MB(SOH:32MB / LOH:0.4MB

    如果您经常打电话给PutObject,那么在出现问题时切换到GetPreSignedURL 以节省内存可能是有益的。缺点是您负责重试机制等。

    我们在代码库中的任何地方都使用PutObject,除了一个代码路径非常热且每天被点击大约 800,000 次的地方。在这种情况下,将其切换为 GetPreSignedURL 是有意义的。

    希望有帮助!

    【讨论】:

    • GetPreSignedURL 比用户上传到您的 Web 服务器然后手动将对象放入 s3 更好,从而节省带宽、内存和 cpu 使用率。我在问自己在 presignedurls 和基于浏览器的上传之间使用哪种方式。似乎 presignedurl 由 sdk 管理(我已经在使用),所以我可能会使用它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2015-11-01
    • 2021-09-17
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多