跳到主要內容

AWS 平台部署注意事項

以下說明部署到不同 AWS 平台時可能遇到的一些注意事項。

AWS RDS Proxy

Prisma ORM 與 AWS RDS Proxy 相容。然而,由於 RDS Proxy 固定連線的方式,將其與 Prisma ORM 一起用於連線池沒有任何好處

「您與 Proxy 的連線可能會進入稱為「固定」的狀態。當連線被固定時,每個後續交易都會使用相同的底層資料庫連線,直到會話結束。其他用戶端連線也無法重複使用該資料庫連線,直到會話結束。當 Prisma Client 的連線被丟棄時,會話就會結束。」- AWS RDS Proxy 文件

預先準備的陳述式(任何大小)或大於 16 KB 的查詢陳述式都會導致 RDS Proxy 固定會話。 由於 Prisma ORM 對所有查詢都使用預先準備的陳述式,因此將 RDS Proxy 與 Prisma ORM 一起使用時,您不會看到任何好處。

AWS Elastic Beanstalk

AWS Elastic Beanstalk 是一種 PaaS 類型的部署服務,可抽象化基礎架構,讓您快速將應用程式部署到 AWS。

當使用 Prisma Client 將應用程式部署到 AWS Elastic Beanstalk 時,Prisma ORM 會將 Prisma Client 程式碼產生到 node_modules 中。這通常在 postinstall hook 中完成。

由於 Beanstalk 限制在 postinstall hook 中寫入檔案系統的能力,您需要在專案根目錄中建立 .npmrc 檔案,並新增以下配置

.npmrc
unsafe-perm=true

啟用 unsafe-perm 會強制 npmroot 身份執行,從而避免檔案系統存取問題,進而允許 postinstall hook 中的 prisma generate 命令將程式碼產生到 node_modules 中。

錯誤:@prisma/client 尚未初始化

發生此錯誤的原因是 AWS Elastic Beanstalk 不會安裝 devDependencies,這表示它不會取得 Prisma CLI。為了補救這一點,您可以

  1. prisma CLI 套件新增到您的 dependencies 而不是 devDependencies。(確保之後執行 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 套件將 rejectUnauthorized: false 傳遞至 SSL 配置。這會停用嚴格的憑證驗證,允許 Prisma 與 RDS 資料庫建立連線。

注意

雖然使用 sslmode=no-verify 可能是一個快速修復方法,但它繞過了 SSL 驗證,可能不符合生產環境的安全性需求。在這種情況下,請確保正確配置有效的 SSL 憑證。

AWS Lambda 上傳限制

AWS Lambda 定義了部署套件上傳限制,其中包括

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),您的 schema 可能會定義以下 binaryTargets

    binaryTargets = ["native", "rhel-openssl-3.0.x"]

    在此情境中

    • 保留 node_modules/.prisma/client/query-engine-rhel-openssl-3.0.x,這是 AWS Lambda 使用的引擎檔案

    • 刪除 node_modules/.prisma/client/query-engine-debian-openssl-1.1.x,這僅在本機需要

    注意:當使用 Node.js 18 或更早版本時,適用於 AWS Lambda 的正確 binaryTargetrhel-openssl-1.0.xrhel-openssl-3.0.x 是適用於 Node.js 18 以上版本的正確 binaryTarget