SAM-CLI部署Scala Lambda引入aws-java-sdk出现包大小超限问题
问题根源
你部署报错的核心原因是引入了全量AWS Java SDK依赖:"com.amazonaws" % "aws-java-sdk" % "1.11.46",该包包含所有AWS服务的客户端实现,打包后体积极大,解压后超出了AWS Lambda要求的250MB(262144000字节)最大解压包体积限制,因此触发400错误。
解决方案
可根据你的实际业务需求选择以下任意一种方案:
- 替换全量SDK为对应服务的单独依赖:如果只需要用到部分AWS服务的能力,仅引入对应服务的轻量依赖包即可,大幅降低打包体积。比如你当前代码仅涉及API Gateway和Lambda相关逻辑,可将全量SDK替换为:
"com.amazonaws" % "aws-java-sdk-lambda" % "1.11.46" "com.amazonaws" % "aws-java-sdk-apigateway" % "1.11.46"
后续用到其他AWS服务时,再按需引入对应单独依赖包即可,例如S3对应aws-java-sdk-s3、DynamoDB对应aws-java-sdk-dynamodb。
- 配置sbt打包压缩规则:使用
sbt-assembly插件打包时,添加冗余文件剔除规则,删掉不需要的META-INF文件、重复依赖、调试信息等,进一步压缩包体积,参考配置如下:
assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }
- 升级到AWS SDK v2:AWS SDK v2做了架构级的体积优化,相同功能下打包体积比v1小30%以上,同时支持按需引入模块,新项目更推荐直接使用v2版本SDK。
- 拆分依赖或使用容器部署:如果确实需要引入大量第三方依赖,总解压体积超过250MB,可将公共依赖(如AWS SDK、Scala核心库)打包为Lambda层(Lambda Layer),函数代码仅打包业务逻辑;也可以选择使用Lambda容器镜像部署,容器镜像的大小限制为10GB,可完全满足大依赖场景的需求。
内容的提问来源于stack exchange,提问作者andreacappelletti97
相关产品推荐
相关产品推荐

