主要コンテンツへスキップ

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ファイルを作成し、以下の設定を追加する必要があります。

.npmrc
unsafe-perm=true

unsafe-permを有効にすると、*npm*が*root*として強制的に実行され、ファイルシステムアクセス問題を回避し、`postinstall`フック内の`prisma generate`コマンドがコードを生成できるようになります。

エラー: @prisma/client がまだ初期化されていません

このエラーは、AWS Elastic BeanstalkがdevDependenciesをインストールしないために発生します。つまり、Prisma CLIを認識しません。これを解決するには、以下のいずれかの方法があります。

  1. prisma CLIパッケージをdevDependenciesではなくdependenciesに追加します。(その後npm installを実行してpackage-lock.jsonを更新してください)。
  2. または、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は**デプロイパッケージのアップロード制限**を定義しており、これには以下が含まれます。

注記

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は、本番環境では**不要な**追加のエンジンバイナリをダウンロードします。以下のファイルとフォルダを削除できます。

  1. node_modules/@prisma/enginesフォルダ全体(Prismaのエンドツーエンドテストで使用されるサンプルBashスクリプトを参照)

  2. 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の正しいbinaryTargetrhel-openssl-1.0.xです。rhel-openssl-3.0.xはNode.js 18より大きいバージョンに適切なbinaryTargetです。

© . All rights reserved.