部署到 AWS 平台时的注意事项
以下描述了您在部署到不同 AWS 平台时可能遇到的一些注意事项。
AWS RDS Proxy
Prisma ORM 与 AWS RDS Proxy 兼容。然而,由于 RDS Proxy 固定连接的方式,使用它进行连接池对于 Prisma ORM 没有益处。
“您与代理的连接可能会进入一种称为固定的状态。当连接被固定时,后续的每次事务都使用相同的底层数据库连接,直到会话结束。在会话结束之前,其他客户端连接也无法重用该数据库连接。当 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
中。这通常在 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 包添加到您的dependencies
而不是devDependencies
。(确保之后运行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 包将 rejectUnauthorized: false
传递给 SSL 配置。这会禁用严格的证书验证,允许 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
),您的 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
。 - 保留