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

如何用AWS SAM(NodeJS)配置含npm依赖的自定义Lambda Layer函数?

AWS SAM配置Lambda Layer调用带npm依赖的自定义函数

问题描述

我的Lambda处理文件index.mjs导入自定义函数的代码:

import { myCustomFunc } from './opt/my-layer/myCustomFunc.mjs' // 原导入路径存疑

export async function handler() {
  myCustomFunc();
}

自定义函数文件./layers/my-layer/myCustomFunc.mjs(sam build后生成./opt/myCustomFunc.mjs):

import { joi } from 'joi'; // 依赖npm包joi

export function myCustomFunc() {
  console.log(joi.version()); // 预期输出'17.11.0'
}

本地执行sam build和sam local invoke MyLambdaName -e my-event.json时,报错:

"Cannot find module '/var/opt/nodejs/node_modules/joi' imported from ..."

已尝试调整文件结构(如将所有文件放入layers/nodejs层、把node_modules放在layers/shared根目录),并在template.yaml中给Lambda引用两个Layer,但均无法解决自定义函数找不到依赖的问题。

需求:通过AWS SAM实现本地快速构建测试(可完整访问npm依赖),测试通过后直接部署云端,避免手动打包上传层的低效操作。


验证可行的配置方案

1. 标准项目文件结构

├── template.yaml
├── src/
│   └── index.mjs  # Lambda主处理函数
└── layers/
    └── shared-utils/  # 自定义函数+依赖的Layer
        └── nodejs/
            ├── myCustomFunc.mjs
            └── package.json

注:如果多个Lambda需要共享通用npm依赖,可以单独抽一个node-deps层,但单Layer承载自定义函数+自身依赖是最直接的解决方式。

2. Layer的package.json配置

在layers/shared-utils/nodejs/package.json中声明依赖:

{
  "name": "shared-utils",
  "version": "1.0.0",
  "dependencies": {
    "joi": "17.11.0"
  }
}

3. template.yaml完整配置

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  # 自定义工具函数Layer
  SharedUtilsLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: SharedUtilsLayer
      Description: Custom utility functions with dependencies
      ContentUri: layers/shared-utils/
      CompatibleRuntimes:
        - nodejs18.x
        - nodejs20.x
      RetentionPolicy: Retain

  MyLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: MyLambdaName
      CodeUri: src/
      Handler: index.handler
      Runtime: nodejs20.x
      Layers:
        - !Ref SharedUtilsLayer

4. 修正Lambda导入路径

修改src/index.mjs的导入路径,因为SAM构建后Layer的nodejs目录会被挂载到/opt/nodejs:

import { myCustomFunc } from '/opt/nodejs/myCustomFunc.mjs'

export async function handler() {
  myCustomFunc();
}

5. 构建与本地测试步骤

  1. 安装Layer依赖:
cd layers/shared-utils/nodejs
npm install
  1. 执行SAM构建:
sam build
  1. 本地调用测试:
sam local invoke MyLambdaFunction -e my-event.json

关键原理

  • Lambda运行时会将每个Layer的内容挂载到/opt目录,Node.js运行时自动把/opt/nodejs/node_modules加入模块搜索路径
  • 将自定义函数和其依赖放在同一Layer的nodejs目录下,SAM构建时会自动处理依赖的安装与路径映射,避免跨Layer的依赖查找问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:47:36