📣
TiDB Cloud Premium はパブリックプレビュー中です。エンタープライズワークロード向けの無制限のスケーリング、即時の弾力性、高度なセキュリティを提供します。このページは自動翻訳されたものです。原文はこちらからご覧ください。

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



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

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

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

前提条件

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

TiDBクラスタをお持ちでない場合は、以下の手順で作成できます。

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

TiDBに接続するには、サンプルアプリを実行してください。

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

ステップ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に接続してください。

    1. My TiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。

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

    3. 接続ダイアログの設定がご使用のオペレーティング環境と一致していることを確認してください。

      • Connection TypePublicに設定されています。

      • Branchmainに設定されています。

      • Connect WithGeneralに設定されています。

      • お使いの環境に合ったOperating Systemを選択してください。

    4. Generate Passwordをクリックすると、ランダムなパスワードが生成されます。

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

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

      {}内のプレースホルダーを、接続ダイアログで取得した値に置き換えてください。

    1. My TiDBページに移動し、対象のTiDB Cloud Premiumインスタンスの名前をクリックして概要ページに移動します。

    2. 左側のナビゲーションペインで、 Settings > Networkingをクリックします。

    3. Networkingページで、Public EndpointEnableをクリックし、次にAdd IP Addressをクリックします。

      クライアントのIPアドレスがアクセスリストに追加されていることを確認してください。

    4. 左側のナビゲーションペインでOverviewをクリックすると、インスタンスの概要ページに戻ります。

    5. 右上隅のConnectをクリックしてください。接続ダイアログが表示されます。

    6. 接続ダイアログで、 Connection TypeドロップダウンリストからPublicを選択します。

      • 公開エンドポイントがまだ有効化中であることを示すメッセージが表示された場合は、処理が完了するまでお待ちください。
      • まだパスワードを設定していない場合は、ダイアログのSet Root Passwordをクリックしてください。
      • サーバー証明書を確認する必要がある場合、または接続に失敗して認証局(CA)証明書が必要な場合は、 CA certをクリックしてダウンロードしてください。
      • Public接続タイプに加えて、 TiDB Cloud Premium はPrivate Endpoint接続をサポートします。詳細については、 AWS PrivateLink経由でTiDB Cloud Premiumに接続しますを参照してください。
    7. 対応する接続​​文字列をコピーしてenv.jsonに貼り付けてください。以下に例を示します。

      { "Parameters": { "TIDB_HOST": "{host}", "TIDB_PORT": "4000", "TIDB_USER": "root", "TIDB_PASSWORD": "{password}", "TIDB_ENABLE_SSL": "false" } }

      {}内のプレースホルダーを、接続ダイアログで取得した値に置き換えてください。

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

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

    {}内のプレースホルダーを、 Connectウィンドウで取得した値に置き換えてください。

    ステップ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 コンソールのFunctionsページで、 Configurationタブを選択し、 Environment variablesを選択します。
      2. Editを選択してください。
      3. データベースへのアクセス資格情報を追加するには、以下の手順を実行してください。
        • Add environment variableを選択し、 KeyTIDB_HOSTと入力し、 Valueにホスト名を入力します。
        • Add environment variableを選択し、 KeyTIDB_PORTと入力し、 Valueにポート番号を入力します(デフォルトは4000です)。
        • Add environment variableを選択し、 KeyTIDB_USERと入力し、 Valueにユーザー名を入力します。
        • Add environment variableを選択し、 KeyTIDB_PASSWORDと入力し、 Valueにデータベース作成時に選択したパスワードを入力します。
        • Saveを選択してください。

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

    以下のサンプルコードスニペットを参考に、独自のアプリケーション開発を完成させてください。

    完全なサンプルコードと実行方法については、 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: process.env.TIDB_ENABLE_SSL === 'true' ? { minVersion: 'TLSv1.2', rejectUnauthorized: true, } : null, 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 1Playerレコードを返します。

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

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

    データの更新

    以下のクエリは、 50の ID を持つ50Playerコインと1の商品を追加します。

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

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

    データを削除する

    以下のクエリは、IDがPlayerである1レコードを削除します。

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

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

    役立つメモ

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

    次のステップ

    お困りですか?

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