6

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

  • 第一个是向用户提供指向 S3 存储桶密钥的文件的 url,因为文件是以公共方式上传的。因此用户可以直接从 S3 服务器下载图像,无需与 EC2 进行任何交互。

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

  • 另一个对我来说似乎很脏的可能解决方案是提供从 EC2 实例到 S3 存储桶 url 的 HTTP 重定向,但是,用户客户端应该实现两个连接来检索一个简单的图像(如果用户在移动设备上工作,这是一件坏事)。

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

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

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

谢谢!

4

1 回答 1

2

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

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

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

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

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

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

于 2013-09-10T10:20:04.577 回答