亚马逊s3:直接上传与预先签名的网址

时间:2018-04-03 08:48:21

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

我正在使用AWS SDK for .NET,我正在寻找一种让用户直接上传到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传递给客户端,让他将PUT对象直接发送到存储桶(与浏览器上传相比,它似乎也很轻松,因为它不需要浏览器上传所需的所有密钥。)

但我想知道为什么实际上有两种不同的方法。每个人的PRO和CONS是什么?

2 个答案:

答案 0 :(得分:2)

无论您是想使用REST API还是使用AWS软件开发工具包与S3进行交互,它都完全可以说明问题。

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

a)如果您要使用REST API,要证明身份,您需要使用'来签署您的请求。 AWS Signature version 4' (已弃用版本2也存在),其中包括三种方法(您已列出的方法)

  1. 验证请求:使用授权标头(AWS签名版本4)
  2. 验证请求:使用查询参数(AWS签名版本4)
  3. 验证请求:使用POST的基于浏览器的上载(AWS签名版本4)
  4. b)如果您要使用AWS软件开发工具包,则应让SDK执行签名仪式(流程)。因此,选择直接使用SDK来签署请求

      

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

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

    string url = s3Client.GetPreSignedURL(request);
    

答案 1 :(得分:0)

我发现的主要区别是内存消耗。如果你上传相同的图像(46KB)200次(作为测试/基准),内存消耗差别很大。

任何版本PutObject AWSSDK.Core 3.3.21.19的{​​{1}}需要116MB(SOH:66MB / LOH:50MB

任何版本PutObject AWSSDK.Core 3.3.21.19的{​​{1}}需要99MB(SOH:98MB / LOH:0.4MB

如果您在UseChunkEncoding上将false设置为PutObjectRequest,则可以进一步降低内存消耗: -

PutObject设置为UseChunkEncoding的{​​p> false需要52MB(SOH:52MB / LOH:0.4MB

但从记忆的角度来看,GetPreSignedURL仍然更好;

GetPreSignedURL需要32MB(SOH:32MB / LOH:0.4MB

如果您经常拨打PutObject,那么如果出现问题,切换到GetPreSignedURL以节省内存可能会有所帮助。缺点是你负责重试机制等。

我们在代码库中的任何地方都使用PutObject,除了一个代码路径非常热并且每天达到800,000次以上的地方。在这种情况下,将其切换为GetPreSignedURL

是有意义的

希望有所帮助!