Node.js Lambda SAM应用部署报错:解压缩大小超限解决方案咨询
解决Node.js Lambda SAM包体积超标的问题
方法1:用SAM CLI配置单独打包(对应serverless的individual: true)
SAM不支持在template.yml里加package字段,但可以通过samconfig.toml或命令行参数实现单独打包每个函数:
- 在项目根目录新建/修改
samconfig.toml,添加以下配置:
[default.package.parameters] individual = true
- 执行
sam package命令,每个Lambda函数会单独打包,避免把所有函数的依赖堆在一起,减小单个包的体积。
方法2:在template.yml里通过构建配置排除冗余文件
SAM允许在函数的Metadata字段里配置打包规则,无需修改template顶层属性:
用esbuild自动压缩+精简依赖
esbuild是SAM默认支持的构建工具,能自动打包生产依赖、压缩代码,直接在函数资源下添加这段配置:
Resources: YourLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./你的函数代码路径 Runtime: nodejs20.x # 其他函数属性... Metadata: BuildMethod: esbuild BuildProperties: Minify: true Target: "es2020" Sourcemap: false External: ['aws-sdk'] # Lambda环境自带AWS SDK,直接排除 Bundle: true
手动指定排除目录
如果不想用esbuild,也可以用makefile方式指定要排除的文件:
Resources: YourLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./你的函数代码路径 Runtime: nodejs20.x Metadata: BuildMethod: makefile BuildProperties: Exclude: - node_modules/**/* - test/**/* - .git/**/*
同时在函数目录下创建Makefile,编写构建逻辑:
build-YourLambdaFunction: npm install --production cp -r ./src/* .
这样打包时只会包含生产依赖和业务代码,dev依赖、测试文件等冗余内容会被排除。
方法3:用Lambda Layers拆分依赖
把node_modules这类公共依赖单独做成Layer,多个函数共享,函数包只存放业务代码:
- 创建
layers/node-deps目录,在该目录下新建nodejs文件夹,进入nodejs目录执行npm install --production安装依赖。 - 在
template.yml里定义Layer资源:
Resources: NodeDependenciesLayer: Type: AWS::Serverless::LayerVersion Properties: ContentUri: ./layers/node-deps/ CompatibleRuntimes: - nodejs20.x RetentionPolicy: Retain
- 在Lambda函数中引用这个Layer:
YourLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./你的函数代码路径 Runtime: nodejs20.x Layers: - !Ref NodeDependenciesLayer # 其他函数属性...
内容的提问来源于stack exchange,提问作者rahulserver
相关产品推荐
相关产品推荐

