📣
TiDB Cloud Premium 开放公测中。为企业级工作负载提供无限扩展、即时弹性伸缩和高级安全保障。此页面由 AI 自动翻译,英文原文请见此处。

使用 AWS CloudFormation 集成 TiDB Cloud Starter 与 Amazon Lambda



本文档提供了一个分步指南,介绍如何使用 AWS CloudFormation 将 TiDB Cloud Starter,一款云原生分布式 SQL 数据库,与 AWS Lambda,一项无服务器、事件驱动的计算服务集成。通过将 TiDB Cloud Starter 与 Amazon Lambda 集成,你可以利用 TiDB Cloud Starter 和 AWS Lambda 的微服务架构,实现高扩展性和成本效益。AWS CloudFormation 可自动化创建和管理 AWS 资源,包括 Lambda 函数、API Gateway 和 Secrets Manager。

方案概述

在本指南中,你将创建一个功能完善的在线书店项目,包含以下组件:

  • AWS Lambda Function:处理请求并通过 Sequelize ORM 和 Fastify API 框架从 TiDB Cloud Starter 实例查询数据。
  • AWS Secrets Manager SDK:获取并管理 TiDB Cloud Starter 实例的连接配置信息。
  • AWS API Gateway:处理 HTTP 请求路由。
  • TiDB Cloud Starter:云原生分布式 SQL 数据库。

AWS CloudFormation 用于为该项目创建所需的资源,包括 Secrets Manager、API Gateway 和 Lambda Functions。

书店项目的结构如下所示:

AWS Lambda structure overview

前置条件

在开始之前,请确保你具备以下条件:

如果你使用的区域不是 us-east-1,请修改并重新构建 Lambda 函数代码

如果你将区域设置为 us-east-1,请跳过本节,直接前往 步骤 1:使用 AWS CloudFormation 搭建书店项目。

如果你在 us-east-1 以外的 AWS 区域创建 AWS 资源,则需要修改 Lambda 函数代码,重新构建,并将代码包上传到你自己的 S3 bucket。

为避免本地开发环境问题,推荐使用云原生开发环境,如 Gitpod。

要重新构建并上传代码包到你自己的 S3 bucket,请执行以下操作:

  1. 初始化开发环境。

    • 打开 Gitpod 工作区,并使用你的 GitHub 账号登录。
  2. 修改 Lambda 函数代码。

    1. 在左侧边栏打开 aws-lambda-cloudformation/src/secretManager.ts 文件。
    2. 找到第 22 行,将 region 变量修改为你自己的区域。
  3. 重新构建代码包。

    1. 安装依赖项。

      1. 在 Gitpod 中打开终端。

      2. 进入工作目录:

        cd aws-lambda-cloudformation
      3. 安装依赖:

        yarn
    2. 重新构建代码包。

      1. 构建代码包。

        yarn build
      2. 检查 aws-lambda-cloudformation/dist/index.zip 文件。

      3. 右键点击 index.zip 文件,选择 Download。

  4. 将重新构建的代码包上传到你自己的 S3 bucket。

    1. 访问 AWS 管理控制台中的 S3 服务。
    2. 在你选择的区域创建一个新的 bucket。
    3. 将 index.zip 文件上传到该 bucket。
    4. 记录 S3 bucket 名称和区域,后续会用到。

步骤 1. 使用 AWS CloudFormation 搭建书店项目

要使用 AWS CloudFormation 搭建书店项目,请执行以下操作:

  1. 进入 AWS 管理控制台,访问 AWS CloudFormation 服务。

  2. 点击 Create Stack > With new resources (standard)。

  3. 在 Create Stack 页面,完成堆栈创建流程。

    1. 在 Prerequisite 区域,选择 Choose an existing template。

    2. 在 Specify template 区域,选择 Upload a template file,点击 Choose file 上传模板文件(YAML 或 JSON 格式),然后点击 Next。

      如果你还没有该文件,可以从 GitHub 下载。该文件包含用于创建项目所需资源的 AWS CloudFormation 模板。

      Create a stack

    3. 指定堆栈详细信息。

      • 如果你使用 us-east-1 作为区域,请按照下图填写各项内容:

        Specify AWS Lambda stack details

        • Stack name:输入堆栈名称。
        • S3Bucket:输入存放 zip 文件的 S3 bucket 名称。
        • S3Key:输入 S3 key。
        • TiDBDatabase:输入 TiDB Cloud Starter 实例名称。
        • TiDBHost:输入 TiDB Cloud 数据库访问的主机 URL。请输入 localhost。
        • TiDBPassword:输入 TiDB Cloud 数据库访问密码。
        • TiDBPort:输入 TiDB Cloud 数据库访问端口。
        • TiDBUser:输入 TiDB Cloud 数据库访问用户名。
      • 如果你使用的 AWS 区域不是 us-east-1,请按照以下步骤操作:

        1. 参考 如果你使用的区域不是 us-east-1,请修改并重新构建 Lambda 函数代码 修改 Lambda 函数代码,重新构建并上传代码包到你自己的 S3 bucket。
        2. 在堆栈详细信息字段中,根据你的配置在 S3Bucket 和 S3Key 参数中指定 S3 bucket 名称和区域。
        3. 其他字段按照上图填写。
    4. 配置堆栈选项。你可以使用默认配置。

      Configure stack options

    5. 审核并创建堆栈。

      Review and create the stack

步骤 2. 使用书店项目

堆栈创建完成后,你可以按如下方式使用该项目:

  1. 访问 AWS 管理控制台中的 API Gateway 服务,点击 TiDBCloudApiGatewayV2 API,然后在左侧点击 API: TiDBCloudApiGatewayV2。

  2. 在 Overview 页面复制 Invoke URL。该 URL 即为 API 端点。

    API Gateway Invoke URL

  3. 使用 Postman 或 cURL 等 API 测试工具测试 API:

    • 初始化模拟书籍:

      curl -X POST -H "Content-Type: application/json" -d '{"count":100}' https://<your-api-endpoint>/book/init
    • 获取所有书籍:

      curl https://<your-api-endpoint>/book
    • 根据书籍 ID 获取书籍:

      curl https://<your-api-endpoint>/book/<book-id>
    • 创建书籍:

      curl -X POST -H "Content-Type: application/json" -d '{ "title": "Book Title", "type": "Test", "publishAt": "2022-12-15T21:01:49.000Z", "stock": 123, "price": 12.34, "authors": "Test Test" }' https:// <your-api-endpoint>/book
    • 更新书籍:

      curl -X PUT -H "Content-Type: application/json" -d '{ "title": "Book Title(updated)" }' https://<your-api-endpoint>/book/<book-id>
    • 删除书籍:

      curl -X DELETE https://<your-api-endpoint>/book/<book-id>

步骤 3. 清理资源

为避免产生不必要的费用,请清理所有已创建的资源。

  1. 访问 AWS 管理控制台。
  2. 删除你创建的 AWS CloudFormation 堆栈。

文档内容是否有帮助?