跳到主要内容

部署到 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 文件并添加以下配置:

.npmrc
unsafe-perm=true

启用 unsafe-perm 强制 npm 作为 root 运行,从而避免文件系统访问问题,允许 postinstall 钩子中的 prisma generate 命令生成您的代码。

错误:@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 定义了部署包上传限制,其中包括:

注意

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 会下载一些在生产环境中不需要的额外引擎二进制文件。您可以删除以下文件和文件夹:

  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.x。对于 Node.js 18 以上版本,rhel-openssl-3.0.x 是正确的 binaryTarget