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

时间:2013-09-08 00:55:58

标签: php amazon-web-services amazon-s3 amazon-ec2

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

  • 第一个是为用户提供一个指向文件的网址 到文件桶密钥,因为文件是以公共方式上传的。所以 用户无需任何直接从S3服务器下载映像 与EC2的互动。

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

  • 另一种可能对我来说很脏的解决方案是提供一个 HTTP从EC2实例重定向到S3存储桶URL,然后是用户 客户端应该实现两个连接来检索一个简单的图像(a 如果用户正在通过移动设备工作,那就太糟糕了。)

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

这些实际上是多个问题合二为一,但我会尝试回答它们。

  1. 您可以将上传设置为直接转到S3,而不通过您的EC2实例,同时仍然可以在上传之前对其进行身份验证。上传将使用POST request直接执行到S3。要使其工作,您需要附加策略并签署该请求(您的EC2上的代码将生成策略和签名)。有关更详细的指南,请参阅Browser Uploads to S3 using HTML POST

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

  3. 同一地区的EC2和S3之间的连接速度足够快,肯定比外部主机和S3之间的任何连接快得多。

  4. 区域内的数据传输不需要付费,因此您的S3-EC2用户转移费用与S3用户转移费用相同。

  5. 如果您需要处理大量流量,建议您使用Query String Authentication为S3对象生成签名网址,然后从下载代码重定向到这些已签名的网址。