AWS Lambda 関数の mysql2 を使用して TiDB に接続する

TiDB は MySQL 互換データベース、 AWSラムダ関数はコンピューティング サービス、 mysql2は Node.js 用の一般的なオープンソース ドライバーです。

このチュートリアルでは、AWS Lambda 関数で TiDB と mysql2 を使用して次のタスクを実行する方法を学習できます。

  • 環境をセットアップします。
  • mysql2 を使用して TiDB クラスターに接続します。
  • アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作のサンプルコードスニペットを見つけることができます。
  • AWS Lambda 関数をデプロイ。

注記

このチュートリアルは、TiDB サーバーレスおよび TiDB セルフホストで動作します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

TiDB クラスターがない場合は、次のように作成できます。

AWS アカウントまたはユーザーをお持ちでない場合は、 Lambda の入門ガイドの手順に従って作成できます。

サンプル アプリを実行して TiDB に接続する

このセクションでは、サンプル アプリケーション コードを実行して TiDB に接続する方法を説明します。

注記

完全なコード スニペットと実行手順については、 tidb-samples/tidb-aws-lambda-quickstart GitHub リポジトリを参照してください。

ステップ 1: サンプル アプリ リポジトリのクローンを作成する

ターミナル ウィンドウで次のコマンドを実行して、サンプル コード リポジトリのクローンを作成します。

git clone git@github.com:tidb-samples/tidb-aws-lambda-quickstart.git cd tidb-aws-lambda-quickstart

ステップ 2: 依存関係をインストールする

次のコマンドを実行して、サンプル アプリに必要なパッケージ ( mysql2を含む) をインストールします。

npm install

ステップ 3: 接続情報を構成する

選択した TiDB デプロイメント オプションに応じて、TiDB クラスターに接続します。

  • TiDB Serverless
  • TiDB Self-Hosted
  1. クラスターページに移動し、ターゲット クラスターの名前をクリックして、その概要ページに移動します。

  2. 右上隅にある「接続」をクリックします。接続ダイアログが表示されます。

  3. 接続ダイアログの設定が動作環境と一致していることを確認してください。

    • エンドポイント タイプはPublicに設定されます

    • ブランチはmainに設定されています

    • [接続先]Generalに設定されています

    • オペレーティング システムが環境に一致します。

    注記

    Node.js アプリケーションでは、TLS (SSL) 接続を確立するときにデフォルトで組み込みのMozilla CA 証明書を使用するため、SSL CA 証明書を提供する必要はありません。

  4. 「パスワードの生成」をクリックして、ランダムなパスワードを作成します。

    ヒント

    以前にパスワードを生成したことがある場合は、元のパスワードを使用するか、 「パスワードのリセット」をクリックして新しいパスワードを生成できます。

  5. 対応する接続​​文字列をコピーしてenv.jsonに貼り付けます。以下は例です。

    { "Parameters": { "TIDB_HOST": "{gateway-region}.aws.tidbcloud.com", "TIDB_PORT": "4000", "TIDB_USER": "{prefix}.root", "TIDB_PASSWORD": "{password}" } }

    {}のプレースホルダーを、接続ダイアログで取得した値に置き換えます。

対応する接続​​文字列をコピーしてenv.jsonに貼り付けます。以下は例です。

{ "Parameters": { "TIDB_HOST": "{tidb_server_host}", "TIDB_PORT": "4000", "TIDB_USER": "root", "TIDB_PASSWORD": "{password}" } }

{}のプレースホルダーを、 「接続」ウィンドウで取得した値に置き換えます。

ステップ 4: コードを実行して結果を確認する

  1. (前提条件) AWS SAM CLIをインストールします。

  2. バンドルをビルドします。

    npm run build
  3. サンプルの Lambda 関数を呼び出します。

    sam local invoke --env-vars env.json -e events/event.json "tidbHelloWorldFunction"
  4. 端末の出力を確認します。出力が次のような場合、接続は成功しています。

    {"statusCode":200,"body":"{\"results\":[{\"Hello World\":\"Hello World\"}]}"}

接続が成功したことを確認したら、 次のセクションに従って AWS Lambda 関数をデプロイします。

AWS Lambda 関数をデプロイ

サム・クリまたはAWS Lambda コンソールいずれかを使用して AWS Lambda 関数をデプロイできます。

  1. ( 前提条件 ) AWS SAM CLIを取り付けます。

  2. バンドルをビルドします。

    npm run build
  3. template.ymlで環境変数を更新します。

    Environment: Variables: TIDB_HOST: {tidb_server_host} TIDB_PORT: 4000 TIDB_USER: {prefix}.root TIDB_PASSWORD: {password}
  4. AWS 環境変数を設定します ( 短期資格情報を参照)。

    export AWS_ACCESS_KEY_ID={your_access_key_id} export AWS_SECRET_ACCESS_KEY={your_secret_access_key} export AWS_SESSION_TOKEN={your_session_token}
  5. AWS Lambda 関数をデプロイ。

    sam deploy --guided # Example: # Configuring SAM deploy # ====================== # Looking for config file [samconfig.toml] : Not found # Setting default arguments for 'sam deploy' # ========================================= # Stack Name [sam-app]: tidb-aws-lambda-quickstart # AWS Region [us-east-1]: # #Shows you resources changes to be deployed and require a 'Y' to initiate deploy # Confirm changes before deploy [y/N]: # #SAM needs permission to be able to create roles to connect to the resources in your template # Allow SAM CLI IAM role creation [Y/n]: # #Preserves the state of previously provisioned resources when an operation fails # Disable rollback [y/N]: # tidbHelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y # tidbHelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y # tidbHelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y # tidbHelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y # Save arguments to configuration file [Y/n]: # SAM configuration file [samconfig.toml]: # SAM configuration environment [default]: # Looking for resources needed for deployment: # Creating the required resources... # Successfully created!

Web コンソールの展開

  1. バンドルをビルドします。

    npm run build # Bundle for AWS Lambda # ===================== # dist/index.zip
  2. AWS Lambda コンソールにアクセスしてください。

  3. Lambda 関数の作成の手順に従って、Node.js Lambda 関数を作成します。

  4. Lambdaデプロイメントパッケージの手順に従って、 dist/index.zipファイルをアップロードします。

  5. Lambda 関数では対応する接続​​文字列をコピーして構成します

    1. Lambda コンソールの機能ページで、 [コンフィグレーション]タブを選択し、 [環境変数]を選択します。
    2. [編集]を選択します。
    3. データベース アクセス資格情報を追加するには、次の手順を実行します。
      • [環境変数の追加]を選択し、 [キー]TIDB_HOSTを入力し、[**値]**にホスト名を入力します。
      • [環境変数の追加]を選択し、 [キー]TIDB_PORTを入力し、 [値]にポートを入力します (デフォルトは 4000)。
      • [環境変数の追加]を選択し、 [キー]TIDB_USERを入力し、 [値]にユーザー名を入力します。
      • [環境変数の追加]を選択し、 [キー]TIDB_PASSWORDを入力し、[**値]**にデータベースの作成時に選択したパスワードを入力します。
      • [保存]を選択します。

サンプルコードスニペット

次のサンプル コード スニペットを参照して、独自のアプリケーション開発を完了できます。

完全なサンプル コードとその実行方法については、 tidb-samples/tidb-aws-lambda-quickstartリポジトリを確認してください。

TiDB に接続する

次のコードは、環境変数で定義されたオプションを使用して TiDB への接続を確立します。

// lib/tidb.ts import mysql from 'mysql2'; let pool: mysql.Pool | null = null; function connect() { return mysql.createPool({ host: process.env.TIDB_HOST, // TiDB host, for example: {gateway-region}.aws.tidbcloud.com port: process.env.TIDB_PORT ? Number(process.env.TIDB_PORT) : 4000, // TiDB port, default: 4000 user: process.env.TIDB_USER, // TiDB user, for example: {prefix}.root password: process.env.TIDB_PASSWORD, // TiDB password database: process.env.TIDB_DATABASE || 'test', // TiDB database name, default: test ssl: { minVersion: 'TLSv1.2', rejectUnauthorized: true, }, connectionLimit: 1, // Setting connectionLimit to "1" in a serverless function environment optimizes resource usage, reduces costs, ensures connection stability, and enables seamless scalability. maxIdle: 1, // max idle connections, the default value is the same as `connectionLimit` enableKeepAlive: true, }); } export function getPool(): mysql.Pool { if (!pool) { pool = connect(); } return pool; }

データの挿入

次のクエリは、単一のPlayerレコードを作成し、 ResultSetHeaderオブジェクトを返します。

const [rsh] = await pool.query('INSERT INTO players (coins, goods) VALUES (?, ?);', [100, 100]); console.log(rsh.insertId);

詳細については、 データの挿入を参照してください。

クエリデータ

次のクエリは、ID 1による単一のPlayerレコードを返します。

const [rows] = await pool.query('SELECT id, coins, goods FROM players WHERE id = ?;', [1]); console.log(rows[0]);

詳細については、 クエリデータを参照してください。

データを更新する

次のクエリは、ID 1Player50コインと50グッズを追加します。

const [rsh] = await pool.query( 'UPDATE players SET coins = coins + ?, goods = goods + ? WHERE id = ?;', [50, 50, 1] ); console.log(rsh.affectedRows);

詳細については、 データを更新するを参照してください。

データの削除

次のクエリは、ID 1Playerレコードを削除します。

const [rsh] = await pool.query('DELETE FROM players WHERE id = ?;', [1]); console.log(rsh.affectedRows);

詳細については、 データの削除を参照してください。

便利なメモ

  • 接続プールを使用してデータベース接続を管理すると、接続の頻繁な確立と破棄によって生じるパフォーマンスのオーバーヘッドを軽減できます。
  • SQL インジェクションを回避するには、 準備されたステートメントを使用することをお勧めします。
  • 複雑な SQL ステートメントがあまり含まれないシナリオでは、 続編TypeORM 、またはプリズマのような ORM フレームワークを使用すると、開発効率が大幅に向上します。
  • アプリケーションの RESTful API を構築するには、 APIゲートウェイでAWS Lambdaを使用するをお勧めします。
  • TiDB Serverless と AWS Lambda を使用した高性能アプリケーションの設計については、 このブログを参照してください。

次のステップ

助けが必要?

不和またはサポートチケットを作成するについて質問してください。

このページは役に立ちましたか?