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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:利用 API Gateway 使用 Lambda

在本教程中,您将创建 REST API,您可以借助它使用 HTTP 请求调用 Lambda 函数。Lambda 函数将对 DynamoDB 表执行创建、读取、更新和删除(CRUD)操作。此处提供此函数用于演示,但您将学习配置可以调用任何 Lambda 函数的 API Gateway REST API。


      本教程中使用的服务和资源

使用 API Gateway 可为用户提供安全的 HTTP 端点来调用 Lambda 函数,并可以通过节流流量以及自动验证和授权 API 调用来帮助管理大量函数调用。API Gateway 还使用 Amazon Identity and Access Management(IAM)和 Amazon Cognito 提供灵活的安全控制。对于需要预先授权才能调用应用程序的使用案例而言,这非常有用。

要完成本教程,您需要经历以下阶段:

  1. 在 Python 或 Node.js 中创建和配置 Lambda 函数以对 DynamoDB 表执行操作。

  2. 在 API Gateway 中创建 REST API 以连接 Lambda 函数。

  3. 创建 DynamoDB 表,并在控制台中使用 Lambda 函数对其进行测试。

  4. 部署 API 并在终端中使用 curl 测试完整设置。

完成这些阶段后,您将了解如何使用 API Gateway 创建 HTTP 端点,该端点可以安全地调用任何规模的 Lambda 函数。此外,您将了解如何部署 API、如何在控制台中对其进行测试以及如何使用终端发送 HTTP 请求。

先决条件

如果您还没有 Amazon Web Services 账户,请完成以下步骤来创建一个。

注册 Amazon Web Services 账户
  1. 打开 https://portal.aws.amazon.com/billing/signup

  2. 按照屏幕上的说明进行操作。

    在注册时,将接到一通电话,要求使用电话键盘输入一个验证码。

    当您注册 Amazon Web Services 账户时,系统将会创建一个 Amazon Web Services 账户根用户。根用户有权访问该账户中的所有 Amazon Web Services 和资源。作为安全最佳实践,请为管理用户分配管理访问权限,并且只使用根用户执行 需要根用户访问权限的任务

注册过程完成后,Amazon 会向您发送一封确认电子邮件。在任何时候,您都可以通过转至 https://aws.amazon.com/ 并选择我的账户来查看当前的账户活动并管理您的账户。

注册 Amazon Web Services 账户 后,启用多重身份验证 (MFA) 保护您的管理用户。有关说明,请参阅《IAM 用户指南》中的为为 IAM 用户(控制台)启用虚拟 MFA 设备

要授予其他用户访问您的 Amazon Web Services 账户资源的权限,请创建 IAM 用户。为了保护您的 IAM 用户,请启用 MFA 并仅向 IAM 用户授予执行任务所需的权限。

有关创建和保护 IAM 用户的更多信息,请参阅《IAM 用户指南》中的以下主题:

如果您尚未安装 Amazon Command Line Interface,请按照安装或更新最新版本的 Amazon CLI 中的步骤进行安装。

本教程需要命令行终端或 Shell 来运行命令。在 Linux 和 macOS 中,可使用您首选的 Shell 和程序包管理器。

注意

在 Windows 中,操作系统的内置终端不支持您经常与 Lambda 一起使用的某些 Bash CLI 命令(例如 zip)。安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。

创建权限策略


        步骤 1 创建权限策略

为 Lambda 函数创建执行角色之前,首先需要创建权限策略以授予函数访问所需 Amazon 资源的权限。在本教程中,该策略允许 Lambda 对 DynamoDB 表执行 CRUD 操作并写入亚马逊日志。 CloudWatch

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

  2. 选择创建策略

  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" } ] }
  4. 选择下一步:标签

  5. 选择下一步:审核

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

  7. 选择创建策略

创建执行角色


        步骤 2 创建执行角色

执行角色是一个 Amazon Identity and Access Management(IAM)角色,用于向 Lambda 函数授予访问 Amazon 服务和资源的权限。要使函数对 DynamoDB 表执行操作,您需要附加上一步中创建的权限策略。

创建执行角色并附加自定义权限策略
  1. 打开 IAM 控制台的角色页面

  2. 选择创建角色

  3. 对于可信实体,选择 Amazon 服务,对于使用案例,选择 Lambda

  4. 选择下一步

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

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

  7. Role details(角色详细信息)下,为 Role name(角色名称)输入 lambda-apigateway-role,然后选择 Create role(创建角色)。

在本教程的后面部分,您需要提供刚刚创建的角色的 Amazon 资源名称(ARN)。在 IAM 控制台的 Roles(角色)页面上,选择角色名称(lambda-apigateway-role),然后复制 Summary(摘要)页面上显示的 Role ARN(角色 ARN)。

创建函数


        步骤 3 创建函数

以下代码示例接收来自 API Gateway 的事件输入,指定要在将创建的 DynamoDB 表上执行的操作和一些负载数据。如果函数接收的参数有效,则它会在表上执行所请求的操作。

Node.js
例 index.mjs
console.log('Loading function'); import { DynamoDBDocumentClient, PutCommand, GetCommand, UpdateCommand, DeleteCommand} from "@aws-sdk/lib-dynamodb"; import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; const ddbClient = new DynamoDBClient({ region: "us-west-2" }); const ddbDocClient = DynamoDBDocumentClient.from(ddbClient); // Define the name of the DDB table to perform the CRUD operations on const tablename = "lambda-apigateway"; /** * Provide an event that contains the following keys: * * - operation: one of 'create,' 'read,' 'update,' 'delete,' or 'echo' * - payload: a JSON object containing the parameters for the table item * to perform the operation on */ export const handler = async (event, context) => { const operation = event.operation; if (operation == 'echo'){ return(event.payload); } else { event.payload.TableName = tablename; switch (operation) { case 'create': await ddbDocClient.send(new PutCommand(event.payload)); break; case 'read': var table_item = await ddbDocClient.send(new GetCommand(event.payload)); console.log(table_item); break; case 'update': await ddbDocClient.send(new UpdateCommand(event.payload)); break; case 'delete': await ddbDocClient.send(new DeleteCommand(event.payload)); break; default: return ('Unknown operation: ${operation}'); } } };
注意

在此示例中,DynamoDB 表的名称定义为函数代码中的变量。在实际应用程序中,最佳做法是将此参数作为环境变量传递,并避免对表名称进行硬编码。有关更多信息,请参阅使用 Amazon Lambda 环境变量

创建函数
  1. 将代码示例另存为名为 index.mjs 的文件,如有必要,编辑代码中指定的 Amazon 区域。代码中指定的区域必须与您稍后在本教程中创建 DynamoDB 表的区域相同。

  2. 使用以下 zip 命令创建部署包。

    zip function.zip index.mjs
  3. 使用 create-function Amazon CLI 命令创建 Lambda 函数。对于 role 参数,输入您先前复制的执行角色的 Amazon 资源名称(ARN)。

    aws lambda create-function --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role
Python 3
例 LambdaFunctionOverHttps.py
import boto3 import json # define the DynamoDB table that Lambda will connect to tableName = "lambda-apigateway" # create the DynamoDB resource dynamo = boto3.resource('dynamodb').Table(tableName) 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 - payload: a JSON object containing parameters to pass to the operation being performed ''' # define the functions used to perform the CRUD operations def ddb_create(x): dynamo.put_item(**x) def ddb_read(x): dynamo.get_item(**x) def ddb_update(x): dynamo.update_item(**x) def ddb_delete(x): dynamo.delete_item(**x) def echo(x): return x operation = event['operation'] operations = { 'create': ddb_create, 'read': ddb_read, 'update': ddb_update, 'delete': ddb_delete, 'echo': echo, } if operation in operations: return operations[operation](event.get('payload')) else: raise ValueError('Unrecognized operation "{}"'.format(operation))
注意

在此示例中,DynamoDB 表的名称定义为函数代码中的变量。在实际应用程序中,最佳做法是将此参数作为环境变量传递,并避免对表名称进行硬编码。有关更多信息,请参阅使用 Amazon Lambda 环境变量

创建函数
  1. 将代码示例保存为名为 LambdaFunctionOverHttps.py 的文件。

  2. 使用以下 zip 命令创建部署包。

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

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

使用 Amazon CLI 调用函数


        步骤 4 使用 Amazon CLI 调用函数

将函数与 API Gateway 集成之前,请确认您已成功部署该函数。创建一个测试事件,其中包含 API Gateway API 将发送给 Lambda 的参数,并使用 Amazon CLI invoke 命令运行函数。

使用 Amazon CLI 调用 Lambda 函数
  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 --cli-binary-format raw-in-base64-out

    如果使用 cli-binary-format 版本 2,则 Amazon CLI 选项是必需的。要将其设为默认设置,请运行 aws configure set cli-binary-format raw-in-base64-out。有关更多信息,请参阅版本 2 的 Amazon Command Line Interface 用户指南中的 Amazon CLI 支持的全局命令行选项

    您应看到以下响应:

    { "StatusCode": 200, "ExecutedVersion": "LATEST" }
  3. 请确认函数已执行您在 JSON 测试事件中指定的 echo 操作。检查 outputfile.txt 文件并验证其是否包含以下内容:

    {"somekey1": "somevalue1", "somekey2": "somevalue2"}

使用 API Gateway 创建 REST API


        步骤 5 创建 API

在此步骤中,您将创建用于调用 Lambda 函数的 API Gateway REST API。

创建 API
  1. 打开 API Gateway 控制台

  2. 选择 Create API (创建 API)

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

  4. API 详细信息下,将新建 API 保留为选中状态,然后在 API 名称中输入 DynamoDBOperations

  5. 选择创建 API

在 REST API 上创建资源


        步骤 6 创建 API 资源

要将 HTTP 方法添加到 API,您首先需要创建资源供该方法运行。您可以在此处创建资源来管理 DynamoDB 表。

创建资源
  1. API Gateway 控制台中,在您的 API 的资源页面上,选择创建资源

  2. 资源详细信息中,在资源名称中输入 DynamoDBManager

  3. 选择创建资源

创建 HTTP POST 方法


        步骤 7 创建 HTTP POST 方法

在此步骤中,您将为 DynamoDBManager 资源创建方法(POST)。您可以将此 POST 方法链接到 Lambda 函数,以便当该方法接收 HTTP 请求时,API Gateway 可以调用 Lambda 函数。

注意

就本教程而言,一个 HTTP 方法(POST)可用于调用一个 Lambda 函数,该函数将对 DynamoDB 表执行全部操作。在实际应用程序中,最佳做法是针对每个操作使用不同的 Lambda 函数和 HTTP 方法。有关更多信息,请参阅 Serverless Land 中的 The Lambda monolith

创建 POST 方法
  1. 在您的 API 的资源页面上,确保突出显示 /DynamoDBManager 资源。然后,在方法窗格中,选择创建方法

  2. 对于方法类型,选择 POST

  3. 对于集成类型,将 Lambda 函数保留为选中状态。

  4. 对于 Lambda 函数,选择函数(LambdaFunctionOverHttps)的 Amazon 资源名称(ARN)。

  5. 选择创建方法

创建 DynamoDB 表


        步骤 8 创建 DynamoDB 表

创建一个空的 DynamoDB 表,Lambda 函数将对其执行 CRUD 操作。

创建 DynamoDB 表
  1. 打开 DynamoDB 控制台中 Tables page(表页面)。

  2. 选择创建表

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

    1. 对于 表名称,输入 lambda-apigateway

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

  4. Table settings(表设置)下,使用 Default settings(默认设置)。

  5. 选择创建表

测试 API Gateway、Lambda 和 DynamoDB 的集成


        步骤 9 测试 API Gateway、Lambda 和 DynamoDB 的集成

现在,您已准备好测试 API Gateway API 方法与 Lambda 函数和 DynamoDB 表的集成。借助 API Gateway 控制台,您可以使用控制台的测试功能将请求直接发送到 POST 方法。在此步骤中,您首先使用 create 操作将新项目添加到 DynamoDB 表,然后使用 update 操作修改该项目。

测试 1:在 DynamoDB 表中创建新项目
  1. API Gateway console(API Gateway 控制台)中,选择 API(DynamoDBOperations)。

  2. DynamoDBManager资源下选择 POST 方法。

    
            在DynamoDBManager资源下选择 POST 方法。
  3. 选择测试选项卡。您可能需要选择右箭头按钮,以显示该选项卡。

  4. 测试方法下,将查询字符串标头留空。对于请求正文,粘贴以下 JSON:

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

    测试完成后,所显示的结果应显示状态 200。此状态代码表示 create 操作成功。

    要进行确认,请检查 DynamoDB 表现在是否包含新项目。

  6. 打开 DynamoDB 控制台中的 Tables page(表页面),然后选择 lambda-apigateway 表。

  7. 选择 Explore table items(浏览表项目)。在 Items returned(返回的项目)窗格中,您会看到一个带 id 1234ABCDnumber(编号)5 的项目。

测试 2:更新 DynamoDB 表中的项目
  1. API Gateway 控制台中,返回到 POST 方法的测试选项卡。

  2. 测试方法下,将查询字符串标头留空。对于请求正文,粘贴以下 JSON:

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

    测试完成后,所显示的结果应显示状态 200。此状态代码表示 update 操作成功。

    要进行确认,请检查 DynamoDB 表中的项目是否进行过修改。

  4. 打开 DynamoDB 控制台中的 Tables page(表页面),然后选择 lambda-apigateway 表。

  5. 选择 Explore table items(浏览表项目)。在 Items returned(返回的项目)窗格中,您会看到一个带 id 1234ABCDnumber(编号)10 的项目。

部署 API


        步骤 10 部署 API

要让客户端调用 API,您必须创建部署和关联的阶段。阶段表示 API 的快照,包括其方法和集成。

部署 API
  1. 打开 API Gateway console(API Gateway 控制台)的 API 页面,然后选择 DynamoDBOperations API。

  2. 在您的 API 的资源页面上,选择部署 API

  3. 对于阶段,请选择*新建阶段*,然后在阶段名称中输入 test

  4. 选择部署

  5. 阶段详细信息窗格中,复制调用 URL。您将在下一步中使用它,通过 HTTP 请求调用函数。

使用 curl 通过 HTTP 请求调用函数


        步骤 11 通过 HTTP 请求调用函数

现在,您可以通过向 API 发出 HTTP 请求来调用 Lambda 函数。在此步骤中,您将在 DynamoDB 表中创建一个新项目,然后将其删除。

使用 curl 调用 Lambda 函数
  1. 使用您在上一步中复制的调用 URL 运行以下 curl 命令。当您使用带 -d(数据)选项的 curl 时,它会自动使用 HTTP POST 方法。

    curl https://l8togsqxd8.execute-api.us-west-2.amazonaws.com/test/DynamoDBManager \ -d '{"operation": "create", "payload": {"Item": {"id": "5678EFGH", "number": 15}}}'
  2. 要验证创建创建操作是否成功,请执行以下操作:

    1. 打开 DynamoDB 控制台中的 Tables page(表页面),然后选择 lambda-apigateway 表。

    2. 选择 Explore table items(浏览表项目)。在 Items returned(返回的项目)窗格中,您会看到一个带 id 5678EFGHnumber(编号)15 的项目。

  3. 运行以下 curl 命令以删除刚刚创建的项目。使用您自己的调用 URL。

    curl https://l8togsqxd8.execute-api.us-west-2.amazonaws.com/test/DynamoDBManager \ -d '{"operation": "delete", "payload": {"Key": {"id": "5678EFGH"}}}'
  4. 确认删除操作是否成功。在 DynamoDB 控制台 Explore items(浏览项目)页面的 Items returned(返回的项目)窗格中,验证表中是否不再包含带 id 5678EFGH 的项目。

清除资源(可选)

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

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

  2. 选择您创建的函数。

  3. 依次选择操作删除

  4. 在文本输入字段中键入 delete,然后选择删除

删除执行角色
  1. 打开 IAM 控制台的角色页面

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

  3. 选择删除

  4. 在文本输入字段中输入角色名称,然后选择 Delete(删除)。

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

  2. 选择您创建的 API。

  3. 依次选择 ActionsDelete

  4. 选择 Delete(删除)。

删除 DynamoDB 表
  1. 打开 DynamoDB 控制台中 Tables page(表页面)。

  2. 选择您创建的表。

  3. 选择 Delete(删除)。

  4. 在文本框中输入 delete

  5. 选择 Delete table (删除表)