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

TiDB は MySQL 互換のデータベース、 AWS Lambda 関数はコンピューティング サービス、 マイSQL2 Node.js 用の人気のあるオープン ソース ドライバーです。

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

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

注記

このチュートリアルは、 TiDB Cloud Serverless および TiDB Self-Managed で機能します。

前提条件

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

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

AWS アカウントまたはユーザーがない場合は、ガイドLambda を使い始めるの手順に従って作成できます。

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

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

注記

完全なコード スニペットと実行手順については、 tidb サンプル/tidb-aws-lambda クイックスタート 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 Cloud Serverless
  • TiDB Self-Managed
  1. クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。

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

  3. 接続ダイアログの構成が動作環境と一致していることを確認します。

    • 接続タイプPublicに設定されています

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

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

    • オペレーティング システムは環境に適合します。

    注記

    Node.js アプリケーションでは、TLS (SSL) 接続を確立するときに Node.js がデフォルトで組み込みの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 関数は、 SAM CLIまたは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 サンプル/tidb-aws-lambda クイックスタートリポジトリを参照してください。

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 1Playerにコイン50枚と商品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 ステートメントがあまり含まれないシナリオでは、 続編タイプORMプリズマなどの ORM フレームワークを使用すると、開発効率が大幅に向上します。
  • アプリケーション用の RESTful API を構築するには、 API GatewayでAWS Lambdaを使用するをお勧めします。
  • TiDB Cloud Serverless と AWS Lambda を使用して高性能アプリケーションを設計するには、 このブログを参照してください。

次のステップ

ヘルプが必要ですか?

不和またはスラック 、またはサポートチケットを送信するについてコミュニティに質問してください。

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