教程:利用 API Gateway 使用 Lambda - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

教程:利用 API Gateway 使用 Lambda

在本教程中,您使用 Amazon API Gateway 创建 REST API 和资源(DynamoDBManager)。您可以在资源上定义一个方法(POST),并创建一个支持 POST 方法的 Lambda 函数(LambdaFunctionOverHttps)。也就是说,当您通过 HTTPS 终端节点调用 API 时,API Gateway 会调用 Lambda 函数。

您在 DynamoDBManager 资源上定义的 POST 方法支持以下 Amazon DynamoDB 操作:

  • 创建、更新和删除项目。

  • 读取项目。

  • 扫描项目。

  • 与 DynamoDB 不相关且可用于测试的其他操作(echo、ping)。

将 API Gateway 与 Lambda 配合使用还可提供高级功能,例如:

  • 整个请求传递 – Lambda 函数可以接收整个 HTTP 请求(而不仅仅是请求体),并可以使用 Lambda 代理(AWS_PROXY)集成类型设置 HTTP 响应(而不仅仅是响应正文)。

  • “捕获全部”方法 – 使用 ANY“捕获全部”方法将 API 资源的所有方法映射到具有单个映射的单个 Lambda 函数。

  • “捕获全部”资源 – 使用新路径参数({proxy+})将资源的所有子路径映射到 Lambda 函数,而无需任何额外配置。

有关这些 API Gateway 功能的更多信息,请参阅《API Gateway 开发人员指南》中的设置具有代理资源的代理集成

先决条件

本教程假设您对 Lambda 基本操作和 Lambda 控制台有一定了解。如果您还没有了解,请按照 Lambda 入门 中的说明创建您的第一个 Lambda 函数。

要完成以下步骤,您需要命令行终端或 Shell,以便运行命令。在单独的数据块中列出了命令和预期输出:

aws --version

您应看到以下输出:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

对于长命令,使用转义字符 (\) 将命令拆分为多行。

在 Linux 和 macOS 中,可使用您首选的外壳程序和程序包管理器。在 Windows 10 中,您可以 安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。

创建执行角色

创建执行角色。此 Amazon Identity and Access Management(IAM)角色使用自定义策略向您的 Lambda 函数授予访问所需Amazon资源的权限。请注意,您应首先创建策略,然后创建执行角色。

创建自定义策略

  1. 打开 IAM 控制台的 Policies(策略)页面

  2. 选择 Create Policy (创建策略)

  3. 选择 JSON 选项卡,然后将以下自定义策略粘贴到 JSON 编辑器中。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1428341300017", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem" ], "Effect": "Allow", "Resource": "*" }, { "Sid": "", "Resource": "*", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow" } ] }

    此策略包括函数访问 DynamoDB 和 Amazon CloudWatch Logs 所需的权限。

  4. 选择下一步:标签

  5. 选择下一步:审核

  6. Review policy (查看策略) 下,为策略 Name (名称) 输入 lambda-apigateway-policy

  7. 选择 Create policy (创建策略)

创建执行角色

  1. 打开 IAM 控制台的 Roles page(角色页面)。

  2. 选择创建角色

  3. 对于信任实体的类型,选择 Amazon service (亚马逊云科技服务)

  4. 对于使用案例,选择 Lambda

  5. 选择下一步: 权限

  6. 在策略搜索框中,输入 lambda-apigateway-policy

  7. 在搜索结果中,选择您创建的策略(lambda-apigateway-policy),然后选择 Next: Tags (下一步: 标签)

  8. 选择 Next: Review(下一步: 审核)。

  9. Review (审核) 下面,为 Role name (角色名称) 输入 lambda-apigateway-role

  10. 选择 Create role(创建角色)。

  11. Roles (角色) 页面上,选择您的角色的名称(lambda-apigateway-role)。

  12. Summary (摘要) 页面上,复制 Role ARN (角色 ARN)。您将在本教程的后面需要此角色 ARN。

创建函数

以下代码示例接收 API Gateway 事件输入并对此输出所包含的消息进行处理。为了展示这个过程,代码会将一些传入的事件数据写入 CloudWatch Logs。

Node.js

例 index.js

console.log('Loading function'); var AWS = require('aws-sdk'); var dynamo = new AWS.DynamoDB.DocumentClient(); /** * Provide an event that contains the following keys: * * - operation: one of the operations in the switch statement below * - tableName: required for operations that interact with DynamoDB * - payload: a parameter to pass to the operation being performed */ exports.handler = function(event, context, callback) { //console.log('Received event:', JSON.stringify(event, null, 2)); var operation = event.operation; if (event.tableName) { event.payload.TableName = event.tableName; } switch (operation) { case 'create': dynamo.put(event.payload, callback); break; case 'read': dynamo.get(event.payload, callback); break; case 'update': dynamo.update(event.payload, callback); break; case 'delete': dynamo.delete(event.payload, callback); break; case 'list': dynamo.scan(event.payload, callback); break; case 'echo': callback(null, "Success"); break; case 'ping': callback(null, "pong"); break; default: callback(`Unknown operation: ${operation}`); } };

创建函数

  1. 将代码示例保存为名为 的文件index.js

  2. 创建部署程序包。

    zip function.zip index.js
  3. 使用 create-function Amazon Command Line Interface(Amazon CLI)命令创建 Lambda 函数。对于 role 参数,输入您先前复制的执行角色的 Amazon Resource Name(ARN)。

    aws lambda create-function --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role
Python 3

例 LambdaFunctionOverHttps.py

from __future__ import print_function import boto3 import json print('Loading function') def handler(event, context): '''Provide an event that contains the following keys: - operation: one of the operations in the operations dict below - tableName: required for operations that interact with DynamoDB - payload: a parameter to pass to the operation being performed ''' #print("Received event: " + json.dumps(event, indent=2)) operation = event['operation'] if 'tableName' in event: dynamo = boto3.resource('dynamodb').Table(event['tableName']) operations = { 'create': lambda x: dynamo.put_item(**x), 'read': lambda x: dynamo.get_item(**x), 'update': lambda x: dynamo.update_item(**x), 'delete': lambda x: dynamo.delete_item(**x), 'list': lambda x: dynamo.scan(**x), 'echo': lambda x: x, 'ping': lambda x: 'pong' } if operation in operations: return operations[operation](event.get('payload')) else: raise ValueError('Unrecognized operation "{}"'.format(operation))

创建函数

  1. 将代码示例保存为名为 的文件LambdaFunctionOverHttps.py

  2. 创建部署程序包。

    zip function.zip LambdaFunctionOverHttps.py
  3. 使用 create-function Amazon Command Line Interface(Amazon CLI)命令创建 Lambda 函数。对于 role 参数,输入您先前复制的执行角色的 Amazon Resource Name(ARN)。

    aws lambda create-function --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip --handler LambdaFunctionOverHttps.handler --runtime python3.8 \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role
Go

例 LambdaFunctionOverHttps.go

package main import ( "context" "fmt" "github.com/aws/aws-lambda-go/events" runtime "github.com/aws/aws-lambda-go/lambda" ) func main() { runtime.Start(handleRequest) } func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { fmt.Printf("Processing request data for request %s.\n", request.RequestContext.RequestID) fmt.Printf("Body size = %d.\n", len(request.Body)) fmt.Println("Headers:") for key, value := range request.Headers { fmt.Printf(" %s: %s\n", key, value) } return events.APIGatewayProxyResponse{Body: request.Body, StatusCode: 200}, nil }

创建函数

  1. 将代码示例保存为名为 的文件LambdaFunctionOverHttps.go

  2. 编译您的可执行文件。

    GOOS=linux go build LambdaFunctionOverHttps.go
  3. 创建部署程序包。

    zip function.zip LambdaFunctionOverHttps
  4. 使用 create-function Amazon Command Line Interface(Amazon CLI)命令创建 Lambda 函数。对于 role 参数,输入您先前复制的执行角色的 Amazon Resource Name(ARN)。

    aws lambda create-function --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip --handler LambdaFunctionOverHttps --runtime go1.x \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role

测试此函数

使用以下示例事件数据手动测试 Lambda 函数。您可以使用 invoke Amazon CLI 命令或者使用 Lambda 控制台来调用函数。

测试 Lambda 函数 (Amazon CLI)

  1. 将下列 JSON保存为名为 的文件。input.txt

    { "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" } }
  2. 运行以下 invoke Amazon CLI 命令:

    aws lambda invoke --function-name LambdaFunctionOverHttps \ --payload file://input.txt outputfile.txt

    如果您使用 Amazon CLI 版本 2,则 cli-binary-format 选项必填。您还可以在 Amazon CLI Config 文件中配置此选项。

  3. 在文件中验证输出outputfile.txt

使用 API Gateway 创建 REST API

在本部分中,您可以通过将一种资源(DynamoDBManager)和一种方法(POST)结合使用来创建 API Gateway REST API(DynamoDBOperations)。将 POST 方法与您的 Lambda 函数关联。然后,您将测试该设置。

当您的 API 方法接收 HTTP 请求时,API Gateway 会调用 Lambda 函数。

创建 API

在以下步骤中,您将使用 API Gateway 控制台创建 DynamoDBOperations REST API。

创建 API

  1. 打开 API Gateway 控制台

  2. 选择 Create API (创建 API)

  3. REST API 框中,选择 Build (构建)

  4. Create a new API (创建新 API) 下,选择 New API (新建 API)

  5. Settings (设置) 下,执行下列操作:

    1. 对于 API Name (API 名称),请输入 DynamoDBOperations

    2. 对于 Endpoint Type (终端节点类型),选择 Regional (区域性)

  6. 选择 Create API (创建 API)

在 API 中创建资源

在以下步骤中,您可以在 REST API 中创建名为 DynamoDBManager 的资源。

创建资源

  1. API Gateway 控制台的 API Resources (资源) 树中,确保将根(/)级别突出显示。然后选择 Actions (操作)Create Resource (创建资源)

  2. New child resource (新子资源) 下,执行以下操作:

    1. 对于资源名称,输入 DynamoDBManager

    2. Resource Path (资源路径) 设置为 /dynamodbmanager

  3. 选择 Create Resource (创建资源)

在资源上创建 POST 方法

在以下步骤中,您将在上一部分中创建的 DynamoDBManager 资源中创建 POST 方法。

创建方法

  1. API Gateway 控制台的 API Resources (资源) 树中,确保将 /dynamodbmanager 突出显示。然后选择 Actions (操作)Create Method (创建方法)

  2. /dynamodbmanager 下显示的小型下拉菜单中,选择 POST,然后选择复选标记图标。

  3. 在方法的 Setup (设置) 窗格中,执行以下操作:

    1. 对于集成类型,选择 Lambda 函数

    2. 对于 Lambda Region (Lambda 区域),选择与 Lambda 函数相同的Amazon区域。

    3. 对于 Lambda Function (Lambda 函数),输入函数(LambdaFunctionOverHttps)的名称。

    4. 选择 Use Default Timeout (使用默认超时)

    5. 选择保存

  4. Add Permission to Lambda Function (向 Lambda 函数添加权限) 对话框中,选择 OK (确定)

创建 DynamoDB 表

创建 Lambda 函数使用的 DynamoDB 表。

创建 DynamoDB 表

  1. 打开 DynamoDB 控制台中 Tables(表)页面

  2. 选择 Create Table

  3. Table details (表详细信息) 下,执行以下操作:

    1. 对于 Table name(表名称),输入 lambda-apigateway

    2. 对于 Partition key (分区键),输入 id,并将数据类型设置为 String (字符串)

  4. Settings (设置) 下,使用 Default settings (默认设置)

  5. 选择 Create Table

测试设置

现在您可以测试该设置。您可以直接从 API Gateway 控制台中将请求发送给您的 POST 方法。在此步骤中,您将使用 create 操作,然后使用 update 操作。

在 DynamoDB 表中创建项目

Lambda 函数可以使用 create 操作在 DynamoDB 表中创建项目。

  1. API Gateway 控制台 中,选择 REST API(DynamoDBOperations)的名称。

  2. Resources (资源) 树中,选择 /dynamodbmanager 下的 POST 方法。

  3. Method Execution (方法执行) 窗格中的 Client (客户端) 框中,选择 Test (测试)

  4. Method Test (方法测试) 窗格中,将 Query Strings (查询字符串)Headers (标头) 留空。对于 Request Body (请求体),粘贴以下 JSON:

    { "operation": "create", "tableName": "lambda-apigateway", "payload": { "Item": { "id": "1234ABCD", "number": 5 } } }
  5. 选择测试

测试结果应显示状态 200,表示 create 操作成功。要进行确认,您可以检查 DynamoDB 表现在是否包含具有 "id": "1234ABCD""number": "5" 的项目。

更新 DynamoDB 表中的项目

您也可以使用 update 操作更新表中的项目。

  1. API Gateway 控制台,返回到 POST 方法的 Method Test (方法测试) 窗格。

  2. Method Test (方法测试) 窗格中,将 Query Strings (查询字符串)Headers (标头) 留空。在 Request Body (请求体) 中,粘贴以下 JSON:

    { "operation": "update", "tableName": "lambda-apigateway", "payload": { "Key": { "id": "1234ABCD" }, "AttributeUpdates": { "number": { "Value": 10 } } } }
  3. 选择测试

测试结果应显示状态 200,表示 update 操作成功。要进行确认,您可以检查 DynamoDB 表现在是否包含具有 "id": "1234ABCD""number": "10" 的已更新项目。

清除 资源

除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon 账户产生不必要的费用。

删除 Lambda 函数

  1. 打开 Lamba 控制台的 Functions(函数)页面

  2. 选择您创建的函数。

  3. 选择 Actions (操作),然后选择 Delete (删除)

  4. 选择 Delete

删除执行角色

  1. 打开 IAM 控制台的 Roles(角色)页面

  2. 选择您创建的执行角色。

  3. 选择删除角色

  4. 选择 Yes, delete (是,删除)

删除 API

  1. 打开 API Gateway 控制台的 API 页面

  2. 选择您创建的 API。

  3. 依次选择 ActionsDelete

  4. 选择 Delete

删除 DynamoDB 表

  1. 打开 DynamoDB 控制台中 Tables(表)页面

  2. 选择您创建的表。

  3. 选择 Delete

  4. 在文本框中输入 delete

  5. 选择 Delete