AWS宝典:如何在亚马逊EC2上部署API?
就该教程而言,你需要基于Ruby的运行中API和Thin服务器。要是没有这样一个API,你只要克隆示例软件库,如下所述(参阅“部署应用程序”部分)。
现在,我们将开始构建和配置亚马逊EC2实例。要是你已经有了EC2实例(无论是不是微型实例),就可以直接跳到下一步:准备部署的实例。
构建和配置EC2实例
首先不妨注册亚马逊弹性计算云(Amazon EC2)。就我们的要求而言,免费服务http://aws.amazon.com/free/就够用了,它可以满足所有的基本要求。一旦设立好了帐户,进入到AWS管理控制台下面的EC2仪表板,点击Launch Instance(启动实例)按钮。这会让你进入到一个弹出窗口,你可以在里面继续下一步:
•选择经典向导。
•选择AMI(Ubuntu Server 12.04.1 LTS 32位和微型实例),Instance Details(实例细节)的其他所有设置都不用改动,随它保持默认值。
•创建密钥对,并下载密钥对DD这将是你用来与服务器之间建立SSH连接的密钥对,密钥对非常重要!
•为防火墙添加入站规则,源地址始终是0.0.0.0/0(HTTP、HTTPS、ALL ICMP和Ruby Thin服务器使用的TCP端口3000)。
准备部署的实例
现在,我们已让实例构建并运行起来,我们可以直接通过控制台来连接(Windows用户可以通过PuTTY来连接)。鼠标右击实例,连接实例,并选择Connect with a standalone SSH Client(使用独立的SSH客户端来连接)。
逐步完成下列步骤,在给出的实例中将用户名改成ubuntu(而不是root)。
完成这一步后,你就连接到了实例。我们还需要安装新的软件包。一些软件包需要root登录资料(凭证),所以你需要设置一个新的root密码:sudo passwd root。然后以root用户身份登录:su root。
现在已有了root登录资料,执行:
sudo apt-get update
使用exit命令切换回到普通用户,并安装所有的必需软件包:
•安装rvm、ruby和git需要的一些库:
sudo apt-get install build-essential git zlib1g-dev libssl-dev libreadline-gplv2-dev
imagemagick libxml2-dev libxslt1-dev openssl zlib1g libyaml-dev libxslt-dev autoconf libc6-
dev ncurses-dev automake libtool bison libpq-dev libpq5 libeditline-dev
sudo apt-get install libreadline6 libreadline6-dev
•安装git(在Linux上,而不是来自源文件):http://www.git-scm.com/book/en/Getting-Started-Installing-Git
•安装rvm:https://rvm.io/rvm/install/
•安装ruby
•rvm install 1.9.3
•rvm use 1.9.3 --default
部署应用程序
我们的示例Sentiment API位于Github上。试着克隆软件库:
git clone [email protected]:jerzyn/api-demo.git
你可以在这里再次审查构建和部署该应用程序方面的代码及教程:
http://www.3scale.net/2012/06/the-10-minute-api-up-running-3scale-grape-heroku-api-10-minutes/
还有这里:
http://www.3scale.net/2012/07/how-to-out-of-the-box-api-analytics/
要注意其中的变化(我们使用的只是v1,因为代理系统需要完成验证)。
现在你可以部署应用程序,只要运行命令:bundle install.
现在你可以开启Thin服务器:thin start.
想直接访问API(即没有任何安全或访问控制):your-public-dns:3000/v1/words/awesome.json(你可以在实例细节窗口中的AWS EC2仪表板>实例中找到你的公共DNS)。
如果还想使用Nginx,你需要创建一个弹性IP地址。在AWS EC2仪表板里面,在与实例相同的区域里面创建弹性IP,并将该IP与它关联起来(你没必要为弹性IP花一分钱,只要它与你同一区域里面的实例关联起来)。
选项:如果你想为亚马逊实例分配自定义域,就要做一件事:
•将A记录添加到域的DNS记录,以便将该域与你之前创建的那个弹性IP地址对应起来。你的域提供商应该会为你提供设置A记录(IPv4地址)的某种方式,或者它会为你提供编辑域名称服务器的方式。如果提供商不允许你直接设置A记录,找到一项DNS管理服务,在上面将你的域注册为一个区(zone),该服务就会在域提供商的管理面板你提供需要输入的名称服务器。然后,你可以为域添加A记录。一些可能的DNS管理服务包括ZoneEdit(基础版免费)和亚马逊route 53等。
至此,你的API已向世人开放。这既是好事又是坏事DD说它是好事,是因为可以与人共享API;说它是坏事,是因为要是不实行速率限制(rate limit),几个应用程序就会耗尽你服务器的资源,而且你也不知道谁在使用你的API、API在如何使用。解决办法就是,为你的API添加一些管理功能。
借助3scale启用API管理功能
我们将充分利用使用方便的3scale API管理服务,而不是从事重复性工作,从头开始实行速率限制、访问控制和分析。注册获得免费的3scale帐户(http://www.3scale.net/),通过几个提供的链接,激活并登录进入到新实例。你第一次登录时,可以选择这个选项:创建一些示例数据,那样你拥有之后用到的一些API密钥。下一步,你可能要浏览一下系统功能(可选),然后开始实施工作。
想立即获得一些结果,我们就要从开发过程中用到的沙盒代理系统开始入手。然后,我们还将配置Nginx代理系统,它可以扩展规模,以适应标准的生产部署环境。API代理系统的配置方面有一些说明文档,详见:https://support.3scale.net/howtos/api-configuration/nginx-proxy。想了解更高级的配置选项,可以参阅:https://support.3scale.net/howtos/api-configuration/nginx-proxy-advanced。
一旦你进入到了3scale帐户,在主仪表板屏幕上启动你的API,或者进入到API->选择Service ‘API’(服务API)->侧栏中的Integration(集成)->Proxy(代理)。
设好API后端部分的地址DD这必须是个弹性IP地址,除非自定义域已设置好,包括http协议和端口3000。现在,你可以保存并启动沙盒代理系统,通过访问沙盒端点来测试API(在创建了一些应用程序登录资料后): http://sandbox-endpoint/v1/words/awesome.json?app_id=APP_ID&app_key=APP_KEY。其中,APP_ID和APP_KEY是你在首次登录到3scale帐户后创建的其中一个示例应用程序的ID和密钥(如果你错过了帐户创建这一步,只要创建开发者帐户以及该帐户里面的应用程序)。
不用应用程序登录资料试一下,接下来使用不正确的登录资料试一下;然后一旦通过验证,在你定义的任何速率限制范围之内和之外再试一下。只有其表现让你满意,你才需要为Nginx下载配置文件。
注意:一旦遇到错误,就要检查你是否能直接访问API:your-public-dns:3000/v1/words/awesome.json。要是该API不可用,那么你就要检查AWS实例是否在运行、Thin服务器是否在该实例上运行。
部署Nginx代理系统以实现访问控制
为了简化这一步,我们建议你安装出色的OpenResty Web应用程序,它基本上捆绑了标准的Nginx核心以及几乎所有必要的第三方Nginx内置模块。
安装依赖项:sudo apt-get install libreadline-dev libncurses5-dev libpcre3-dev perl
编译和安装Nginx:
•cd ~
•sudo wget http://agentzh.org/misc/nginx/ngx_openresty-1.2.3.8.tar.gz
•sudo tar -zxvf ngx_openresty-1.2.3.8.tar.gz
•cd ngx_openresty-1.2.3.8/
•./configure --prefix=/opt/openresty --with-luajit --with-http_iconv_module -j2
•make
•sudo make install
现在,你可以从3scale代理页面下载Nginx配置文件了;在配置文件中,进行下列更改:
•编辑来自nginx下载的配置文件
•在第28行(上一行是更改服务器名称的信息),输入正确的域(你的弹性IP或自定义域名)
•在第78行,将路径改为指向与配置文件一同下载的.lua文件。
我们几乎大功告成了!最后一个步骤是开启NGINX代理系统,让一些流量通过它。要是它还没有运行(切记:首先得开启那台Thin服务器),务必进入到EC2实例终端(你之前通过SSH连接的那个终端),然后现在开启它:
sudo /opt/openresty/nginx/sbin/nginx -p /opt/openresty/nginx/ -c /opt/openresty/nginx/conf/YOUR-CONFIG-FILE.conf
最后一步将是验证流量正常通过,并通过了应有的验证。为此,访问:
http://your-public-dns/v1/words/awesome.json?app_id=APP_ID&app_key=APP_KEY
其中,APP_ID和APP_KEY是你想通过API调用来访问的那个应用程序的密钥和ID。一旦证实一切都正常运行,你就需要阻止公众通过端口3000对API后端部分进行访问,端口3000绕过了任何访问控制机制。