จะโหลดโมดูล npm ใน AWS Lambda ได้อย่างไร


147

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

ผมเคยอ่านผ่านทางนี้แต่ดูเหมือนว่าจะเกี่ยวข้องกับการตั้งค่า EC2 และทำงานฟังก์ชั่นแลมบ์ดาจากที่นั่น มีกลไกในการอัพโหลด zip เมื่อสร้างฟังก์ชั่น แต่ดูเหมือนว่าจะเกี่ยวข้องกับการส่งฟังก์ชั่นที่พัฒนาขึ้นในเครื่อง เนื่องจากฉันทำงานในเครื่องมือแก้ไขทางเว็บที่ดูเหมือนเป็นขั้นตอนที่แปลก

ฉันจะปรับใช้โมดูลบางอย่างเพื่อใช้ในฟังก์ชัน Lambda ของฉันได้อย่างไร


7
มันมีคำอธิบายทั้งหมดในเอกสารที่นี่ - docs.aws.amazon.com/lambda/latest/dg/…
arcseldon

คำตอบ:


197

คุณไม่สามารถโหลดโมดูล NPM โดยไม่ต้องอัปโหลด.zipไฟล์ แต่จริง ๆ แล้วคุณสามารถทำให้กระบวนการนี้สั้นลงถึงสองบรรทัดคำสั่งด่วน

นี่คือวิธี:

  1. ใส่ไฟล์ฟังก์ชั่นแลมบ์ดาของคุณไว้ในไดเรกทอรีแยกกัน นี่เป็นเพราะคุณติดตั้งnpmแพคเกจภายในสำหรับแลมบ์ดาและคุณต้องการแยกและทดสอบสิ่งที่คุณจะอัปโหลดไปยังแลมบ์ดา

  2. ติดตั้งแพคเกจ NPM ของคุณภายในเครื่องnpm install packageNameขณะที่คุณอยู่ในไดเรกทอรีแลมบ์ดาแยกต่างหากที่คุณสร้างในขั้นตอนที่ 1

  3. ตรวจสอบให้แน่ใจว่าฟังก์ชั่นของคุณทำงานเมื่อทำงานในเครื่อง: node lambdaFunc.js(คุณสามารถคอมเม้นต์สองexport.handlerบรรทัดในรหัสของคุณเพื่อปรับรหัสของคุณให้ทำงานกับโหนดในเครื่อง)

  4. ไปที่ไดเร็แลมบ์ดาและบีบอัดเนื้อหาให้แน่ใจว่าไม่ได้ที่จะรวมไดเรกทอรีของตัวเอง

    zip -r lambdaFunc.zip .
    
  5. หากคุณมีการaws-cliติดตั้งซึ่งฉันขอแนะนำให้ถ้าคุณต้องการทำให้ชีวิตของคุณง่ายขึ้นตอนนี้คุณสามารถป้อนคำสั่งนี้:

    aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip
    

    (ไม่มีเครื่องหมายคำพูดรอบ lambdaFunc ส่วนด้านบนในกรณีที่คุณสงสัยเหมือนฉัน)

  6. ตอนนี้คุณสามารถคลิกทดสอบในคอนโซลแลมบ์ดา

  7. ฉันขอแนะนำให้เพิ่มนามแฝงสั้น ๆ สำหรับทั้งสองคำสั่งข้างต้น นี่คือสิ่งที่ฉันมีอยู่สำหรับคำสั่งการปรับปรุง Lambda ที่นานขึ้น:

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip"
    

10
คุณอาจต้องระบุภูมิภาคที่คุณกำหนดเป้าหมายอย่างชัดเจน: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox

2
ในขณะที่ดูเหมือนว่าจะทำงานได้มากขึ้นการทำสิ่งนี้เป็นวิธีที่ดีกว่ามากในการสร้างการแสดงออกแลมบ์ดาเหล่านี้ ... ขอบคุณมาก!
Mike Perrenoud

9
ฉันต้องใช้--zip-file fileb://กับเมื่อ--zip-file file://ใช้ขั้นตอนเหล่านี้
McLovin

2
ตรวจสอบให้แน่ใจว่าคุณบีบเฉพาะเนื้อหาของไดเรกทอรีและคุณทำจาก CLI (โดยใช้คำสั่ง 'บีบอัด' จากตัวค้นหาของ Mac จะไม่ทำงาน )
Yarin

2
นี่เป็นประโยชน์อย่างมาก .. อย่างน้อยสองสิ่งที่ขาดหายไปเพื่อให้งานนี้สำหรับฉัน ... 1) มันเป็นสิ่ง--zip-file fileb:แทนfileฉัน 2) บน MacOS ดูเหมือนว่าจะมีสแลช 3 ตัวเช่นfileb:///Users/wio/Documents
Tobi

30

.zipไฟล์เป็นสิ่งจำเป็นเพื่อที่จะรวมNPMโมดูลในแลมบ์ดา และคุณไม่ควรใช้โปรแกรมแก้ไขเว็บของแลมบ์ดาสำหรับเรื่องใด ๆ - เช่นเดียวกับรหัสการผลิตใด ๆ คุณควรจะพัฒนาในพื้นที่รับผิดชอบต่อคอมไพล์ ฯลฯ

ไหลของฉัน:

1) ฟังก์ชั่นแลมบ์ดาของฉันมักเป็นตัวช่วยสาธารณูปโภคสำหรับโครงการขนาดใหญ่ดังนั้นฉันจึงสร้าง a / aws / lambdasไดเรกทอรีภายในนั้นเพื่อใช้ในบ้าน

2) แต่ละไดเรกทอรี lambda มีไฟล์index.jsที่มีรหัสฟังก์ชันไฟล์package.json ที่กำหนดการขึ้นต่อกันและไดเรกทอรีย่อย/ node_modules (ไฟล์ package.json ไม่ได้ใช้โดยแลมบ์ดามันเป็นเพียงเพื่อให้เราสามารถเรียกใช้npm installคำสั่งในเครื่องได้)

package.json:

{
  "name": "my_lambda",
  "dependencies": {
    "svg2png": "^4.1.1"
  }
}

3) ฉัน. gignignore ไดเรกทอรี node_modules ทั้งหมดและไฟล์. zip เพื่อให้ไฟล์ที่สร้างขึ้นจากการติดตั้งและการบีบอัดไฟล์ npm จะไม่เกะกะ repo ของเรา

.gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) ฉันเรียกใช้npm installจากภายในไดเรกทอรีเพื่อติดตั้งโมดูลและพัฒนา / ทดสอบฟังก์ชั่นในเครื่อง

5) ฉัน. zip ไดเรกทอรี lambda และอัพโหลดผ่านคอนโซล

( สำคัญ:อย่าใช้ยูทิลิตี้ 'บีบอัด' ของ Mac จาก Finder เพื่อบีบอัดไฟล์คุณต้องเรียกใช้ zip จาก CLI จากภายในรากของไดเรกทอรี - ดูที่นี่ )

zip -r ../yourfilename.zip * 

บันทึก:

คุณอาจพบปัญหาหากคุณติดตั้งโมดูลโหนดแบบโลคัลบน Mac ของคุณเนื่องจากบางโมดูลเฉพาะแพลตฟอร์มอาจล้มเหลวเมื่อปรับใช้กับสภาพแวดล้อมที่ใช้ระบบปฏิบัติการบน Linux ของ Lambda (ดูhttps://stackoverflow.com/a/29994851/165673 )

การแก้ปัญหาคือการรวบรวมโมดูลบนอินสแตนซ์ EC2 จากการเปิดตัว AMI ที่สอดคล้องกับแลมบ์ดา Node.js รันไทม์คุณกำลังใช้ (ดูรายชื่อนี้runtimes แลมบ์ดาและ AMIS ของตน )


ดูAWS Lambda Deployment Package ใน Node.js - AWS Lambda


16

ตอนนี้คุณสามารถใช้แลมบ์ดาเลเยอร์สำหรับเรื่องนี้ได้แล้ว เพียงเพิ่มเลเยอร์ที่มีแพ็คเกจที่คุณต้องการและมันจะทำงานได้อย่างสมบูรณ์แบบ

ติดตามโพสต์นี้: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e


9

หวังว่าสิ่งนี้จะช่วยได้ด้วยกรอบการทำงานของ Serverless คุณสามารถทำสิ่งนี้:

  1. เพิ่มสิ่งเหล่านี้ในไฟล์ serverless.yml ของคุณ:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. จากนั้นสร้างฟังก์ชัน Lambda ของคุณปรับใช้โดย serverless deployแพ็คเกจที่รวมอยู่ใน serverless.yml จะมีให้คุณ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ serverless: https://serverless.com/framework/docs/providers/aws/guide/quick-start/


คุณต้องติดตั้งก่อนserverless plugin install --name pluginName
Liad Livnat

1

โมดูล npm จะต้องรวมอยู่ในแพ็คเกจ nodejs ของคุณและอัปโหลดไปยัง AWS Lambda Layers เป็น zip จากนั้นคุณจะต้องอ้างถึงโมดูล / js ของคุณตามด้านล่างและใช้วิธีการที่มีอยู่ const mymodule = ต้องการ ('/ opt / nodejs / MyLogger');

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