跳至主要内容

部署到 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 中。这通常在 postinstall 钩子中完成。

由于 Beanstalk 限制了在 postinstall 钩子中写入文件系统的能力,因此您需要创建一个 .npmrc 文件到项目的根目录中,并添加以下配置

.npmrc
unsafe-perm=true

启用 unsafe-perm 会强制 npmroot 身份运行,从而避免文件系统访问问题,从而允许 postinstall 钩子中的 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 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),则您的模式可能会定义以下 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.x。对于大于 18 的 Node.js 版本,rhel-openssl-3.0.x 是正确的 binaryTarget