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 で機能します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Node.js 18以降。
- ギット 。
- TiDB クラスター。
- 管理者権限を持つAWS ユーザー 。
- AWS CLI
- AWS SAM CLI
TiDB クラスターがない場合は、次のように作成できます。
- (推奨) TiDB Cloud Serverless クラスターの作成に従って、独自のTiDB Cloudクラスターを作成します。
- ローカルテストTiDBクラスタをデプロイまたは本番の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
クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。
右上隅の「接続」をクリックします。接続ダイアログが表示されます。
接続ダイアログの構成が動作環境と一致していることを確認します。
接続タイプは
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}"
}
}
{}
のプレースホルダーを、接続ウィンドウで取得した値に置き換えます。
ステップ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 サンプル/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 認定獲得します。
ヘルプが必要ですか?
不和またはスラック 、またはサポートチケットを送信するについてコミュニティに質問してください。