AWS Lambda has a 250 Megabyte limit on the size of the deployable asset. It is a generous limit that is easy to exceed with Node-based Lambda functions.
package.json. AWS SDK alone can be around 50 Megabytes in size.
Here are the top few reasons for a Node-based Lambda to exceed the 250 Megabyte limit and remedy it.
The first step should be to check whether some dependencies that are included in the final package are needed for development but not needed at runtime.
- Typescript compiler,
- Unit-testing frameworks (i.e.
Separate production dependencies from development dependencies in your
package.json file using
devDependencies and make sure to use
npm install —prod-only when building your deployable zip file.
If excluding development dependencies from the production package didn’t help, check whether you are actually using all of the modules you listed in
Copy/pasting dependencies from other projects without thinking happens to the best of us, though we potentially end up with unnecessary modules included.
Multiple versions of the same module
I ran into this issue at work where a Lambda function used a few modules that we maintain within the team.
The Lambda function was using version X of AWS SDK for its internal workings.
But each dependency was also using a slightly different minor version of AWS SDK.
As a result, the Lambda function shipped with multiple different versions of AWS SDK. The final package size well exceeded the 250 Megabyte limit five-fold.
npm ls, I found all of the duplicated nested dependencies on AWS SDK. Since we control all of the modules at issue, I moved AWS SDK to dev dependencies and listed it under peer dependencies section, such that in the end only one version of AWS SDK was installed in Lambda.
Some last thoughts
I doubt that I covered all possible scenarios here. I would not use Node.js at all for a new application. It’s a horrible language and an awful platform. Given Node.js’ popularity, though, we have to work with what we have — and that includes finding ways to keep the deployable size small, so it fits within the AWS Lambda limits.