AWS技术博客宝典: 如何怎么样在亚马逊AWS EC2实例上使用Amazon API Gateway 搭建、管理和部署Restful API接口

   10/30/2016 11:21 am   大 中 小 简体 繁體 字体:
1 颗星2 颗星3 颗星4 颗星5 颗星 (点击来评价哦~_~)
    306人参与

对于刚接触AWS(亚马逊网络服务)的人来说,学习起来难度相当大。我们觉得亚马逊是一种用来运行API(应用编程接口)的出色平台,因为你可以全面控制应用程序堆栈。

Amazon API Gateway 是一种完全托管的服务,可以帮助开发者轻松创建、发布、维护、监控和保护任意规模的 API。只需在 AWS 管理控制台中点击几下,您便可以创建可充当应用程序“前门”的 API,从后端服务访问数据、业务逻辑或功能,例如基于 Amazon Elastic Compute Cloud (Amazon EC2) 运行的工作负载、基于 AWS Lambda 运行的代码或任意 Web 应用。Amazon API Gateway 负责管理所有任务,涉及接受和处理成千上万个并发 API 调用,包括流量管理、授权和访问控制、监控以及 API 版本管理。Amazon API Gateway 没有最低费用或启动成本,您只需为收到的 API 调用和传输出去的数据量付费。

简化 API 开发

Amazon API Gateway 使您可以同时运行同一 API 的多个版本,从而使您能够快速迭代、测试和发布新版本。

灵活的安全控制机制

API Gateway 可为您提供可以授权访问 API 和控制服务操作的工具。您可以使用多种 AWS 管理和安全工具(比如 AWS Identity and Access Management (IAM) 和 Amazon Cognito)来对 API 的访问进行授权。Amazon API Gateway 可以使用 AWS 用于自身 API 的技术来代表您验证签名的 API 调用。如果您已在使用 OAuth 令牌或其他授权机制,则 Amazon API Gateway 可以使用 AWS Lambda 执行自定义授权命令,以便帮助您验证传入请求。

为现有服务创建 RESTful 端点

通过 Amazon API Gateway,您可以基于新式资源创建新的 API,然后使用灵活的动态数据转换功能以您的目标服务希望使用的语言生成请求。API Gateway 还可设置限制规则来避免在不可预测的流量峰值期间耗尽后端基础设施资源,从而帮助您保护现有服务的安全。

现在,我们将开始构建和配置亚马逊EC2实例。要是你已经有了EC2实例(无论是不是微型实例),就可以直接跳到下一步:准备部署的实例。

构建和配置EC2实例

首先不妨注册亚马逊弹性计算云(Amazon EC2)。就我们的要求而言,免费服务http://aws.amazon.com/free/就够用了,它可以满足所有的基本要求。一旦设立好了帐户,进入到AWS管理控制台下面的EC2仪表板,点击Launch Instance(启动实例)按钮。这会让你进入到一个弹出窗口,你可以在里面继续下一步:

•选择经典向导。

•选择AMI(Ubuntu Server 12.04.1 LTS 32位和微型实例),Instance Details(实例细节)的其他所有设置都不用改动,随它保持默认值。

•创建密钥对,并下载密钥对――这将是你用来与服务器之间建立SSH连接的密钥对,密钥对非常重要!

•为防火墙添加入站规则,源地址始终是0.0.0.0/0(HTTP、HTTPS、ALL ICMP和Ruby Thin服务器使用的TCP端口3000)。

准备部署的实例

现在,我们已让实例构建并运行起来,我们可以直接通过控制台来连接(Windows用户可以通过PuTTY来连接)。鼠标右击实例,连接实例,并选择Connect with a standalone SSH Client(使用独立的SSH客户端来连接)。

AWS Web操作界面

 

逐步完成下列步骤,在给出的实例中将用户名改成ubuntu(而不是root)。

AWS 命令行cli操作界面

完成这一步后,你就连接到了实例。我们还需要安装新的软件包。一些软件包需要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 git@github.com: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)。

AWS EC2实例操作仪表板

如果还想使用Nginx,你需要创建一个弹性IP地址。在AWS EC2仪表板里面,在与实例相同的区域里面创建弹性IP,并将该IP与它关联起来(你没必要为弹性IP花一分钱,只要它与你同一区域里面的实例关联起来)。

AWS EC2仪表板

选项:如果你想为亚马逊实例分配自定义域,就要做一件事:

•将A记录添加到域的DNS记录,以便将该域与你之前创建的那个弹性IP地址对应起来。你的域提供商应该会为你提供设置A记录(IPv4地址)的某种方式,或者它会为你提供编辑域名称服务器的方式。如果提供商不允许你直接设置A记录,找到一项DNS管理服务,在上面将你的域注册为一个区(zone),该服务就会在域提供商的管理面板你提供需要输入的名称服务器。然后,你可以为域添加A记录。一些可能的DNS管理服务包括ZoneEdit(基础版免费)和亚马逊route 53等。

至此,你的API已向世人开放。这既是好事又是坏事――说它是好事,是因为可以与人共享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配置仪表板

设好API后端部分的地址――这必须是个弹性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绕过了任何访问控制机制。

要是Nginx配置方面遇到了一些问题,或者需要介绍更详细的指南,我鼓励你阅读配置Nginx代理系统方面的这篇指南文章:

https://support.3scale.net/howtos/api-configuration/nginx-proxy。

你完全可以对你的API网关进行定制。如果你想深入探究3scale的系统配置(比如用法和API流量的监控),欢迎浏览“快速入门”指南(https://support.3scale.net/get-started/fast-track-integration)和实用指导(https://support.3scale.net/howtos/basics#manage-admins)。

关键词: , , , , , , , , 

最多人阅读内容