Alv*_*nte 5 php amazon-s3 amazon-ec2 amazon-web-services
我在Amazon EC2实例中部署了一个REST服务器.我还配置了一个Amazon S3存储桶来存储用户在与API交互时生成的所有数据.存储的主要信息是图像.用户可以通过某些URL和凭据执行PUT HTTP请求来上载图像.PUT请求可以通过EC2实例完成,因为上传需要被授权并且用户不能直接访问S3实例.当EC2收到有效的PUT申请时,我使用AWS PHP SDK将对象上传到S3存储桶.我使用的方法是putObject.对于第一部分,我认为没有其他选择.但是,为了允许用户下载以前的上传,我有两种不同的选择:
第一个是向用户提供带有指向S3桶密钥的文件的URL,因为文件是以公共方式上载的.因此,用户可以直接从S3服务器下载映像,而无需与EC2进行任何交互.
第二个是使用EC2实例上运行的REST API在执行一些HTTP GET请求时提供图像内容.在这种情况下,我应该使用AWS PHP SDK从S3服务器"下载"图像并将其返回给用户.使用的方法是getObject.
对我来说似乎很脏的另一个可能的解决方案是提供从EC2实例到S3存储桶URL的HTTP重定向,但是,用户客户端应该实现两个连接以检索简单映像(如果用户在移动设备上工作则是一件坏事) ).
我已经实现了第二个选项,似乎工作正常.
我的问题是:如果通过REST API从EC2实例访问文件,从S3实例下载内容,则会假设直接访问带有DNS服务器URL的文件会产生很大的开销.两个实例都在同一区域(爱尔兰)运行.我不知道如何根据带宽计算从S3到EC2(或反之亦然)的传输.来自S3-EC2用户的转移是否会比S3用户计算两倍?这种转移是通过某种局域网完成的吗?
我更喜欢第二种方式,因为我可以控制内容访问,记录访问每个文件的人,更改存储桶对用户是透明的,等等.
谢谢!
这些实际上是多个问题合二为一的问题,但我会尽力回答它们。
您可以将上传设置为直接发送到 S3,无需通过 EC2 实例,同时仍然能够在上传发生之前对上传进行身份验证。将使用直接向 S3发出 POST 请求来执行上传。为了让它工作,您需要附加一个策略并签署该请求(EC2 上的代码将生成策略和签名)。有关更详细的指南,请参阅使用 HTML POST 浏览器上传到 S3。
通过 EC2 实例代理 S3 内容肯定会增加一些开销,但效果实际上取决于应用程序的规模。如果您每秒代理几个请求并且文件较小,则开销很可能不会很明显。如果您每秒有数百个请求,那么通过单个 EC2 实例代理它们将无法真正工作(即使您的实例可以处理流量,您也可能会遇到 S3slow down
错误)。
同一区域中的 EC2 和 S3 之间的连接足够快,当然比外部主机和 S3 之间的任何连接快得多。
区域内的数据传输不计费,因此您的 S3-EC2 用户传输费用与 S3 用户传输费用相同。
如果您需要处理大流量,我建议使用查询字符串身份验证来生成 S3 对象的签名 URL,然后从下载代码重定向到这些签名 URL。
归档时间: |
|
查看次数: |
1911 次 |
最近记录: |