Next.js集成Prisma Client部署AWS Serverless无法运行问题
Next.js 搭配Prisma部署AWS Serverless异常修复方案
问题基础信息
- 技术栈版本:Next.js
12.1.6、Prisma^3.15.2 - 异常表现:项目部署至Vercel可全功能正常运行,通过Serverless框架部署到AWS时服务不可用;移除Prisma Client依赖后,AWS环境下应用可恢复正常运行。
初始配置情况
初始serverless.yml配置如下:
myNextApp: component: "@sls-next/serverless-component"
next.config.js中已预先配置正确的数据库连接参数:
DATABASE_URL:"mysql://***:***@***:3306/****"
已尝试操作与遇到的阻塞
曾尝试通过构建后命令复制Prisma引擎文件到Lambda产物目录的方案,修改serverless.yml配置如下:
yourProjectName: component: "@sls-next/serverless-component@1.19.0" inputs: minifyHandlers: true build: postBuildCommands: - PDIR=node_modules/.prisma/client/; LDIR=.serverless_nextjs/api-lambda/; if [ "$(ls -A $LDIR)" ]; then mkdir -p $LDIR$PDIR; cp "$PDIR"query-engine-rhel-* $LDIR$PDIR; cp "$PDIR"schema.prisma $LDIR$PDIR; fi; - PDIR=node_modules/.prisma/client/; LDIR=.serverless_nextjs/default-lambda/; if [ "$(ls -A $LDIR)" ]; then mkdir -p $LDIR$PDIR; cp "$PDIR"query-engine-rhel-* $LDIR$PDIR; cp "$PDIR"schema.prisma $LDIR$PDIR; fi;
操作过程中遇到两个阻塞问题:
- 在Windows 10系统执行serverless部署命令时,终端报错:
PDIR is not recognized as an internal or external command, operable program or batch file. - 尝试手动将
.prisma/client文件夹复制到.serverless_nextjs/api-lambda/和.serverless_nextjs/default-lambda/目录下,执行serverless命令后该文件夹会被自动清理,配置无法生效。
根因分析
- 部署命令报错是因为配置的postBuildCommands是Bash语法,Windows原生CMD、PowerShell不支持该语法的变量定义、流程判断逻辑,无法识别PDIR等自定义变量。
- 手动复制文件被删除是因为serverless-nextjs组件在打包阶段会先清空产物目录再执行构建流程,手动复制的操作时机早于目录清空步骤,文件会被直接覆盖删除。
- 旧版本组件(1.19.0)对Next.js 12的兼容性不足,且未指定Prisma对应Lambda运行环境的二进制目标,会导致引擎文件缺失、路径识别错误。
修复步骤
按顺序执行以下操作即可解决问题:
- 切换部署执行环境
不要在Windows原生CMD/PowerShell中执行部署命令,改用WSL(Windows子系统Linux)执行所有部署相关命令,WSL原生支持Bash语法,可正常执行shell格式的构建后命令。 - 配置Prisma Lambda适配的二进制目标
打开项目根目录下的schema.prisma文件,在generator块中添加AWS Lambda(Amazon Linux 2环境)对应的二进制目标配置:
修改完成后执行generator client { provider = "prisma-client-js" binaryTargets = ["native", "rhel-openssl-1.0.x"] }npx prisma generate,重新生成适配Lambda环境的Prisma Client和对应引擎文件。 - 升级并修正serverless.yml配置
首先将@sls-next/serverless-component升级到适配Next.js 12的稳定版本,关闭会混淆Prisma路径查找的minifyHandlers选项,修正构建后命令格式,补充Lambda环境变量、内存和超时配置,最终配置参考如下:myNextApp: component: "@sls-next/serverless-component@3.7.0" inputs: minifyHandlers: false build: postBuildCommands: - "PDIR=node_modules/.prisma/client/; LDIR=.serverless_nextjs/api-lambda/; if [ -d \"$LDIR\" ]; then mkdir -p $LDIR$PDIR; cp -r $PDIR* $LDIR$PDIR; fi;" - "PDIR=node_modules/.prisma/client/; LDIR=.serverless_nextjs/default-lambda/; if [ -d \"$LDIR\" ]; then mkdir -p $LDIR$PDIR; cp -r $PDIR* $LDIR$PDIR; fi;" env: DATABASE_URL: "mysql://***:***@***:3306/****" api: memorySize: 1024 timeout: 10 defaultLambda: memorySize: 1024 timeout: 10 - 清理缓存后重新部署
执行部署前先删除项目根目录下的.serverless_nextjs缓存文件夹,避免旧的构建缓存影响打包结果,之后在WSL环境下执行部署命令即可。
注意:如果部署后仍出现Prisma引擎加载错误,可检查打包产物中.prisma/client目录下是否包含rhel开头的query-engine文件,若缺失可手动在postBuildCommands中补充对应文件的复制逻辑。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

