AWS Lambda関数でmysql2を使用してTiDBに接続する
TiDBはMySQL互換データベース、 AWS Lambda関数はコンピューティングサービス、 mysql2はNode.jsで人気のオープンソースドライバです。
このチュートリアルでは、AWS Lambda FunctionsでTiDBとmysql2を使用して以下のタスクを実行する方法を学びます。
- 環境をセットアップしてください。
- mysql2を使用してTiDBに接続します。
- アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作用のサンプルコードスニペットを見つけることができます。
- AWS Lambda関数をデプロイ。
注記
このチュートリアルは、 TiDB Cloud Starter、 TiDB Cloud Essential、 TiDB Cloud Premium、およびTiDB Self-Managedに対応しています。
前提条件
このチュートリアルを完了するには、以下が必要です。
- Node.js 18以降。
- Git 。
- TiDBクラスタ。
- 管理者権限を持つAWSユーザー。
- AWS CLI
- AWS SAM CLI
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ページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。
右上隅の「接続」をクリックします。接続ダイアログが表示されます。
接続ダイアログの設定がご使用のオペレーティング環境と一致していることを確認してください。
接続タイプは
Publicに設定されています。ブランチは
mainに設定されています。Connect With は
Generalに設定されています。お使いの環境に合ったオペレーティングシステムを選択してください。
注記
Node.jsアプリケーションでは、SSL CA証明書を提供する必要はありません。Node.jsはTLS(SSL)接続を確立する際に、デフォルトで組み込みのMozilla CA証明書を使用するためです。
「パスワードを生成」をクリックすると、ランダムなパスワードが生成されます。
ヒント
以前にパスワードを作成したことがある場合は、元のパスワードを使用するか、 「パスワードをリセット」をクリックして新しいパスワードを作成できます。
対応する接続文字列をコピーして
env.jsonに貼り付けてください。以下に例を示します。{ "Parameters": { "TIDB_HOST": "{gateway-region}.aws.tidbcloud.com", "TIDB_PORT": "4000", "TIDB_USER": "{prefix}.root", "TIDB_PASSWORD": "{password}", "TIDB_ENABLE_SSL": "true" } }{}内のプレースホルダーを、接続ダイアログで取得した値に置き換えてください。
私のTiDBページに移動し、対象のTiDB Cloud Premiumインスタンスの名前をクリックして概要ページに移動します。
左側のナビゲーションペインで、 [設定] > [ネットワーク]をクリックします。
ネットワークのページで、 [パブリックエンドポイント**を有効にする]をクリックし、次に[IP アドレスの追加]**をクリックします。
クライアントのIPアドレスがアクセスリストに追加されていることを確認してください。
左側のナビゲーションペインで「概要」をクリックすると、インスタンスの概要ページに戻ります。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログで、 「接続タイプ」ドロップダウンリストから「パブリック」を選択します。
- 公開エンドポイントがまだ有効化中であることを示すメッセージが表示された場合は、処理が完了するまでお待ちください。
- まだパスワードを設定していない場合は、ダイアログの「ルートパスワードを設定」をクリックしてください。
- サーバー証明書を確認する必要がある場合、または接続に失敗して認証局(CA)証明書が必要な場合は、 「CA証明書」をクリックしてダウンロードしてください。
- パブリック接続タイプに加えて、 TiDB Cloud Premium はプライベート エンドポイント接続をサポートします。詳細については、 AWS PrivateLink経由でTiDB Cloud Premiumに接続します。を参照してください。
対応する接続文字列をコピーして
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:コードを実行して結果を確認する
(前提条件) AWS SAM CLIをインストールしてください。
バンドルを作成する:
npm run buildサンプルLambda関数を呼び出します。
sam local invoke --env-vars env.json -e events/event.json "tidbHelloWorldFunction"ターミナルの出力を確認してください。出力が以下の例と似ていれば、接続は成功しています。
{"statusCode":200,"body":"{\"results\":[{\"Hello World\":\"Hello World\"}]}"}
接続が成功したことを確認したら、次のセクションセクションに従って AWS Lambda 関数をデプロイできます。
AWS Lambda関数をデプロイ
AWS Lambda関数は、 SAM CLIまたはAWS Lambdaコンソールプラグインのいずれかを使用してデプロイできます。
SAM CLIの導入(推奨)
(前提条件) AWS SAM CLIをインストールします。
バンドルを作成する:
npm run buildtemplate.ymlの環境変数を更新してください。Environment: Variables: TIDB_HOST: {tidb_server_host} TIDB_PORT: 4000 TIDB_USER: {prefix}.root TIDB_PASSWORD: {password}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}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コンソールの展開
バンドルを作成する:
npm run build # Bundle for AWS Lambda # ===================== # dist/index.zipAWS Lambdaコンソールコンソールにアクセスしてください。
Lambda関数の作成の手順に従って、Node.js Lambda 関数を作成します。
Lambda デプロイメントパッケージの手順に従って、
dist/index.zipファイルをアップロードします。Lambda 関数で対応する接続文字列をコピーして設定します。
- Lambda コンソールの機能ページで、 [コンフィグレーション]タブを選択し、 [環境変数]を選択します。
- 「編集」を選択してください。
- データベースへのアクセス資格情報を追加するには、以下の手順を実行してください。
- 「環境変数の追加」を選択し、 「キー」に
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: 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 Player 1 } レコードを返します。
const [rows] = await pool.query('SELECT id, coins, goods FROM players WHERE id = ?;', [1]);
console.log(rows[0]);
詳細については、 クエリデータを参照してください。
データの更新
以下のクエリは、 50の ID を持つ50にPlayerコインと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 ステートメントがあまり含まれないシナリオでは、シークエライズ、 TypeORM 、またはプリズマなどの ORM フレームワークを使用すると、開発効率が大幅に向上します。
- アプリケーション用の RESTful API を構築するには、 AWS LambdaをAPI Gatewayで使用するお勧めします。
- TiDB Cloud Starterと AWS Lambda を使用した高性能アプリケーションの設計については、 このブログを参照してください。
次のステップ
- AWS Lambda関数でTiDBを使用する方法の詳細については、 TiDB-Lambda統合/aws-lambda-bookstoreデモご覧ください。また、AWS API Gatewayを使用して、アプリケーション用のRESTful APIを構築することもできます。
mysql2の使用法について詳しくは、mysql2のドキュメントご覧ください。- AWS Lambda の使用方法の詳細についてはAWS
Lambdaの開発者ガイドご覧ください。 - 開発者ガイドデータを挿入するデータの更新、データを削除する、「SQL パフォーマンス最適化」などの章単一表の読み取り読んで、TiDB アプリケーション 取引SQLパフォーマンス最適化。
- プロフェッショナルなTiDB開発者向けコースコースを通じて学習し、試験に合格するとTiDB認定資格を取得します。
お困りですか?
- 不和or スラックコミュニティに質問してください。
- TiDB Cloudのサポートチケットを送信してください
- TiDB Self-Managedのサポートチケットを送信してください