AWS Lambda Error: "Cannot find module '/var/task/index'"
Javascriptnode.jsAmazon Web-ServicesRequestAws LambdaJavascript Problem Overview
Node.js Alexa Task Issue
I'm currently coding a Node.js Alexa Task via AWS Lambda, and I have been trying to code a function that receives information from the OpenWeather API and parses it into a variable called weather
. The relevant code is as follows:
var request = require('request');
var weather = "";
function isBadWeather(location) {
var endpoint = "http://api.openweathermap.org/data/2.5/weather?q=" + location + "&APPID=205283d9c9211b776d3580d5de5d6338";
var body = "";
request(endpoint, function (error, response, body) {
if (!error && response.statusCode == 200) {
body = JSON.parse(body);
weather = body.weather[0].id;
}
});
}
function testWeather()
{
setTimeout(function() {
if (weather >= 200 && weather < 800)
weather = true;
else
weather = false;
console.log(weather);
generateResponse(buildSpeechletResponse(weather, true), {});
}, 500);
}
I ran this snippet countless times in Cloud9 and other IDEs, and it seems to be working flawlessly. However, when I zip it into a package and upload it to AWS Lambda, I get the following error:
{
"errorMessage": "Cannot find module '/var/task/index'",
"errorType": "Error",
"stackTrace": [
"Function.Module._load (module.js:276:25)",
"Module.require (module.js:353:17)",
"require (internal/module.js:12:17)"
]
}
I installed module-js, request, and many other Node modules that should make this code run, but nothing seems to fix this issue. Here is my directory, just in case:
- planyr.zip
- index.js
- node_modules
- package.json
Does anyone know what the issue could be?
Javascript Solutions
Solution 1 - Javascript
Fixed it! My issue was that I tried to zip the file using my Mac's built-in compression function in Finder.
If you're a Mac user, like me, you should run the following script in terminal when you are in the root directory of your project (folder containing your index.js
, node_modules
, etc. files).
zip -r ../yourfilename.zip *
For Windows:
Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip
Solution 2 - Javascript
Update to the accepted answer: When this error occurs, it means your zip file is not in the valid form which AWS requires.
If you double click on zip you will find your folder inside that your code file,but lambda wants that when you double click on zip it shoud show direct code files.
To achieve this:
open terminal
cd your-lambda-folder
zip -r index.zip *
Then, upload index.zip
to AWS Lambda.
Solution 3 - Javascript
Check that file name and handler name are same:
That means that zip
file has bundle.js
file that exports handler
function:
exports.handler = (event, context, callback) => {//...}
Solution 4 - Javascript
In my case it was because I had the handler file in inner src directory.
I had to change the 'Handler' property within Lambda from:
index.handler
to
src/index.handler
Solution 5 - Javascript
This is probably a permissions issue with files inside your deployment zip.
Try chmod 777
your files before packaging them in a zip file.
Solution 6 - Javascript
In my case the archive contained a folder "src" with index.js file, so I had to put to the handler: "src/index.handler"
Solution 7 - Javascript
In my case I had to replace
exports.handler = function eventHandler (event, context) {
with
exports.handler = function (event, context, callback) {
Solution 8 - Javascript
I got this error when I was using lambci/lambda:nodejs8.10
in windows.
I'd tried all of the solution listed above but none of which could help me deal with my issue(even though the error stack look the same as the question).
Here is my simple solution:
- using
--entrypoint
flag to run a container to find out if the file is mounted into the container. It turns out I may got the share drive issue with my Docker Desktop. - I switched my docker daemon that day before, but everything works fine except this problem.
- Anyway, remount my drive to Docker Desktop, you can both use the
docker
command or just open the Docker Desktop setting to apply.
Solution 9 - Javascript
In my case this was caused by Node running out of memory. I fixed that by adding --memory-size 1500
to my aws lambda create-function ...
command.