我在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用户计算两倍?这种转移是通过某种局域网完成的吗?
我更喜欢第二种方式,因为我可以控制内容访问,记录访问每个文件的人,更改存储桶对用户是透明的,等等。
谢谢!
答案 0 :(得分:2)
这些实际上是多个问题合二为一,但我会尝试回答它们。
您可以将上传设置为直接转到S3,而不通过您的EC2实例,同时仍然可以在上传之前对其进行身份验证。上传将使用POST request直接执行到S3。要使其工作,您需要附加策略并签署该请求(您的EC2上的代码将生成策略和签名)。有关更详细的指南,请参阅Browser Uploads to S3 using HTML POST。
通过EC2实例代理S3内容肯定会增加一些开销,但效果实际上取决于应用程序的规模。如果您代理几个请求/秒并且您有小文件,则开销很可能不会非常明显。如果您有数百个请求/秒,那么通过单个EC2实例代理它们将无法正常工作(即使您的实例可以处理您的流量,您可能会遇到S3 slow down
错误。)
同一地区的EC2和S3之间的连接速度足够快,肯定比外部主机和S3之间的任何连接快得多。
区域内的数据传输不需要付费,因此您的S3-EC2用户转移费用与S3用户转移费用相同。
如果您需要处理大量流量,建议您使用Query String Authentication为S3对象生成签名网址,然后从下载代码重定向到这些已签名的网址。