我在 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 计算两倍?这种传输是通过某种局域网完成的吗?
我更喜欢第二种方式,因为我可以控制内容访问、记录谁在访问每个文件、更改存储桶对用户来说是透明的,等等。
谢谢!