You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PNPM搭配SAM部署Lambda函数遇依赖缺失问题求助

使用PNPM配合AWS SAM部署Lambda函数的解决方案

不需要切换到NPM,PNPM完全可以和AWS SAM配合使用,问题根源在于SAM默认不兼容PNPM的依赖管理结构(硬链接/软链接+非扁平化node_modules),以下是具体解决步骤:

1. 调整SAM模板的构建配置

在你的template.yaml中,针对Lambda函数添加Metadata字段,指定用PNPM执行依赖安装,确保打包时包含正确的依赖文件:

方案A:使用esbuild构建(推荐)

Resources:
  ServerLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: apps/server/
      Handler: index.handler
      Runtime: nodejs18.x
    Metadata:
      BuildMethod: esbuild
      BuildProperties:
        Minify: true
        Target: es2020
        Sourcemap: false
        EntryPoints:
          - index.js
        # 确保esbuild能识别PNPM的依赖路径
        External: []
      # 用PNPM安装生产依赖
      BuildCommand: "cd apps/server && pnpm install --prod --frozen-lockfile"

方案B:自定义构建流程

如果不用esbuild,直接指定SAM执行PNPM安装和打包:

Resources:
  ServerLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: apps/server/
      Handler: index.handler
      Runtime: nodejs18.x
    Metadata:
      BuildCommand: "cd apps/server && pnpm install --prod --frozen-lockfile"
      BuildOutput: "."

2. 开启PNPM的依赖提升

在apps/server目录下创建.npmrc文件,添加以下配置,让PNPM把所有依赖提升到顶层node_modules(和NPM默认结构一致),确保SAM能正确识别并打包:

shamefully-hoist=true

3. 处理Monorepo本地依赖

你的项目是Monorepo结构(apps/server依赖packages/core和packages/utils),需要确保这些本地包被复制到Lambda的代码包中:

  • 在apps/server的package.json中添加打包脚本:
{
  "scripts": {
    "prepare-lambda": "pnpm install --prod && mkdir -p node_modules/@your-org && cp -r ../../packages/core node_modules/@your-org/core && cp -r ../../packages/utils node_modules/@your-org/utils"
  }
}
  • 然后在SAM模板的BuildCommand中调用这个脚本:
BuildCommand: "cd apps/server && pnpm run prepare-lambda"

4. 可选:使用容器构建避免环境差异

执行sam build时加上--use-container参数,在AWS提供的容器环境中构建,确保依赖安装和打包的环境与Lambda运行时一致:

sam build --use-container

内容的提问来源于stack exchange,提问作者Ken Yip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:05:26