教程:利用 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 提供灵活的安全控制。对于需要预先授权才能调用应用程序的使用案例而言,这非常有用。
要完成本教程,您需要经历以下阶段:
-
在 Python 或 Node.js 中创建和配置 Lambda 函数以对 DynamoDB 表执行操作。
-
在 API Gateway 中创建 REST API 以连接 Lambda 函数。
-
创建 DynamoDB 表,并在控制台中使用 Lambda 函数对其进行测试。
-
部署 API 并在终端中使用 curl 测试完整设置。
完成这些阶段后,您将了解如何使用 API Gateway 创建 HTTP 端点,该端点可以安全地调用任何规模的 Lambda 函数。此外,您将了解如何部署 API、如何在控制台中对其进行测试以及如何使用终端发送 HTTP 请求。
还将提供您在本教程中创建的 Lambda 应用程序的示例 Amazon Serverless Application Model(Amazon SAM)模板。请参阅Amazon SAM 模板,用于 API Gateway 应用程序。
小节目录
先决条件
如果您还没有 Amazon Web Services 账户,请完成以下步骤来创建一个。
注册 Amazon Web Services 账户
按照屏幕上的说明进行操作。
在注册时,您将接到一通电话,要求您使用电话键盘输入一个验证码。
当您注册 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
创建权限策略

为 Lambda 函数创建执行角色之前,首先需要创建权限策略以授予函数访问所需 Amazon 资源的权限。在本教程中,该策略允许 Lambda 对 DynamoDB 表执行 CRUD 操作并写入 Amazon CloudWatch Logs。
创建策略
-
打开 IAM 控制台的 Policies(策略)页面
。 -
请选择Create Policy(创建策略)。
-
选择 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" } ] }
-
请选择下一步:标签。
-
请选择下一步:审核。
-
在 Review policy (查看策略) 下,为策略 Name (名称) 输入
lambda-apigateway-policy
。 -
选择 Create policy(创建策略)。
创建执行角色

执行角色是一个 Amazon Identity and Access Management(IAM)角色,用于向 Lambda 函数授予访问 Amazon 服务和资源的权限。要使函数对 DynamoDB 表执行操作,您需要附加上一步中创建的权限策略。
创建执行角色并附加自定义权限策略
-
打开 IAM 控制台的角色页面
。 -
选择 Create role(创建角色)。
-
对于可信实体,选择 Amazon 服务,对于使用案例,选择 Lambda。
-
选择 Next(下一步)。
-
在策略搜索框中,输入
lambda-apigateway-policy
。 -
在搜索结果中,选择您创建的策略(
lambda-apigateway-policy
),然后选择 Next(下一步)。 -
在 Role details(角色详细信息)下,为 Role name(角色名称)输入
lambda-apigateway-role
,然后选择 Create role(创建角色)。
在本教程的后面部分,您需要提供刚刚创建的角色的 Amazon 资源名称(ARN)。在 IAM 控制台的 Roles(角色)页面上,选择角色名称(lambda-apigateway-role
),然后复制 Summary(摘要)页面上显示的 Role ARN(角色 ARN)。
创建函数

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

将函数与 API Gateway 集成之前,请确认您已成功部署该函数。创建一个测试事件,其中包含 API Gateway API 将发送给 Lambda 的参数,并使用 Amazon CLI invoke
命令运行函数。
使用 Amazon CLI 调用 Lambda 函数
-
将下列 JSON保存为名为
input.txt
的文件。{ "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" } }
-
运行以下
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
。有关更多信息,请参阅Amazon CLI 支持的全局命令行选项。您应看到以下响应:
{ "StatusCode": 200, "ExecutedVersion": "LATEST" }
-
请确认函数已执行您在 JSON 测试事件中指定的
echo
操作。检查outputfile.txt
文件并验证其是否包含以下内容:{"somekey1": "somevalue1", "somekey2": "somevalue2"}
使用 API Gateway 创建 REST API

在此步骤中,您将创建用于调用 Lambda 函数的 API Gateway REST API。
创建 API
-
打开 API Gateway 控制台
。 -
选择 Create API (创建 API)。
-
在 REST API 框中,选择 Build (构建)。
-
在 Settings(设置)下,为 API Name(API 名称)输入
DynamoDBOperations
。 -
选择 Create API(创建 API)。
在 REST API 上创建资源

要将 HTTP 方法添加到 API,您首先需要创建资源供该方法运行。您可以在此处创建资源来管理 DynamoDB 表。
创建资源
-
在 API Gateway 控制台
的 API Resources (资源) 树中,确保将根( /
)级别突出显示。然后选择 Actions (操作)、Create Resource (创建资源)。 -
在 New child resource (新子资源) 下,执行以下操作:
-
对于资源名称,输入
DynamoDBManager
。 -
将 Resource Path (资源路径) 设置为
/dynamodbmanager
。
-
-
选择 Create Resource (创建资源)。
创建 HTTP POST 方法

在此步骤中,您将为 DynamoDBManager
资源创建方法(POST
)。您可以将此 POST
方法链接到 Lambda 函数,以便当该方法接收 HTTP 请求时,API Gateway 可以调用 Lambda 函数。
注意
就本教程而言,一个 HTTP 方法(POST
)可用于调用一个 Lambda 函数,该函数将对 DynamoDB 表执行全部操作。在实际应用程序中,最佳做法是针对每个操作使用不同的 Lambda 函数和 HTTP 方法。有关更多信息,请参阅 Serverless Land 中的 The Lambda monolith
创建 POST 方法
-
在 API Gateway 控制台
的 API Resources (资源) 树中,确保将 /dynamodbmanager
突出显示。然后选择 Actions (操作)、Create Method (创建方法)。 -
在
/dynamodbmanager
下显示的小型下拉菜单中,选择POST
,然后选择复选标记图标。 -
在方法的 Setup (设置) 窗格中,执行以下操作:
-
对于集成类型,选择 Lambda 函数。
-
对于 Lambda Region (Lambda 区域),选择与 Lambda 函数相同的Amazon区域。
-
对于 Lambda Function (Lambda 函数),输入函数(
LambdaFunctionOverHttps
)的名称。 -
选择 Use Default Timeout (使用默认超时)。
-
选择 Save(保存)。
-
-
在 Add Permission to Lambda Function (向 Lambda 函数添加权限) 对话框中,选择 OK (确定)。
创建 DynamoDB 表

创建一个空的 DynamoDB 表,Lambda 函数将对其执行 CRUD 操作。
创建 DynamoDB 表
-
打开 DynamoDB 控制台中 Tables page
(表页面)。 -
选择 Create Table(创建表)。
-
在 Table details (表详细信息) 下,执行以下操作:
-
对于 表名称,输入
lambda-apigateway
。 -
对于 Partition key (分区键),输入
id
,并将数据类型设置为 String (字符串)。
-
-
在 Table settings(表设置)下,使用 Default settings(默认设置)。
-
选择 Create Table(创建表)。
测试 API Gateway、Lambda 和 DynamoDB 的集成

现在,您已准备好测试 API Gateway API 方法与 Lambda 函数和 DynamoDB 表的集成。借助 API Gateway 控制台,您可以使用控制台的测试功能将请求直接发送到 POST
方法。在此步骤中,您首先使用 create
操作将新项目添加到 DynamoDB 表,然后使用 update
操作修改该项目。
测试 1:在 DynamoDB 表中创建新项目
-
在 API Gateway console
(API Gateway 控制台)中,选择 API( DynamoDBOperations
)。 -
在 Resources (资源) 树中,选择
/dynamodbmanager
下的POST
方法。 -
在 Method Execution (方法执行) 窗格中的 Client (客户端) 框中,选择 Test (测试)。
-
在 Method Test (方法测试) 窗格中,将 Query Strings (查询字符串) 和 Headers (标头) 留空。对于 Request Body (请求体),粘贴以下 JSON:
{ "operation": "create", "payload": { "Item": { "id": "1234ABCD", "number": 5 } } }
-
选择 Test(测试)。
测试完成后,所显示的结果应显示状态
200
。此状态代码表示create
操作成功。要进行确认,请检查 DynamoDB 表现在是否包含新项目。
-
打开 DynamoDB 控制台中的 Tables page
(表页面),然后选择 lambda-apigateway
表。 -
选择 Explore table items(浏览表项目)。在 Items returned(返回的项目)窗格中,您会看到一个带 id
1234ABCD
和 number(编号)5
的项目。
测试 2:更新 DynamoDB 表中的项目
-
在 API Gateway 控制台
,返回到 POST 方法的 Method Test (方法测试) 窗格。 -
在 Method Test (方法测试) 窗格中,将 Query Strings (查询字符串) 和 Headers (标头) 留空。在 Request Body (请求体) 中,粘贴以下 JSON:
{ "operation": "update", "payload": { "Key": { "id": "1234ABCD" }, "AttributeUpdates": { "number": { "Value": 10 } } } }
-
选择 Test(测试)。
测试完成后,所显示的结果应显示状态
200
。此状态代码表示update
操作成功。要进行确认,请检查 DynamoDB 表中的项目是否进行过修改。
-
打开 DynamoDB 控制台中的 Tables page
(表页面),然后选择 lambda-apigateway
表。 -
选择 Explore table items(浏览表项目)。在 Items returned(返回的项目)窗格中,您会看到一个带 id
1234ABCD
和 number(编号)10
的项目。
部署 API

要让客户端调用 API,您必须创建部署和关联的阶段。阶段表示 API 的快照,包括其方法和集成。
部署 API
-
打开 API Gateway console
(API Gateway 控制台)的 API 页面,然后选择 DynamoDBOperations
API。 -
依次选择 Actions(操作)、Deploy API(部署 API)。
-
对于 Deployment stage(部署阶段),请选择 [New Stage]([新阶段]),然后在 Stage name(阶段名称)中输入
test
。 -
选择 Deploy(部署)。
-
在 test Stage Editor(测试阶段编辑器)窗格中,复制 Invoke URL(调用 URL)。您将在下一步中使用它,通过 HTTP 请求调用函数。
使用 curl 通过 HTTP 请求调用函数

现在,您可以通过向 API 发出 HTTP 请求来调用 Lambda 函数。在此步骤中,您将在 DynamoDB 表中创建一个新项目,然后将其删除。
使用 curl 调用 Lambda 函数
-
使用您在上一步中复制的调用 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}}}' -
要验证创建创建操作是否成功,请执行以下操作:
-
打开 DynamoDB 控制台中的 Tables page
(表页面),然后选择 lambda-apigateway
表。 -
选择 Explore table items(浏览表项目)。在 Items returned(返回的项目)窗格中,您会看到一个带 id
5678EFGH
和 number(编号)15
的项目。
-
-
运行以下
curl
命令以删除刚刚创建的项目。使用您自己的调用 URL。curl https://
l8togsqxd8.execute-api.us-west-2.amazonaws.com/test
/dynamodbmanager \ -d '{"operation": "delete", "payload": {"Key": {"id": "5678EFGH"}}}' 确认删除操作是否成功。在 DynamoDB 控制台 Explore items(浏览项目)页面的 Items returned(返回的项目)窗格中,验证表中是否不再包含带 id
5678EFGH
的项目。
清除资源(可选)
除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon 账户产生不必要的费用。
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择您创建的函数。
-
依次选择操作和删除。
-
在文本输入字段中键入
delete
,然后选择删除。
删除执行角色
-
打开 IAM 控制台的角色页面
。 -
选择您创建的执行角色。
-
选择删除。
-
在文本输入字段中输入角色名称,然后选择 Delete(删除)。
删除 API
-
打开 API Gateway 控制台的 API 页面
。 -
选择您创建的 API。
-
依次选择 Actions 和 Delete。
-
选择 Delete (删除)。
删除 DynamoDB 表
-
打开 DynamoDB 控制台中 Tables page
(表页面)。 -
选择您创建的表。
-
选择 Delete (删除)。
-
在文本框中输入
delete
。 -
选择 Delete table (删除表)。