TypeScript リレーショナルデータベース
このジェネレーターは、Amazon Aurora(PostgreSQLまたはMySQL)とPrisma ORMを使用した新しいリレーショナルデータベースプロジェクトを作成します。AWS CDKまたはTerraformを使用してデータベースをプロビジョニングおよび管理するために必要なアプリケーションコードとインフラストラクチャを生成し、宣言的なスキーマ定義、自動マイグレーションデプロイ、型安全なORMクライアントを提供します。
リレーショナルデータベースの生成
Section titled “リレーショナルデータベースの生成”新しいリレーショナルデータベースプロジェクトは2つの方法で生成できます:
- インストール Nx Console VSCode Plugin まだインストールしていない場合
- VSCodeでNxコンソールを開く
- クリック
Generate (UI)"Common Nx Commands"セクションで - 検索
@aws/nx-plugin - ts#rdb - 必須パラメータを入力
- クリック
Generate
pnpm nx g @aws/nx-plugin:ts#rdbyarn nx g @aws/nx-plugin:ts#rdbnpx nx g @aws/nx-plugin:ts#rdbbunx nx g @aws/nx-plugin:ts#rdb| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| name 必須 | string | - | 生成するデータベースプロジェクトの名前 |
| directory | string | packages | アプリケーションを保存するディレクトリ |
| subDirectory | string | - | プロジェクトが配置されるサブディレクトリ。デフォルトではプロジェクト名になります。 |
| infra | aurora | none | aurora | プロビジョニングするリレーショナルデータベースサービス。 |
| engine | postgres | mysql | postgres | 選択したサービスで使用するデータベースエンジン |
| databaseUser | string | dbadmin | データベース管理者のユーザー名。デフォルトは 'dbadmin' です。 |
| databaseName | string | - | 初期データベース名。デフォルトではプロジェクト名になります。 |
| framework | prisma | prisma | 生成されるプロジェクトで使用するORMフレームワーク。 |
| iac | inherit | cdk | terraform | inherit | 優先するIaCプロバイダー。デフォルトでは、初期選択から継承されます。 |
| preferInstallDependencies | boolean | true | ジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。 |
ジェネレーターの出力
Section titled “ジェネレーターの出力”ジェネレーターは<directory>/<name>ディレクトリに以下のプロジェクト構造を作成します:
Directoryprisma
Directorymodels
- example.prisma サンプルモデル定義
- schema.prisma メインPrismaスキーマ(モデルを参照)
Directorysrc
- index.ts プロジェクトのエントリーポイント
- prisma.ts Prismaランタイムクライアントラッパー
- utils.ts ランタイム設定とシークレットヘルパー
- create-db-user-handler.ts デプロイ時にアプリケーションデータベースユーザーを作成するLambdaハンドラー
- migration-handler.ts デプロイ時にデータベースマイグレーションを実行するLambdaハンドラー
- .gitignore 生成されたPrismaクライアント出力を含むGit無視エントリ
- config.json ローカル開発接続の詳細とランタイム設定キー
- Dockerfile マイグレーションハンドラー用のコンテナイメージ定義
- project.json プロジェクト設定とビルドターゲット
- prisma.config.ts Prisma CLIの設定
ローカル開発スクリプトはすべてのデータベースプロジェクト間で共有され、packages/common/scripts/に生成されます:
Directorypackages/common/scripts/src/rdb
- pull-image.ts データベースコンテナイメージをプル
- start-container.ts ローカルデータベースコンテナを起動
- wait-for-postgres-db.ts ローカルデータベースの準備完了を待機(PostgreSQL)
- wait-for-mysql-db.ts ローカルデータベースの準備完了を待機(MySQL)
インフラストラクチャ
Section titled “インフラストラクチャ”このジェネレータは選択した iacProvider に基づいてInfrastructure as Codeを生成するため、packages/common に関連するCDKコンストラクトまたはTerraformモジュールを含むプロジェクトを作成します。
共通のInfrastructure as Codeプロジェクトは以下の構造を持ちます:
Directorypackages/common/constructs
Directorysrc
Directoryapp/ プロジェクト/ジェネレータ固有のインフラストラクチャ用コンストラクト
- …
Directorycore/
app内のコンストラクトで再利用される汎用コンストラクト- …
- index.ts
appからコンストラクトをエクスポートするエントリーポイント
- project.json プロジェクトのビルドターゲットと設定
Directorypackages/common/terraform
Directorysrc
Directoryapp/ プロジェクト/ジェネレータ固有のインフラストラクチャ用Terraformモジュール
- …
Directorycore/
app内のモジュールで再利用される汎用モジュール- …
- project.json プロジェクトのビルドターゲットと設定
Directorypackages/common/constructs/src
Directoryapp
Directorydbs
- <name>.ts データベース固有のインフラストラクチャ
Directorycore
Directoryrdb
- aurora.ts 汎用 Aurora データベースコンストラクト
Directorypackages/common/terraform/src
Directoryapp
Directorydbs
Directory<name>
- <name>.tf データベース固有のモジュール
Directorycore
Directoryrdb
Directoryaurora
- aurora.tf 汎用 Aurora モジュール
アーキテクチャ
Section titled “アーキテクチャ”デプロイされたデータベースは以下のアーキテクチャを持ちます。デフォルトでは、Amazon RDS Proxy が Aurora クラスターの前に配置され、接続をプールし、IAM 認証を有効にします — 代替方法については RDS Proxy を無効にする を参照してください。PostgreSQL または MySQL エンジンのどちらを選択しても、アーキテクチャは同じです。異なるのは Aurora エンジンのフレーバーのみです。
ローカル開発
Section titled “ローカル開発”データモデリング
Section titled “データモデリング”生成されたプロジェクトはPrisma ORMを使用してデータベーススキーマを定義し、型安全なクライアントを生成します。ワークフローはモデルファーストです:データベースプロジェクトのprisma/models/ディレクトリ配下にPrismaモデルファイルを追加または更新し、それらのモデル変更からマイグレーションを生成します。
Userモデルの例:
model User { id Int @id @default(autoincrement()) firstName String lastName String}詳細については、公式のPrismaデータモデリングガイドを参照してください。
データベースクライアントの生成
Section titled “データベースクライアントの生成”ジェネレーターは、プロジェクトをビルドするたびに型安全なTypeScript Prismaクライアントを作成するgenerateターゲットを自動的に設定します。クライアントはgenerated/prismaに書き込まれます(.gitignoreに追加されます)。
いつでも手動でクライアントを生成することもできます:
pnpm nx generate <your-db-project-name>yarn nx generate <your-db-project-name>npx nx generate <your-db-project-name>bunx nx generate <your-db-project-name>ワークスペースルートからPrisma CLIコマンドを実行するには、prismaターゲットを使用します:
pnpm nx run <project>:prisma generateyarn nx run <project>:prisma generatenpx nx run <project>:prisma generatebunx nx run <project>:prisma generatesrc/prisma.tsのランタイムラッパーは以下をエクスポートします:
getPrisma()- AWS AppConfigからデータベース接続設定を読み込み、IAM認証を使用してPrismaクライアントを作成
クライアントは自動的に:
RUNTIME_CONFIG_APP_ID環境変数を使用してAWS AppConfigからデータベース設定を取得- IAM認証用にAWS RDS Signerを介して一時的な認証トークンを生成
- 証明書検証付きのSSL/TLS接続を管理
- 永続的なデータベース接続プールを通じて接続プーリングを処理
マイグレーションの作成
Section titled “マイグレーションの作成”prisma/models/配下のモデルを追加または更新した後、migrate devを使用してマイグレーションファイルを生成し、同時にローカルデータベースに適用します。
生成されたprismaターゲットは、実行前にローカルデータベースコンテナを自動的に起動します:
pnpm nx run <project>:prisma migrate devyarn nx run <project>:prisma migrate devnpx nx run <project>:prisma migrate devbunx nx run <project>:prisma migrate devローカルデータベースに適用せずにマイグレーションファイルのみを生成したい場合は、--create-onlyを追加します:
pnpm nx run <project>:prisma migrate dev --create-onlyyarn nx run <project>:prisma migrate dev --create-onlynpx nx run <project>:prisma migrate dev --create-onlybunx nx run <project>:prisma migrate dev --create-onlyこれにより、スキーマが変更されるたびにprisma/migrationsに新しいマイグレーションフォルダが生成されます:
Directoryprisma
Directorymigrations
Directory20260405013911_initial_migrations
- migration.sql
- migration_lock.toml
- schema.prisma
AWSスタックをデプロイすると、生成されたインフラストラクチャが生成されたマイグレーションをデプロイされたデータベースに自動的に適用します。
既存のマイグレーションの適用
Section titled “既存のマイグレーションの適用”他の開発者が作成したマイグレーションファイルをプルした場合、migrate deployを使用してそれらの既存のマイグレーションをローカルデータベースに適用します。
pnpm nx run <project>:prisma migrate deployyarn nx run <project>:prisma migrate deploynpx nx run <project>:prisma migrate deploybunx nx run <project>:prisma migrate deployこのローカル開発フローでは、migrate deployはマイグレーションファイルをローカルデータベースに適用します。AWSにデータベースをデプロイするわけではありません。
Prismaコマンドの実行
Section titled “Prismaコマンドの実行”生成されたprismaターゲットはPrisma CLIを公開しているため、ローカルデータベースに対してPrismaがサポートする任意のコマンドを実行できます。利用可能なコマンドについては、Prisma CLIリファレンスを参照してください。
pnpm nx run <project>:prisma <prisma-command>yarn nx run <project>:prisma <prisma-command>npx nx run <project>:prisma <prisma-command>bunx nx run <project>:prisma <prisma-command>Using Prisma Studio
Section titled “Using Prisma Studio”Prisma Studioは、ローカルデータベース用のビジュアルエディタです。テーブルの閲覧、レコードの検査と編集、データのフィルタリング、リレーションのフォロー、組み込みSQLコンソールを介した生SQLの実行に使用できます。開発中のマイグレーションの検証とテストデータのシードに便利です。以下で起動します:
pnpm nx run <project>:prisma studioyarn nx run <project>:prisma studionpx nx run <project>:prisma studiobunx nx run <project>:prisma studioローカルデータベースの停止
Section titled “ローカルデータベースの停止”devを停止する(例:Ctrl+Cで)と、ローカルデータベースコンテナは自動的に削除されますが、名前付きボリュームは保持されるため、データは再起動後も引き継がれます。
データベースへの接続
Section titled “データベースへの接続”任意のTypeScriptプロジェクトで、データベースパッケージからgetPrismaをインポートして呼び出すと、型安全なPrismaクライアントが取得できます:
import { getPrisma } from ':my-scope/db';
const prisma = await getPrisma();const users = await prisma.user.findMany({ orderBy: { id: 'asc' } });getPrisma()は遅延初期化されたキャッシュされたクライアントを返します。同じLambda実行コンテキスト内での後続の呼び出しは、新しい接続を開くのではなく、既存の接続プールを再利用します。
Prismaクライアントはprisma/models/スキーマから派生した完全に型付けされたモデルを公開し、データベースからAPIレスポンスまでのエンドツーエンドの型安全性を提供します。
データベースのデプロイ
Section titled “データベースのデプロイ”リレーショナルデータベースジェネレーターは、選択した iacProvider に基づいて CDK または Terraform インフラストラクチャを作成します。
CDK コンストラクトは common/constructs に作成されます。使用例:
import { MyDatabase } from ':my-scope/common-constructs';
export class ApplicationStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); ... const db = new MyDatabase(this, 'Db', { vpc, vpcSubnets: { subnetType: SubnetType.PRIVATE_ISOLATED, } }); }}これにより、RDS Proxy を備えた Aurora クラスター、管理者認証情報、アプリケーションデータベースユーザー、ランタイム設定の登録、およびマイグレーションハンドラーがプロビジョニングされます。
生成されたインフラストラクチャは、2つのデータベースユーザーを作成します:
- 管理者ユーザー - クラスターのプロビジョニング中に作成され、認証情報は AWS Secrets Manager に保存されます
- アプリケーションユーザー - Lambda カスタムリソースを介して作成され、IAM 認証が有効化され、アプリケーションデータベースに対する DML 権限(SELECT、INSERT、UPDATE、DELETE)が付与されます
Terraform モジュールは common/terraform に作成されます。使用例:
module "my_database" { source = "../../common/terraform/src/app/dbs/my-database"
vpc_id = module.vpc.vpc_id database_subnet_ids = module.vpc.private_isolated_subnet_ids lambda_subnet_ids = module.vpc.private_subnet_ids
tags = local.common_tags}これにより、RDS Proxy を備えた Aurora クラスター、管理者認証情報、create-db-user Lambda、ランタイム設定の登録、マイグレーション Lambda、およびコンテナレジストリリソースがプロビジョニングされます。
生成されたインフラストラクチャは、2つのデータベースユーザーを作成します:
- 管理者ユーザー - クラスターのプロビジョニング中に作成され、認証情報は AWS Secrets Manager に保存されます
- アプリケーションユーザー - Lambda 関数を介して作成され、IAM 認証が有効化され、アプリケーションデータベースに対する DML 権限(SELECT、INSERT、UPDATE、DELETE)が付与されます
アプリケーションユーザーは、ランダムな名前と IAM 認証で自動的に作成されます。生成されたデータベースクライアントは、短期間有効な RDS トークンを使用してこのユーザーとして認証するように既に設定されているため、アプリケーションコードがデータベースパスワードを処理することはありません。
VPC には、パブリックサブネット、エグレス付きプライベートサブネット、およびプライベート分離サブネットを含める必要があります。データベースはプライベート分離サブネットで実行でき、アプリケーション Lambda 関数は AppConfig などの AWS サービスに到達できるように、エグレス付きプライベートサブネットで実行する必要があります。
const vpc = new Vpc(this, 'Vpc', { subnetConfiguration: [ { name: 'public', subnetType: SubnetType.PUBLIC, }, { name: 'private_with_egress', subnetType: SubnetType.PRIVATE_WITH_EGRESS, }, { name: 'private_isolated', subnetType: SubnetType.PRIVATE_ISOLATED, }, ],});module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 6.0"
name = "app" ... public_subnet_names = ["public"] private_subnet_names = ["private_with_egress"] intra_subnet_names = ["private_isolated"]
enable_nat_gateway = true single_nat_gateway = true}connection ジェネレーターを使用して、プロジェクトをこのデータベースに接続します。データベースに到達するために必要なインフラストラクチャの配線については、関連するコンピュートタイプ(例:FastAPI、MCP サーバー、エージェント)の接続ガイドを参照してください。
RDS Proxyの設定
Section titled “RDS Proxyの設定”生成されるインフラストラクチャには、デフォルトでRDS Proxyが含まれており、アプリケーションとAuroraクラスター間に配置されます。RDS Proxyは以下のような利点を提供します:
- コネクションプーリング - アプリケーションインスタンス間で共有できるデータベース接続のプールを維持し、新しい接続を確立するオーバーヘッドを削減します
- 接続の回復性 - Auroraインスタンスの交換やメンテナンス中のフェイルオーバーと再接続を自動的に処理します
- IAM認証 - IAMベースのデータベース認証をサポートし、アプリケーションコードでデータベース認証情報を管理する必要がなくなります
- セキュリティの向上 - すべての接続に対してTLS暗号化を強制します
RDS Proxyを無効にする
Section titled “RDS Proxyを無効にする”RDS Proxyは次のように無効にできます:
import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { ... enableRdsProxy: false,});RDS Proxyが無効になっている場合、アプリケーションはAuroraクラスターエンドポイントに直接接続します。
デフォルトでは、RDS Proxyが有効になっています。必要に応じて無効にできます:
module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" ... enable_rds_proxy = false}RDS Proxyが無効になっている場合、アプリケーションはAuroraクラスターエンドポイントに直接接続します。
SSL Requirements When Connecting Without RDS Proxy
Section titled “SSL Requirements When Connecting Without RDS Proxy”Auroraクラスターに直接接続する場合(RDS Proxyを使用しない場合)、getPrisma()を呼び出すランタイムはAmazon RDS CAバンドルを信頼する必要があります。生成されたPrismaクライアントは証明書検証を有効にします。CAバンドルを利用可能にする方法は、データベースに接続するランタイムによって異なります。
Amazon RDSの場合、以下からグローバルCAバンドルを使用します:
https://truststore.pki.rds.amazonaws.com/global/global-bundle.pemRuntime Container Images
Section titled “Runtime Container Images”ランタイム用に独自のコンテナイメージを準備する場合は、DockerfileでRDS CAバンドルをダウンロードし、オペレーティングシステムのトラストストアに追加します。
RUN curl -fsSL "https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" \ -o /etc/pki/ca-trust/source/anchors/rds-bundle.pem && \ update-ca-trustRUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates && \ rm -rf /var/lib/apt/lists/* && \ curl -fsSL "https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" \ -o /usr/local/share/ca-certificates/rds-bundle.crt && \ update-ca-certificatesZipped Lambda Functions
Section titled “Zipped Lambda Functions”Node.js 20以降のランタイムを使用するZip形式のLambda関数の場合、NODE_EXTRA_CA_CERTSを設定してAmazon RDS CAバンドルを読み込みます:
const api = new Api(this, 'Api', { integrations: Api.defaultIntegrations(this) .withDefaultOptions({ environment: { NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem', }, }) .build(),});module "api" { source = "..." ...
environment_variables = { NODE_EXTRA_CA_CERTS = "/var/runtime/ca-cert.pem" }}詳細については、AWS LambdaのAmazon RDS接続のSSL/TLS要件を参照してください。RDS Proxyを使用する場合、データベースに接続するランタイムでRDS CAバンドルを設定する必要はありません。
クラスターインスタンス
Section titled “クラスターインスタンス”Auroraクラスターのライターインスタンスとリーダーインスタンスを設定します。
import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { ... writer: ClusterInstance.serverlessV2('writer'), readers: [ClusterInstance.serverlessV2('reader')],});module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" ... instance_count = 2 # 1 writer + 1 reader}サーバーレス容量
Section titled “サーバーレス容量”ワークロードに合わせてAurora Serverless v2のスケーリング制限を制御します。
import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { ... serverlessV2MinCapacity: 0.5, serverlessV2MaxCapacity: 8,});module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" ... serverless_min_capacity = 0.5 serverless_max_capacity = 8}エンジンバージョン
Section titled “エンジンバージョン”特定のAuroraエンジンバージョンを固定します。
デフォルトでは、生成されたローカルデータベースコンテナイメージはデフォルトのAuroraエンジンバージョンと一致します。Auroraエンジンバージョンを変更する場合は、最大限の互換性を確保するために、一致するローカルコンテナイメージバージョンも使用することをお勧めします。対応するコミュニティデータベースバージョンを特定するには、Aurora PostgreSQLバージョンおよびAurora MySQLバージョンのAWSリリースノートを参照してください。
ローカルデータベースイメージは、データベースプロジェクトルートにある生成されたconfig.jsonファイルのlocalDev.imageフィールドで設定されます。エンジンバージョンを変更する際は、その値を更新してください。
import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { ... engineVersion: AuroraPostgresEngineVersion.VER_17_7,});module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" ... engine_version = "17.7"}import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { ... engineVersion: AuroraMysqlEngineVersion.VER_3_12_0,});module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" ... engine_version = "8.0.mysql_aurora.3.12.0"}削除保護はデフォルトで有効になっており(CDKではdeletionProtection: true、Terraformではdeletion_protection = true)、Auroraクラスターを誤削除から保護します。
削除保護を無効にする
Section titled “削除保護を無効にする”短期間の開発環境やプレビュースタックなど、データベースの削除が想定される環境では、削除保護を無効にすることができます。
import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { ... deletionProtection: false,});module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" ... deletion_protection = false}削除ポリシー
Section titled “削除ポリシー”CDK コンストラクトはデフォルトで Aurora クラスターを保持します(removalPolicy: RemovalPolicy.RETAIN)。CDK スタックの削除時にクラスターのスナップショットを作成するか、破棄する場合は、これを変更してください。
RemovalPolicy.DESTROY を使用する場合、クラスターを削除する前に削除保護も無効にする必要があります。
import { RemovalPolicy } from 'aws-cdk-lib';import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { ... removalPolicy: RemovalPolicy.SNAPSHOT,});スタックと共にデータベースを削除する一時的な環境の場合:
import { RemovalPolicy } from 'aws-cdk-lib';import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { ... deletionProtection: false, removalPolicy: RemovalPolicy.DESTROY,});Terraform は CDK の削除ポリシーを使用しません。デフォルトでは、モジュールは削除時に最終スナップショットを作成します(skip_final_snapshot = false)。一時的な環境で最終スナップショットをスキップする場合:
module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" ... deletion_protection = false skip_final_snapshot = true}ロギングとモニタリング
Section titled “ロギングとモニタリング”Performance Insightsは、デフォルトでAuroraライターインスタンスで有効になっています(クラスターのKMSキーで暗号化されています)。また、AuroraエンジンログをCloudWatch Logsにエクスポートすることもできます(Aurora PostgreSQLの場合はpostgresql、Aurora MySQLの場合はaudit、error、general、slowquery)。データベースごとにログエクスポートを有効にします:
import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { ... enableCloudwatchLogs: true, enablePerformanceInsights: false, // disable if not required});module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" ... enable_cloudwatch_logs = true enable_performance_insights = false # disable if not required}暗号化キーのローテーション
Section titled “暗号化キーのローテーション”Auroraクラスターとその認証情報シークレットの暗号化に使用されるKMSキーは、デフォルトで自動キーローテーションが有効になっています。セキュリティポリシーで外部的にローテーションを管理している場合は、これを無効にしてください。
import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { ... enableKeyRotation: false,});module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" ... enable_key_rotation = false}MySQL: API Gatewayストリーミングモード
Section titled “MySQL: API Gatewayストリーミングモード”Aurora MySQLをAPI Gatewayストリーミングレスポンス(例:tRPCのhttpBatchStreamLink)と共に使用する場合、Prisma MySQLクライアントはクエリ完了後もNode.jsイベントループを保持し続け、Lambdaがストリームをフラッシュしてリクエストを終了できなくなります。
これを回避するには、各クエリ後にfinallyブロックでクライアントを明示的に切断し、イベントループが終了してストリーミングレスポンスが完了できるようにします。
オプション1: プロシージャごと
export const listExampleTable = publicProcedure .output(z.array(ExampleTableSchema)) .query(async () => { const prisma = await getPrisma(); try { return await prisma.exampleTable.findMany(); } finally { await prisma.$disconnect(); } });オプション2: tRPCミドルウェア
ミドルウェアパターンを使用している場合は、ミドルウェアに$disconnect()呼び出しを追加して、それに基づいて構築されたすべてのプロシージャが自動的にカバーされるようにします:
import { getPrisma } from ':my-scope/db';import { initTRPC } from '@trpc/server';
export interface IDbContext { db: Awaited<ReturnType<typeof getPrisma>>;}
export const createDbPlugin = () => { const t = initTRPC.context<IDbContext>().create(); return t.procedure.use(async (opts) => { const db = await getPrisma(); try { return await opts.next({ ctx: { ...opts.ctx, db, }, }); } finally { await db.$disconnect(); } });};MySQL: IAMトークンの有効期限
Section titled “MySQL: IAMトークンの有効期限”RDS IAM認証トークンは15分後に期限切れになります。MySQL Prismaクライアントは、getPrisma()が呼び出された時点でIAMトークンを静的な値としてキャプチャします。既存の開いている接続は影響を受けませんが、トークンの期限が切れた後に新しい接続を確立する必要がある場合、認証は失敗します。PostgreSQLアダプターは、プールが新しい接続を開くたびにトークンを動的に更新することでこれを回避しますが、MySQLアダプターには同等のメカニズムがありません。
バッチジョブやデータマイグレーションなどの長時間実行タスクの場合は、操作全体に対して一度ではなく、各作業単位の開始時にgetPrisma()を呼び出します。getPrisma()はMySQLに対して常に新しいクライアントを作成し、新しいIAMトークンを取得するため、各接続が有効なトークンで認証されることが保証されます。
connectionジェネレータを使用して、このプロジェクトをワークスペース内の他のプロジェクトと統合できます。このプロジェクトに関連する接続は以下の通りです: