ข้อผิดพลาด AWS Lambda:“ ไม่พบโมดูล '/ var / task / index'”


88

ปัญหางาน Node.js Alexa

ฉันกำลังเขียนโค้ด Node.js Alexa Task ผ่าน AWS Lambda และฉันพยายามโค้ดฟังก์ชันที่รับข้อมูลจาก OpenWeather API และแยกวิเคราะห์เป็นตัวแปรที่เรียกว่าweather. รหัสที่เกี่ยวข้องมีดังนี้:

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);
}

ฉันใช้ตัวอย่างข้อมูลนี้นับครั้งไม่ถ้วนใน Cloud9 และ IDE อื่น ๆ และดูเหมือนว่าจะทำงานได้อย่างไม่มีที่ติ อย่างไรก็ตามเมื่อฉัน zip ลงในแพ็คเกจและอัปโหลดไปยัง AWS Lambda ฉันได้รับข้อผิดพลาดต่อไปนี้:

{
    "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)"
    ]
}

ฉันค้นหาบทความนับไม่ถ้วนและติดตั้งโมดูล -js คำขอและโมดูลโหนดอื่น ๆ อีกมากมายที่ควรทำให้โค้ดนี้ทำงาน แต่ดูเหมือนจะไม่มีอะไรแก้ไขปัญหานี้ได้ นี่คือไดเร็กทอรีของฉันในกรณี:

- planyr.zip
   - index.js
   - node_modules
   - package.json

ไม่มีใครรู้ว่าปัญหาอาจเกิดขึ้นได้อย่างไร? ขอบคุณมากล่วงหน้า


นี่คือผลลัพธ์บันทึกสำหรับรหัสของฉัน: START RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 Version: $LATEST Unable to import module 'index': Error at Function.Module._resolveFilename (module.js:325:15) at Function.Module._load (module.js:276:25) at Module.require (module.js:353:17) at require (internal/module.js:12:17) END RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 REPORT RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 Duration: 55.76 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 16 MB
Anthony Krivonos

3
นอกจากคำตอบเกี่ยวกับการซิปโดยใช้เทอร์มินัลบน Mac แล้วตรวจสอบให้แน่ใจว่าไฟล์โค้ดของคุณเรียกว่า 'index.js' เหมืองมีชื่อที่สื่อความหมายมากขึ้นทำให้เกิดข้อผิดพลาด
ศิลปะ

1
@Art นี่คือปัญหาของฉัน ฉันบีบอัด test.js และเกิดข้อผิดพลาดที่ไม่สามารถจัดการได้ หลังจากเปลี่ยนเป็น index.js มันก็ใช้งานได้ดี ขอบคุณ.
Hudspeth

คำตอบ:


230

ซ่อมมัน! ปัญหาของฉันคือฉันพยายามซิปไฟล์โดยใช้ฟังก์ชันการบีบอัดในตัวของ Mac ใน Finder

หากคุณเป็นผู้ใช้ Mac เช่นฉันคุณควรใช้สคริปต์ต่อไปนี้ใน terminal เมื่อคุณอยู่ในไดเรกทอรีรากของโครงการของคุณ (โฟลเดอร์ที่มีของคุณindex.js, node_modulesไฟล์อื่น ๆ )

zip -r ../yourfilename.zip *

สำหรับ Windows:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip

7
ฉันกำลังซิปแบบนั้น: "zip -r folder folder.zip" และแน่นอนว่านี่ล้มเหลว ขอบคุณสำหรับเคล็ดลับในการซิปไฟล์ไม่ใช่ไดเร็กทอรี
Dane Macaulay

6
แล้ว windows ล่ะ?
ลกราชสุกุมารัน

อย่าลืมตั้งชื่อฟังก์ชันด้วยindex.js
ความรู้

มีวิธีใดบ้างในการดำเนินการจากภายนอกไดเร็กทอรี
andrhamm

1
@andrhamm ครับ รูปแบบคือzip -r /path/to/destination.zip /path/to/source/directory/*. ที่ซิปเนื้อหาของไดเร็กทอรี หากคุณต้องการซิปไดเร็กทอรีเองด้วยให้ใช้ไดเร็กทอรี / path / to / source / โดยไม่มี *.
Qaz

23

อัปเดตเป็นคำตอบที่ยอมรับ:เมื่อข้อผิดพลาดนี้เกิดขึ้นหมายความว่าไฟล์ zip ของคุณไม่อยู่ในรูปแบบที่ถูกต้องซึ่ง AWS ต้องการ

หากคุณดับเบิลคลิกที่ zip คุณจะพบโฟลเดอร์ของคุณภายในไฟล์รหัสของคุณ แต่ lambda ต้องการให้เมื่อคุณดับเบิลคลิกที่ zip it shoud จะแสดงไฟล์รหัสโดยตรง

เพื่อให้บรรลุสิ่งนี้:

open terminal  
cd your-lambda-folder 
zip -r index.zip *

จากนั้นอัปโหลดindex.zipไปยัง AWS Lambda


ใน windows git bast throw error "ไม่พบคำสั่ง" วิธีแก้ไขความคิดนี้อย่างไร
Pardeep Jain

1
นี่คือคำสั่งของ Ubuntu โปรด google สำหรับ windows หรือวิธีสร้าง zip จาก command prompt
Ashutosh Jha

20

ตรวจสอบว่าชื่อไฟล์และชื่อตัวจัดการเหมือนกัน:

ในกรณีนี้เราคาดว่าโค้ดทั้งหมดของเราจะอยู่ในไฟล์ <code> bundle.ls </code>

นั่นหมายความว่าzipไฟล์นั้นมีbundle.jsไฟล์ที่ส่งออกhandlerฟังก์ชัน:

exports.handler = (event, context, callback) => {//...}

4

ในกรณีของฉันมันเป็นเพราะฉันมีไฟล์ตัวจัดการในไดเร็กทอรี src ภายใน

ฉันต้องเปลี่ยนคุณสมบัติ 'Handler' ภายใน Lambda จาก:

index.handler

ถึง

src/index.handler

ฉันยังวิ่งเข้าไปหาสิ่งนี้ ส่วน [Windows] มันเป็นเพียงแค่ว่าผมคลิกขวาที่เป็นส่วนหนึ่งของธุรกรรมซื้อคืนและการใช้ของฉันAPI Send To > Compressed Folderสิ่งนี้จะสร้างซิปที่มีโครงสร้างapi/etcดังนั้นจึงเป็นข้อยกเว้น!
C Bauer

3

นี่อาจเป็นปัญหาเกี่ยวกับสิทธิ์ของไฟล์ในไฟล์ zip การปรับใช้ของคุณ ลองใช้chmod 777ไฟล์ของคุณก่อนที่จะบรรจุในไฟล์ zip


2
น่าเสียดายที่ดูเหมือนจะไม่สามารถแก้ไขปัญหาได้ ฉันพยายามบีบอัดplanyrโฟลเดอร์ภายในโฟลเดอร์อื่น แต่ก็ไม่มีประโยชน์ ชื่อตัวจัดการของฉันและชื่อไฟล์ JavaScript หลักตรงกัน ( index)
Anthony Krivonos

chmod 777เป็นคำแนะนำที่ไม่ดี ... นี่คือการเปิดการอนุญาตให้สาธารณะเขียนอ่านและดำเนินการ โปรดค้นหาสาเหตุเส้นทางของปัญหาเสมอ พยายามทำความเข้าใจผลกระทบด้านความปลอดภัยของการดำเนินการทุกครั้งที่มีคนในอินเทอร์เน็ตบอกให้คุณทำ ความปลอดภัยเป็นสิ่งสำคัญและต้องอยู่ในรหัสของเราโดยปริยาย
Exadra37

3

ในกรณีของฉันที่เก็บถาวรมีโฟลเดอร์ "src" ที่มีไฟล์ index.js ดังนั้นฉันจึงต้องนำไปที่ตัวจัดการ: "src / index.handler"

ใส่คำอธิบายภาพที่นี่


0

ในกรณีของฉันฉันต้องเปลี่ยน

exports.handler = function eventHandler (event, context) {

ด้วย

exports.handler = function (event, context, callback) {

0

ฉันได้รับข้อผิดพลาดนี้เมื่อฉันใช้lambci/lambda:nodejs8.10ใน windows

ฉันได้ลองวิธีแก้ปัญหาทั้งหมดที่ระบุไว้ข้างต้น แต่ไม่มีวิธีใดที่สามารถช่วยฉันจัดการกับปัญหาของฉันได้ (แม้ว่ากลุ่มข้อผิดพลาดจะดูเหมือนกับคำถามก็ตาม)

นี่คือวิธีง่ายๆของฉัน:

  1. ใช้--entrypointแฟล็กเพื่อเรียกใช้คอนเทนเนอร์เพื่อดูว่าไฟล์ถูกต่อเข้ากับคอนเทนเนอร์หรือไม่ ปรากฎว่าฉันอาจมีปัญหาแชร์ไดรฟ์กับ Docker Desktop ของฉัน
  2. ฉันเปลี่ยน Docker daemon เมื่อวันก่อน แต่ทุกอย่างทำงานได้ดียกเว้นปัญหานี้
  3. อย่างไรก็ตามติดตั้งไดรฟ์ของฉันไปที่ Docker Desktop ใหม่คุณสามารถใช้dockerคำสั่งหรือเพียงแค่เปิดการตั้งค่า Docker Desktop เพื่อใช้

0

ในกรณีของฉันนี่เกิดจาก Node หน่วยความจำหมด ฉันแก้ไขโดยเพิ่มคำสั่ง--memory-size 1500ของฉันaws lambda create-function ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.