AWS API Gateway + Lambda 教程 - 生成随机数

非常简单的教程,以产生一定范围内的随机数为例,介绍如何用 AWS Lambda + API Gateway 建立一个 serveless API,包括 API 如何传参。

Overview

如果要用一句话理解 API Gateway,那必须是 serverless APIsAWS API GatewayAWS Lambda 紧密集成,开发者可以通过 API Gateway 创建基于 REST 风格的 API,各种 app 应用调用这些 API,而这些 API 可以通过 AWS Lambda 中运行的代码来调用公开提供的 AWS 服务(or anything you like)。下面两幅图给出了更直观的逻辑。

api%20gateway.png serveless%20apps.png

API Gateway 的优势官方说明说了很多,感觉最大优势除了能够创建完全无服务器的 API 外,值得一提的就是能提供 安全控制机制(security)版本控制(versioning),有兴趣还是看文档吧。

下面来一个简单的例子 randomGenerator,产生 0-10 之间的随机数。网上可以找到一些教程,不过有些并不能 work,有很多坑,感觉是版本问题。主要逻辑就是

1
2
3
4
5
6
API Gateway =>
handle and validate request
pass to lambda function
Lambda execution rule =>
call other aws service OR do something else

相应的,步骤也就是分别配置好 Lambda functionAPI,然后将两者结合起来,结合方法有两种,一是在 Lambda 界面添加 Trigger,连接 API;二是在 API Gateway 界面添加 Lambda function,绑定 Lambda,两种方法都可以。

Example 1: Basic random-number-generator

Lambda Configuration

登录AWS console在 Service 下选择 Lambda
LAMBDA1.png

Step1: Create a Lambda function,选 Node.js.4.3, Blank Function
LAMBDA2.png

Step 2: Configure Triggers,如果已经配置好了 API Gate,就选择相应的 API name,如果没有,直接默认下一步。
Add%20trigger.png

Step 3: Configure Function,进行如下设置,附代码部分

1
2
3
4
5
6
7
8
9
10
11
'use strict'
console.log('Loading function')
exports.handler = (event, context, callback) => {
let min = 0;
let max = 10;
let generatedNumber = Math.floor(Math.random() * (max - min)) + min;
callback(null, generatedNumber);
};
LAMBDA4.png

这里我们不需要验证身份,environment variables 留空就好。Role 如果没有 existing role,可以新建一个。

LAMBDA5.png

Step 4: Submit,预览一下如果没问题就 submit,等待一会儿 lambda function 就建好啦。

Step 5: Test,如果在 Step 2 里选择了已经建好的 API Gateway 作为 Trigger,那么可以直接选择 Test 进行测试,也可以通过 url 测试。有可能会遇到 Internal server error,官方说明 response must have statusCode, body, headers,于是把代码改了下,就成功啦。(后来发现好像不改也没关系。。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'use strict';
console.log('Loading function');
exports.handler = (event, context, callback) => {
let min = 0;
let max = 10;
let generatedNumber = Math.floor(Math.random() * (max - min)) + min;
const response = {
statusCode: 200,
body: JSON.stringify(generatedNumber)
};
callback(null, response);
};

测试结果如下:
lambda%20test.png

Add%20trigger%20done.png

相反,如果在 Step 2 里并没有设置 Trigger,我们需要新建 API,请看下一部分 API Gateway Configuration

API Gateway Configuration

aws console 页面的 Services -> Application Service -> API Gateway 下新建 API,然后在 Action 下拉框下 Create Resource,名称可以写 /number,然后继续 Create Method ,选 GET,Lambda Function 选择之前我们已经建好的 random-number-generator

new%20api.png

填写完毕后可以直接测试一下,产生了随机数 1。

new%20api%20test1.png new%20api%20test2.png

测试通过就可以部署,Actions -> Deploy API

new%20api%20deploy.png

部署完成后会自动跳转到 Stages 页面,把 Invoke URL 记录下来。

new%20api%20url.png

浏览器测试一下,注意补充 sub-resource,这里是 /number。

%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202017-06-04%20%E4%B8%8A%E5%8D%885.51.27.png

然后在其他应用里就可以直接通过 url 调用 API 啦~

Example 2: Passing information through API Gateway

API 经常需要传参,那么怎么通过 API Gateway 传递参数呢?比如说我们希望让用户来定义产生随机数的范围,也就是 url 应该是下面这样的

1
https://[API id].execute-api.us-east-1.amazonaws.com/prod/number?min=1&max=10

其实做法也很简单,先修改 Lambda function

1
2
3
4
5
6
7
8
9
10
11
'use strict'
console.log('Loading function')
exports.handler = (event, context, callback) => {
let min = event.min;
let max = event.max;
let generatedNumber = Math.floor(Math.random() * (max - min)) + min;
callback(null, generatedNumber);
};

然后在 method 下选择 integration request

integration%20request1.png

修改 Body Mapping Templates,新建 mapping template,添加下面的代码

1
2
3
4
{
"min": $input.params('min'),
"max": $input.params('max')
}

然后 Deploy api,浏览器测试下

rangetest.png rangetest2.png
徐阿衡 wechat
欢迎关注:徐阿衡的微信公众号
客官,打个赏呗~