Amazon EC2,S3,REST API以及如何向用户正确提供内容

我在Amazon EC2实例中部署了REST服务器。 我还配置了一个Amazon S3存储桶来存储用户在与API交互时生成的所有数据。 存储的主要信息是图像。 用户可以通过对某些URL和凭证执行PUT HTTP请求来上传图像。 PUT请求可以通过EC2实例完成,因为上传需要授权,用户不能直接访问S3实例。 当EC2收到有效的PUT请求时,我使用AWS PHP SDK将对象上传到S3存储桶。 我使用的方法是putObject。 对于第一部分,我认为没有更多的选择。 不过,为了让用户能够下载以前的上传文件,我有两种不同的选择:

  • 第一个是为用户提供一个带有指向S3 bucket-key的文件的URL,因为文件是以公共方式上传的。 因此,用户可以直接从S3服务器下载图像,而无需与EC2进行任何交互。

  • 第二个是使用在EC2实例上运行的REST API来提供图像内容,同时做一些HTTP GET请求。 在这种情况下,我应该使用AWS PHP SDK从S3服务器“下载”映像并将其返回给用户。 使用的方法是getObject。

  • 另一个对我来说很脏的解决方案是提供一个从EC2实例到S3桶url的HTTP重定向,但是,用户客户端应该实现两个连接来检索一个简单的图像(如果用户正在使用移动设备)。

  • 我已经实施了第二个选项,似乎工作正常。

    我的问题是 :如果通过REST API从EC2实例访问文件,从S3实例下载内容,将会导致直接访问具有到S3服务器的url的文件的大量开销。 这两个实例都在同一个区域运行(爱尔兰语)。 我不知道如何根据带宽计算从S3到EC2的转移(反之亦然)。 来自S3-EC2用户的转移是否会比S3用户计算双倍? 这种传输是通过某种局域网完成的吗?

    我更喜欢第二种方式,因为我可以控制内容访问,记录访问每个文件的人员,更改存储区对用户来说是透明的,等等。

    谢谢!


    这些实际上是将多个问题合并为一个问题,但我会尽力回答它们。

  • 您可以将上传设置为直接转到S3,而无需通过EC2实例传递,同时仍能够在发生上传之前对上传进行身份验证。 上传将使用POST请求直接执行到S3。 为了使其工作,您需要附加一项政策并签署该请求(您的EC2代码将生成政策和签名)。 有关更详细的指南,请参阅使用HTML POST的浏览器上传到S3。

  • 通过EC2实例代理S3内容肯定会增加一些开销,但效果实际上取决于您的应用的规模。 如果代理几个请求/秒并且您有小文件,则开销很可能不会很明显。 如果您有数百个请求/秒,那么通过单个EC2实例代理它们将不会真正起作用(即使您的实例可以处理您的流量,您可能会遇到S3 slow down错误)。

  • EC2和S3之间的连接在同一个区域内速度足够快,肯定比外部主机和S3之间的连接快得多。

  • 一个地区内的数据传输不会收取费用,因此您的S3-EC2用户传输费用与您的S3用户传输费用相同。

  • 如果您需要处理大量流量,我建议使用查询字符串身份验证为您的S3对象生成签名的URL,只需从您的下载代码中重定向到这些签名的URL。

    链接地址: http://www.djcxy.com/p/94617.html

    上一篇: Amazon EC2, S3, REST API, and how to correctly provide contents to users

    下一篇: ios upload file to amazon s3