AWSプラットフォームにデプロイする際の注意点
以下では、さまざまなAWSプラットフォームにデプロイする際に直面する可能性のある注意点について説明します。
AWS RDS Proxy
Prisma ORMはAWS RDS Proxyと互換性があります。ただし、RDS Proxyが接続を「ピン留め」する仕組みのため、Prisma ORMで接続プールに使用してもメリットはありません。
「プロキシへの接続は、ピン留めと呼ばれる状態になることがあります。接続がピン留めされると、その後の各トランザクションは、セッションが終了するまで同じ基盤となるデータベース接続を使用します。他のクライアント接続も、セッションが終了するまでそのデータベース接続を再利用できません。セッションは、Prisma Clientの接続が切断されたときに終了します。」 - AWS RDS Proxy ドキュメント
あらゆるサイズのプリペアドステートメント、または16KBを超えるクエリステートメントは、RDS Proxyがセッションをピン留めする原因となります。 Prisma ORMはすべてのクエリでプリペアドステートメントを使用するため、RDS ProxyをPrisma ORMと併用してもメリットはありません。
AWS Elastic Beanstalk
AWS Elastic Beanstalkは、インフラストラクチャを抽象化し、アプリケーションをAWSに迅速にデプロイできるPaaSのようなデプロイサービスです。
Prisma Clientを使用するアプリケーションをAWS Elastic Beanstalkにデプロイする際、Prisma ORMはPrisma Clientのコードをnode_modules
に生成します。これは通常、package.json
で定義されたpostinstall
フックで行われます。
Beanstalkはpostinstall
フックでのファイルシステムへの書き込み機能を制限しているため、プロジェクトのルートに.npmrc
ファイルを作成し、以下の設定を追加する必要があります。
unsafe-perm=true
unsafe-perm
を有効にすると、*npm*が*root*として強制的に実行され、ファイルシステムアクセス問題を回避し、`postinstall`フック内の`prisma generate`コマンドがコードを生成できるようになります。
エラー: @prisma/client がまだ初期化されていません
このエラーは、AWS Elastic BeanstalkがdevDependencies
をインストールしないために発生します。つまり、Prisma CLIを認識しません。これを解決するには、以下のいずれかの方法があります。
prisma
CLIパッケージをdevDependencies
ではなくdependencies
に追加します。(その後npm install
を実行してpackage-lock.json
を更新してください)。- または、AWS Elastic Beanstalkインスタンスに
devDependencies
をインストールします。これを行うには、AWS Elastic BeanstalkのNPM_USE_PRODUCTION
環境プロパティをfalseに設定する必要があります。
AWS RDS Postgres
Prisma ORMをAWS RDS Postgresと組み合わせて使用すると、マイグレーション中または実行時に接続の問題や以下のエラーが発生する可能性があります。
Error: P1010: User <username> was denied access on the database <database>
原因
AWS RDSはデフォルトでSSL接続を強制し、Prismaはデータベース接続文字列をrejectUnauthorized: true
で解析します。これは有効なSSL証明書を必要とします。証明書が適切に設定されていない場合、Prismaはデータベースに接続できません。
解決策
この問題を解決するには、DATABASE_URL
環境変数にsslmode=no-verify
オプションを含めるように更新します。これにより、厳格なSSL証明書検証がバイパスされ、Prismaがデータベースに接続できるようになります。.env
ファイルを次のように更新してください。
DATABASE_URL=postgresql://<username>:<password>@<host>/<database>?sslmode=no-verify&schema=public
これが機能する理由
sslmode=no-verify
設定は、pg-connection-stringパッケージを介してSSL設定にrejectUnauthorized: false
を渡します。これにより厳格な証明書検証が無効になり、PrismaがRDSデータベースとの接続を確立できるようになります。
注意
sslmode=no-verify
の使用は一時的な解決策となりますが、SSL検証をバイパスするため、本番環境のセキュリティ要件を満たさない可能性があります。そのような場合は、有効なSSL証明書が適切に設定されていることを確認してください。
AWS Lambdaアップロード制限
AWS Lambdaは**デプロイパッケージのアップロード制限**を定義しており、これには以下が含まれます。
- すべてのアプリケーションコード
- Prisma ORMクエリエンジンのようなバイナリ
v6.7.0以降、Prisma ORMにはqueryCompiler
プレビュー機能が搭載されています。
有効にすると、Prisma ClientはRustベースのクエリエンジンバイナリなしで生成されます。:
generator client {
provider = "prisma-client-js"
previewFeatures = ["queryCompiler", "driverAdapters"]
}
queryCompiler
と共に、ドライバアダプタープレビュー機能も必要であることに注意してください。
Lambdaのデプロイパッケージ(.zip)サイズ制限は50MBです。デプロイパッケージを準備する際は、最終的な.zipのサイズを可能な限り小さく保つため、関数が本番環境で必要としないファイルをすべて削除してください。これには一部のPrisma ORMエンジンバイナリも含まれます。
不要なPrisma ORMエンジンを削除する
Prisma CLIは、本番環境では**不要な**追加のエンジンバイナリをダウンロードします。以下のファイルとフォルダを削除できます。
-
node_modules/@prisma/engines
フォルダ全体(Prismaのエンドツーエンドテストで使用されるサンプルBashスクリプトを参照) -
node_modules/.prisma/client
フォルダから、開発プラットフォーム用の**ローカルエンジンファイル**。例えば、Debian (native
) で開発し、AWS Lambda (rhel-openssl-3.0.x
) にデプロイする場合、スキーマは以下のbinaryTargets
を定義するかもしれません。binaryTargets = ["native", "rhel-openssl-3.0.x"]
このシナリオでは
- AWS Lambdaで使用されるエンジンファイルである
node_modules/.prisma/client/query-engine-rhel-openssl-3.0.x
は保持します。 - ローカルでのみ必要な
node_modules/.prisma/client/query-engine-debian-openssl-1.1.x
は削除します。
**注**: Node.js 18以前を使用している場合、AWS Lambdaの正しい
binaryTarget
はrhel-openssl-1.0.x
です。rhel-openssl-3.0.x
はNode.js 18より大きいバージョンに適切なbinaryTarget
です。 - AWS Lambdaで使用されるエンジンファイルである