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

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

Overview

如果要用一句话理解 API Gateway,那必须是 serverless APIs。AWS API Gateway 与 AWS 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 function 和 API,然后将两者结合起来,结合方法有两种,一是在 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
欢迎关注:徐阿衡的微信公众号
客官,打个赏呗~