AWS Lambda関数でmysql2を使ってTiDBに接続する
TiDB は MySQL 互換のデータベース、 AWS Lambda関数コンピューティング サービス、 MySQL2 Node.js 用の人気のオープン ソース ドライバーです。
このチュートリアルでは、AWS Lambda 関数で TiDB と mysql2 を使用して次のタスクを実行する方法を学習します。
- 環境を設定します。
- mysql2 を使用して TiDB クラスターに接続します。
- アプリケーションをビルドして実行します。オプションで、基本的なCRUD操作用のサンプルコードスニペット見つけることもできます。
- AWS Lambda 関数をデプロイ。
注記
このチュートリアルは、TiDB Cloud Serverless と TiDB Self-Managed で機能します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Node.js 18以降。
- ギット 。
- TiDB クラスター。
- 管理者権限を持つAWSユーザー 。
- AWS CLI
- AWS SAM CLI
TiDB クラスターがない場合は、次のように作成できます。
- (推奨) TiDB Cloud Serverless クラスターの作成に従って、独自のTiDB Cloudクラスターを作成します。
- ローカルテストTiDBクラスタをデプロイまたは本番のTiDBクラスタをデプロイに従ってローカル クラスターを作成します。
AWS アカウントまたはユーザーがない場合は、ガイドLambdaを使い始めるの手順に従って作成できます。
サンプルアプリを実行してTiDBに接続する
このセクションでは、サンプル アプリケーション コードを実行して TiDB に接続する方法を説明します。
注記
完全なコード スニペットと実行手順については、 tidb-samples/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
クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。
右上隅の「接続」をクリックします。接続ダイアログが表示されます。
接続ダイアログの構成が動作環境と一致していることを確認します。
接続タイプは
Publicに設定されていますブランチは
mainに設定されています接続先が
Generalに設定されていますオペレーティング システムは環境に適合します。
注記
Node.js アプリケーションでは、TLS (SSL) 接続を確立するときに Node.js がデフォルトで組み込みのMozilla CA証明書使用するため、SSL CA 証明書を提供する必要はありません。
ランダムなパスワードを作成するには、 「パスワードの生成」をクリックします。
ヒント
以前にパスワードを生成したことがある場合は、元のパスワードを使用するか、 「パスワードのリセット」をクリックして新しいパスワードを生成することができます。
対応する接続文字列をコピーして
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}"
}
}
{}のプレースホルダーを、 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関数をデプロイ
SAM CLIまたはAWS Lambdaコンソールいずれかを使用して 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-クイックスタートリポジトリを参照してください。
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 1のPlayerにコイン50と商品50を追加します。
const [rsh] = await pool.query(
'UPDATE players SET coins = coins + ?, goods = goods + ? WHERE id = ?;',
[50, 50, 1]
);
console.log(rsh.affectedRows);
詳細についてはデータを更新するを参照してください。
データを削除する
次のクエリは、ID 1のPlayerレコードを削除します。
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 を使用して高パフォーマンス アプリケーションを設計するには、 このブログを参照してください。
次のステップ
- AWS Lambda 関数で TiDB を使用する方法の詳細については、 TiDB-Lambda-integration/aws-lambda-bookstore デモをご覧ください。また、AWS API Gateway を使用して、アプリケーション用の RESTful API を構築することもできます。
mysql2のドキュメントからmysql2の使用法について詳しく学びます。LambdaのAWS開発者ガイドから AWS Lambda の使い方を詳しく学びます。- 開発者ガイドのデータを挿入する 、 データを更新する 、 データを削除する 、 単一テーブルの読み取り 、 取引 、 SQLパフォーマンスの最適化などの章で、 TiDB アプリケーション開発のベスト プラクティスを学習します。
- プロフェッショナルTiDB開発者コースを通じて学び、試験に合格するとTiDB認定獲得します。
ヘルプが必要ですか?
不和またはスラック 、あるいはサポートチケットを送信するについてコミュニティに質問してください。