A .zip
file is required in order to include npm modules in Lambda. And you really shouldn't be using the Lambda web editor for much of anything- as with any production code, you should be developing locally, committing to git, etc.
MY FLOW:
1) My Lambda functions are usually helper utilities for a larger project, so I create a /aws/lambdas directory within that to house them.
2) Each individual lambda directory contains an index.js file containing the function code, a package.json file defining dependencies, and a /node_modules subdirectory. (The package.json file is not used by Lambda, it's just so we can locally run the npm install
command.)
package.json:
{
"name": "my_lambda",
"dependencies": {
"svg2png": "^4.1.1"
}
}
3) I .gitignore all node_modules directories and .zip files so that the files generated from npm installs and zipping won't clutter our repo.
.gitignore:
**/node_modules
*.zip
4) I run npm install
from within the directory to install modules, and develop/test the function locally.
5) I .zip the lambda directory and upload it via the console.
(IMPORTANT: Do not use Mac's 'compress' utility from Finder to zip the file! You must run zip from the CLI from within the root of the directory- see here)
zip -r ../yourfilename.zip *
NOTE:
You might run into problems if you install the node modules locally on your Mac, as some platform-specific modules may fail when deployed to Lambda's Linux-based environment. (See https://stackoverflow.com/a/29994851/165673)
The solution is to compile the modules on an EC2 instance launched from the AMI that corresponds with the Lambda Node.js runtime you're using (See this list of Lambda runtimes and their respective AMIs).
See also AWS Lambda Deployment Package in Node.js - AWS Lambda