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
檔案,並新增以下配置
unsafe-perm=true
啟用 unsafe-perm
會強制 npm 以 root 身份執行,從而避免檔案系統存取問題,進而允許 postinstall
hook 中的 prisma generate
命令將程式碼產生到 node_modules
中。
錯誤:@prisma/client 尚未初始化
發生此錯誤的原因是 AWS Elastic Beanstalk 不會安裝 devDependencies
,這表示它不會取得 Prisma CLI。為了補救這一點,您可以
- 將
prisma
CLI 套件新增到您的dependencies
而不是devDependencies
。(確保之後執行npm install
以更新package-lock.json
)。 - 或者在 AWS Elastic Beanstalk 執行個體上安裝您的
devDependencies
。若要執行此操作,您必須將 AWS Elastic BeanstalkNPM_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 定義了部署套件上傳限制,其中包括
- 所有應用程式程式碼
- 二進位檔案,例如 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
),您的 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 的正確
binaryTarget
是rhel-openssl-1.0.x
。rhel-openssl-3.0.x
是適用於 Node.js 18 以上版本的正確binaryTarget
。 -