【问题标题】:Amazon EC2, S3, REST API, and how to correctly provide contents to usersAmazon EC2、S3、REST API,以及如何正确地向用户提供内容
【发布时间】:2013-09-11 19:51:33
【问题描述】:

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

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

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

  • 在我看来,另一种可能的解决方案是提供一个 从 EC2 实例到 S3 存储桶 URL 的 HTTP 重定向,但随后,用户 客户端应该实现两个连接来检索一个简单的图像(一个 如果用户在移动设备上工作,那就不好了)。

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

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    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 用户传输费用相同。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多