AWS Lambda 関数の mysql2 を使用して TiDB に接続する
TiDB は MySQL 互換データベース、 AWSラムダ関数はコンピューティング サービス、 mysql2は Node.js 用の一般的なオープンソース ドライバーです。
このチュートリアルでは、AWS Lambda 関数で TiDB と mysql2 を使用して次のタスクを実行する方法を学習できます。
- 環境をセットアップします。
- mysql2 を使用して TiDB クラスターに接続します。
- アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作のサンプルコードスニペットを見つけることができます。
- AWS Lambda 関数をデプロイ。
注記
このチュートリアルは、TiDB サーバーレスおよび TiDB セルフホストで動作します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Node.js 18以降。
- ギット 。
- TiDB クラスター。
- 管理者権限を持つAWSユーザー 。
- AWS CLI
- AWS SAM CLI
TiDB クラスターがない場合は、次のように作成できます。
- (推奨) TiDB サーバーレスクラスターの作成に従って、独自のTiDB Cloudクラスターを作成します。
- ローカル テスト TiDB クラスターをデプロイまたは本番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 Serverless
- TiDB Self-Hosted
クラスターページに移動し、ターゲット クラスターの名前をクリックして、その概要ページに移動します。
右上隅にある「接続」をクリックします。接続ダイアログが表示されます。
接続ダイアログの設定が動作環境と一致していることを確認してください。
エンドポイント タイプは
Public
に設定されますブランチは
main
に設定されています[接続先] は
General
に設定されていますオペレーティング システムが環境に一致します。
注記
Node.js アプリケーションでは、TLS (SSL) 接続を確立するときにデフォルトで組み込みの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 コンソールいずれかを使用して 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: {
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 ステートメントがあまり含まれないシナリオでは、 続編 、 TypeORM 、またはプリズマのような ORM フレームワークを使用すると、開発効率が大幅に向上します。
- アプリケーションの RESTful API を構築するには、 APIゲートウェイでAWS Lambdaを使用するをお勧めします。
- TiDB Serverless と AWS Lambda を使用した高性能アプリケーションの設計については、 このブログを参照してください。
次のステップ
- AWS Lambda 関数で TiDB を使用する方法の詳細については、 TiDB-Lambda-integration/aws-lambda-bookstore デモを参照してください。 AWS API Gateway を使用して、アプリケーション用の RESTful API を構築することもできます。
mysql2
からmysql2
のドキュメントの使用法をさらに学習します。- AWS Lambdaの使い方を
Lambda
の AWS 開発者ガイドから詳しく学びましょう。 - TiDB アプリケーション開発単一テーブルの読み取りベスト プラクティスについて取引 、 開発者ガイドの章 ( データの挿入など) データを更新する参照データの削除 SQLパフォーマンスの最適化ください。
- プロフェッショナルを通じてTiDB 開発者コースを学び、試験合格後にTiDB 認定獲得します。
助けが必要?
不和またはサポートチケットを作成するについて質問してください。