我已经在 Amazon EC2 实例中部署了一个 REST 服务器。我还配置了一个 Amazon S3 存储桶来存储用户在与 API 交互时生成的所有数据。存储的主要信息是图像。用户可以通过对特定 URL 和凭据执行 PUT HTTP 请求来上传图像。 PUT 请求可以通过 EC2 实例完成,因为上传需要授权并且用户不能直接访问 S3 实例。当 EC2 收到有效的 PUT 请求时,我使用 AWS PHP SDK 将对象上传到 S3 存储桶。我使用的方法是putObject。对于第一部分,我认为没有更多选择。但是,为了允许用户下载以前上传的内容,我有两种不同的选择:
第一个是为用户提供指向文件的 url 到 S3 存储桶 key ,因为文件是以公开方式上传的。所以 用户可以直接从 S3 服务器下载图像,无需任何 与 EC2 交互。
第二个是使用运行在 EC2 实例上的 REST API 来 在执行一些 HTTP GET 请求时提供图像内容。在这个 如果我应该使用 AWS PHP SDK 从 S3“下载”图像 服务器并将其返回给用户。使用的方法是 获取对象。
另一种对我来说似乎很肮脏的可能解决方案是提供一个 HTTP 从 EC2 实例重定向到 S3 存储桶 url,但随后,用户 客户端应该实现两个连接来检索一个简单的图像(一个 如果用户在移动设备上工作,这是一件坏事)。
我已经实现了第二个选项并且似乎工作正常。
我的问题是:如果通过 REST API 从 EC2 实例访问文件,从 S3 实例下载内容,那么与使用 S3 服务器的 url 直接访问文件相比,开销会很大.这两个实例都在同一区域(爱尔兰)运行。我不知道如何根据带宽计算从 S3 到 EC2(或反之亦然)的传输。来自 S3-EC2-user 的传输会比 S3-user 计算两倍吗?这种传输是通过某种局域网完成的吗?
我更喜欢第二种方式,因为我可以控制内容访问、记录谁在访问每个文件、更改存储桶对用户来说是透明的,等等。
谢谢!
最佳答案
这些实际上是多个问题合二为一,但我会尽力回答。
您可以将上传设置为直接转到 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 对象生成签名 URL,然后从您的下载代码中重定向到这些签名 URL。
关于php - Amazon EC2、S3、REST API,以及如何正确地向用户提供内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18679350/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/