跳到主要内容

部署到 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 定义了一个部署包上传限制,其中包括

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