跳转至主要内容

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 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