How do I build a Lambda deployment package for Node.js?
Last updated: 2022-10-11
I created an AWS Lambda function in Node.js, but I get a "Cannot find module" error during invocation. How do I build my deployment package so that I don't get these errors?
The Cannot find module error usually occurs for one of three reasons:
- The Lambda function's deployment package doesn't have the correct folder structure to allow the Lambda service to load the required modules and libraries.
- The deployment package doesn't have the correct file permissions.
- The deployment package doesn't contain the module being imported.
Note: Lambda requires global read permissions.
To create a deployment package with function code in the root folder of the .zip file and then apply read and execute permissions for all files, do the following.
Note: If you receive errors when running AWS Command Line Interface (AWS CLI) commands, make sure that you’re using the most recent AWS CLI version.
For Linux and macOS
Install dependencies to the function project folder
Note: Most Node.js modules are platform-independent, but some are compiled against specific operating system environments. Lambda runs under a Linux environment. When installing modules with npm, it's a best practice to build the .zip file in a Linux environment to make sure that the correct platform dependencies are included.
1. In the command line, change directories to your project folder. For example:
Important: Make sure to replace project-folder-name with the name of your actual project folder.
2. Install your dependencies locally to your function project folder by running the following command for each module required for your function:
Note: This should also include the handler source file.
npm install package-name
Important: Make sure to replace package-name with the actual package name. There's also a 250 MB limit on your function size for unzipped files. Include only the libraries that you need for your function to work.
npm install aws-sdk
Build the deployment package
In the command line, run the following command:
zip -r ../function-name.zip .
Note: Replace function-name with the file name that you want to give your deployment package. This puts all files in the project folder into a .zip file located in the parent folder.
Verify the deployment package
1. In the command line, run the following command:
Note: Replace function-name with the actual file name of your deployment package. Or, you can run unzip -l on the .zip file to list its contents, but the output won't be as detailed.
2. Check the output to verify that the function handler source file is located in the root of the .zip file.
3. Check the output to verify that your files have global read permissions. For more information, see How do I troubleshoot Lambda "permission denied" or "unable to import module" errors when uploading a deployment package?
Build the deployment package
1. In File Explorer, open your project folder.
2. Select all the project files, then right-click to open the context menu.
3. Choose Send to, then choose Compressed (zipped) folder.
4. Enter a name for the .zip file.
Upload and verify the deployment package
1. In the Lambda console, choose your function.
2. Under Function code, for Code entry type, choose Upload a .zip file.
3. Under Function package, choose Upload.
4. Choose the .zip file you created, and then choose Open.
5. At the top of the console, choose Save.
Tip: You can also run update-function-code from the AWS CLI to upload your .zip file.
6. After uploading is completed, choose Test.
Tip: You can also use 7-Zip from the command line to verify your deployment package's file permissions. Download it from the 7-Zip website.