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

教程:使用 Lambda 和 DynamoDB 构建 CRUD API

在本教程中,您将创建一个无服务器 API,用于创建、读取、更新和删除 DynamoDB 表中的项目。DynamoDB 是一项完全托管的 NoSQL 数据库服务,提供快速而可预测的性能,能够实现无缝扩展。完成本教程大约需要 30 分钟,您可以在 AWS 免费套餐中完成。

首先,使用 DynamoDB 控制台创建 DynamoDB 表。然后,使用 AWS Lambda 控制台创建 Lambda 函数。接下来,使用 API Gateway 控制台创建 HTTP API。最后,测试您的 API。

当您调用 HTTP API 时,API Gateway 会将请求路由到您的 Lambda 函数。Lambda 函数与 DynamoDB 进行交互,并将响应返回 API Gateway。然后 API Gateway 会向您返回响应。

要完成本练习,您需要一个 AWS 账户和具有控制台访问权限的 AWS Identity and Access Management 用户。有关更多信息,请参阅 开始使用 API Gateway 的先决条件

在本教程中,您将使用 AWS 管理控制台。有关创建此 API 和所有相关资源的 AWS SAM 模板,请参阅template.yaml

步骤 1:创建 DynamoDB 表

您可以使用 DynamoDB 表为您的 API 存储数据。

每个项目都有一个唯一的 ID,我们将其用作表的分区键

创建 DynamoDB 表

  1. https://console.aws.amazon.com/dynamodb/ 打开 DynamoDB 控制台。

  2. 选择 Create Table

  3. 对于 Table name(表名称),输入 http-crud-tutorial-items

  4. 对于 Primary key(主键),输入 id

  5. 选择创建

步骤 2:创建 Lambda 函数

创建 Lambda 函数以用作您的 API 后端。此 Lambda 函数从 DynamoDB 中创建、读取、更新和删除项目。该函数使用 API Gateway 中的事件来决定如何与 DynamoDB 交互。为简单起见,本教程使用单个 Lambda 函数。作为最佳实践,您应该为每个路由创建单独的函数。

创建 Lambda 函数

  1. 通过以下网址登录 Lambda 控制台:https://console.aws.amazon.com/lambda

  2. 选择创建函数

  3. 对于函数名称,请输入http-crud-tutorial-function

  4. Permissions(权限)下,选择 Change default execution role(更改默认执行角色)。

  5. 选择 Create a new role from AWS policy templates(从 AWS 策略模板创建新角色)。

  6. 对于 Role name(角色名称),输入 http-crud-tutorial-role

  7. 对于 Policy templates(策略模板),选择 Simple microservice permissions。此策略授予 Lambda 函数与 DynamoDB 进行交互的权限。

    注意

    为简单起见,本教程使用托管策略。作为最佳实践,您应创建自己的 IAM 策略以授予所需的最低权限。

  8. 选择创建函数

  9. 在控制台的代码编辑器中打开 index.js,并将其内容替换为以下代码。选择 Deploy(部署)以更新您的函数。

const AWS = require("aws-sdk"); const dynamo = new AWS.DynamoDB.DocumentClient(); exports.handler = async (event, context) => { let body; let statusCode = 200; const headers = { "Content-Type": "application/json" }; try { switch (event.routeKey) { case "DELETE /items/{id}": await dynamo .delete({ TableName: "http-crud-tutorial-items", Key: { id: event.pathParameters.id } }) .promise(); body = `Deleted item ${event.pathParameters.id}`; break; case "GET /items/{id}": body = await dynamo .get({ TableName: "http-crud-tutorial-items", Key: { id: event.pathParameters.id } }) .promise(); break; case "GET /items": body = await dynamo.scan({ TableName: "http-crud-tutorial-items" }).promise(); break; case "PUT /items": let requestJSON = JSON.parse(event.body); await dynamo .put({ TableName: "http-crud-tutorial-items", Item: { id: requestJSON.id, price: requestJSON.price, name: requestJSON.name } }) .promise(); body = `Put item ${requestJSON.id}`; break; default: throw new Error(`Unsupported route: "${event.routeKey}"`); } } catch (err) { statusCode = 400; body = err.message; } finally { body = JSON.stringify(body); } return { statusCode, body, headers }; };

步骤 3:创建 HTTP API

HTTP API 为您的 Lambda 函数提供了 HTTP 终端节点。在此步骤中,您将创建空 API。在以下步骤中,您将配置路由和集成以连接 API 和 Lambda 函数。

要创建 HTTP API

  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择 Create API(创建 API),然后为 HTTP API 选择 Build(构建)。

  3. 对于 API name(API 名称),输入 http-crud-tutorial-api

  4. 选择 Next (下一步)

  5. 对于 Configure routes(配置路由),选择 Next(下一步)以跳过路由创建。稍后再创建路由。

  6. 查看 API Gateway 为您创建的阶段,然后选择 Next(下一步)。

  7. 选择创建

步骤 4:创建路由

路由是将传入的 API 请求发送到后端资源的一种方式。路由包含两部分:HTTP 方法和资源路径,例如 GET /items。对于此示例 API,我们创建了四个路由:

  • GET /items/{id}

  • GET /items

  • PUT /items

  • DELETE /items/{id}

要创建路由

  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择 API。

  3. 选择路由

  4. 选择创建

  5. 对于 Method(方法),选择 GET

  6. 对于路径,请输入 /items/{id}。路径结尾的 {id} 是 API Gateway 在客户端提出请求时从请求路径中接收的路径参数。

  7. 选择创建

  8. GET /itemsDELETE /items/{id}PUT /items 重复步骤 4-7。

步骤 5:创建集成

您可以创建集成以将路由连接到后端资源。对于此示例 API,您可以创建一个用于所有路由的 Lambda 集成。

要创建集成

  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择 API。

  3. 选择 Integrations(集成)。

  4. 选择 Manage integrations(管理集成),然后选择 Create(创建)。

  5. 跳过 Attach this integration to a route(将此集成附加到路由)。在后续步骤中再完成此操作。

  6. 对于 Integration type(集成类型),选择 Lambda function(Lambda 函数)。

  7. 对于 Lambda function(Lambda 函数),输入 http-crud-tutorial-function

  8. 选择创建

步骤 6:将集成附加到路由

对于此示例 API,您对所有路由都使用相同的 Lambda 集成。将集成附加到所有的 API 路由后,当客户端调用您的任何路由时,您的 Lambda 函数将被调用。

要将集成附加到路由

  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择 API。

  3. 选择 Integrations(集成)。

  4. 选择路由。

  5. Choose an existing integration(选择现有集成)下,选择 http-crud-tutorial-function

  6. 选择 Attach integration(附加集成)。

  7. 对所有路由重复步骤 4-6。

所有路由均显示附加了 AWS Lambda 集成。

现在您已经有了一个包含路由和集成的 HTTP API,您可以测试 API 了。

步骤 7:测试您的 API

为了确保您的 API 正常工作,您可以使用 curl

要获取调用 API 的 URL

  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择 API。

  3. 请记下您的 API 的调用 URL。它显示在 Details(详细信息)页面上的 Invoke URL(调用 URL)下。

  4. 请复制您的 API 的调用 URL。

    完整的 URL 类似于以下所示:https://abcdef123.execute-api.us-west-2.amazonaws.com

要创建或更新项目

  • 使用以下命令以创建或更新项目。该命令包括带有项目 ID、价格和名称的请求正文。

    curl -v -X "PUT" -H "Content-Type: application/json" -d "{\"id\": \"abcdef234\", \"price\": 12345, \"name\": \"myitem\"}" https://abcdef123.execute-api.us-west-2.amazonaws.com/items

要获取所有项目

  • 使用以下命令列出所有项目。

    curl -v https://abcdef123.execute-api.us-west-2.amazonaws.com/items

要获取一个项目

  • 使用以下命令按 ID 获取项目。

    curl -v https://abcdef123.execute-api.us-west-2.amazonaws.com/items/abcdef234

如何删除项目

  1. 使用以下命令删除项目。

    curl -v -X "DELETE" https://abcdef123.execute-api.us-west-2.amazonaws.com/items/abcdef234
  2. 获取所有项目以验证项目已删除。

    curl -v https://abcdef123.execute-api.us-west-2.amazonaws.com/items

步骤 8:清除

为避免不必要的成本,请删除作为本入门练习的一部分而创建的资源。以下步骤将删除 HTTP API、Lambda 函数和相关资源。

要删除 DynamoDB 表

  1. https://console.aws.amazon.com/dynamodb/ 打开 DynamoDB 控制台。

  2. 选择您的表。

  3. 选择删除表

  4. 确认您的选择,然后选择 Delete(删除)。

要删除 HTTP API

  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. API 页面上,选择一个 API。选择 Actions,然后选择 Delete

  3. 选择 Delete

要删除 Lambda 函数

  1. 通过以下网址登录 Lambda 控制台:https://console.aws.amazon.com/lambda

  2. 函数页面上,选择一个函数。选择 Actions,然后选择 Delete

  3. 选择 Delete

要删除 Lambda 函数的日志组

  1. 在 Amazon CloudWatch 控制台中,打开日志组页面

  2. Log groups(日志组)页面上,选择函数的日志组 (/aws/lambda/http-crud-tutorial-function)。选择 Actions (操作),然后选择 Delete log group (删除日志组)

  3. 选择 Delete

要删除 Lambda 函数的执行角色

  1. 在 AWS Identity and Access Management 控制台中,打开角色页面

  2. 选择函数的角色,例如 http-crud-tutorial-role

  3. 选择删除角色

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

后续步骤:使用 AWS SAM 或 AWS CloudFormation 自动执行

您可以使用 AWS CloudFormation 或 AWS SAM 自动创建和清理 AWS 资源。有关本教程的 AWS SAM 示例模板,请参阅template.yaml

例如 AWS CloudFormation 模板,请参阅 示例 AWS CloudFormation 模板