部署到 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 对所有查询使用准备好的语句,因此在使用 Prisma ORM 与 RDS Proxy 时您不会看到任何好处。
AWS Elastic Beanstalk
AWS Elastic Beanstalk 是一种类似 PaaS 的部署服务,它抽象了基础设施,并允许您快速将应用程序部署到 AWS。
在使用 Prisma Client 将应用程序部署到 AWS Elastic Beanstalk 时,Prisma ORM 会将 Prisma Client 代码生成到 node_modules
中。这通常在 postinstall
钩子中完成。
由于 Beanstalk 限制了在 postinstall
钩子中写入文件系统的能力,您需要在项目的根目录中创建一个 .npmrc
文件,并添加以下配置
unsafe-perm=true
启用 unsafe-perm
会强制 npm 作为 root 运行,从而避免文件系统访问问题,从而允许 postinstall
钩子中的 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 Lambda 上传限制
AWS Lambda 定义了一个 **部署包上传限制**,其中包括
- 所有应用程序代码
- 二进制文件,例如 Prisma ORM 查询引擎
lambda 的 部署包 (.zip) 大小限制为 50MB。在准备部署包时,请删除函数在生产中不需要的任何文件,以使最终的 .zip 文件尽可能小。这包括一些 Prisma ORM 引擎二进制文件。
删除不需要的 Prisma ORM 引擎
Prisma CLI 下载在生产中 **不需要** 的其他引擎二进制文件。您可以删除以下文件和文件夹
-
整个
node_modules/@prisma/engines
文件夹(请参阅 示例 bash 脚本,由 Prisma 端到端测试使用) -
您开发平台的
node_modules/.prisma/client
文件夹中的 **本地引擎文件**。例如,如果您在 Debian(native
)上开发,但在 AWS Lambda(rhel-openssl-3.0.x
)上部署,您的架构可能会定义以下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
。 -