AWSプラットフォームへのデプロイ時の注意点
以下では、さまざまなAWSプラットフォームにデプロイする際に直面する可能性のある注意点について説明します。
AWS RDS Proxy
Prisma ORMはAWS RDS Proxyと互換性があります。ただし、RDS Proxyが接続をピン留めする方法により、Prisma ORMで接続プーリングに使用してもメリットはありません。
「プロキシへの接続は、ピン留めとして知られる状態になる可能性があります。接続がピン留めされると、セッションが終了するまで、後続の各トランザクションは同じ基盤となるデータベース接続を使用します。他のクライアント接続も、セッションが終了するまでそのデータベース接続を再利用できません。セッションは、Prisma Clientの接続がドロップされると終了します。」 - AWS RDS Proxy Docs
プリペアドステートメント(任意のサイズ)または16 KBを超えるクエリステートメントは、RDS Proxyにセッションをピン留めさせます。Prisma ORMはすべてのクエリにプリペアドステートメントを使用するため、Prisma ORMでRDS Proxyを使用してもメリットはありません。
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 BeanstalkNPM_USE_PRODUCTION
環境プロパティをfalseに設定する必要があります。
AWS RDS Postgres
AWS RDS PostgresでPrisma ORMを使用する場合、マイグレーションまたはランタイム中に接続の問題や次のエラーが発生する可能性があります
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パッケージを介してrejectUnauthorized: false
をSSL構成に渡します。これにより、厳密な証明書検証が無効になり、PrismaがRDSデータベースとの接続を確立できるようになります。
注
sslmode=no-verify
を使用することは応急処置になりますが、SSL検証をバイパスするため、本番環境のセキュリティ要件を満たさない場合があります。そのような場合は、有効なSSL証明書が適切に構成されていることを確認してください。
AWS Lambda アップロード制限
AWS Lambdaは、デプロイパッケージのアップロード制限を定義しており、これには以下が含まれます
- すべてのアプリケーションコード
- Prisma ORMクエリエンジンなどのバイナリ
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
です。 -