Bagaimana cara memuat modul npm di AWS Lambda?

147

Saya telah membuat beberapa fungsi Lambda menggunakan editor berbasis web. Sejauh ini baik. Saya sekarang ingin mulai memperluas mereka dengan modul (seperti Q untuk janji). Saya tidak tahu bagaimana cara mengeluarkan modul ke Lambda sehingga bisa dikonsumsi oleh fungsi saya.

Saya sudah membaca ini tetapi tampaknya melibatkan pengaturan EC2 dan menjalankan fungsi Lambda dari sana. Ada mekanisme untuk mengunggah zip saat membuat fungsi tetapi itu sepertinya melibatkan pengiriman fungsi yang dikembangkan secara lokal. Karena saya bekerja di editor berbasis web yang sepertinya alur kerja yang aneh.

Bagaimana saya bisa menggunakan beberapa modul untuk digunakan dalam fungsi Lambda saya?

Fook
sumber
7
Semuanya dijelaskan dalam dokumen di sini - docs.aws.amazon.com/lambda/latest/dg/…
arcseldon

Jawaban:

198

Anda tidak dapat memuat modul NPM tanpa mengunggah .zipfile, tetapi Anda sebenarnya bisa mendapatkan proses ini ke dua baris perintah cepat.

Begini caranya:

  1. Letakkan file fungsi Lambda Anda di direktori terpisah. Ini karena Anda menginstal npmpaket secara lokal untuk Lambda dan Anda ingin dapat mengisolasi dan menguji apa yang akan Anda unggah ke Lambda.

  2. Instal paket NPM Anda secara lokal dengan npm install packageNamesaat Anda berada di direktori Lambda terpisah yang Anda buat di langkah # 1.

  3. Pastikan fungsi Anda berfungsi saat berjalan secara lokal: node lambdaFunc.js(Anda cukup mengomentari dua export.handlerbaris dalam kode Anda untuk mengadaptasi kode Anda untuk dijalankan dengan Node secara lokal).

  4. Pergi ke direktori Lambda dan kompres isinya , pastikan untuk tidak memasukkan direktori itu sendiri.

    zip -r lambdaFunc.zip .
    
  5. Jika Anda telah aws-climenginstal, yang saya sarankan miliki jika Anda ingin membuat hidup Anda lebih mudah, Anda sekarang dapat memasukkan perintah ini:

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

    (tidak ada kutipan di sekitar bagian lambdaFunc di atas jika Anda bertanya-tanya seperti yang saya lakukan)

  6. Sekarang Anda dapat mengklik tes di konsol Lambda.

  7. Saya sarankan menambahkan alias pendek untuk kedua perintah di atas. Inilah yang saya miliki untuk perintah pembaruan Lambda yang lebih lama:

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip"
    
John Allen
sumber
11
Anda mungkin perlu secara eksplisit menyatakan wilayah yang Anda targetkan: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox
2
Walaupun sepertinya lebih banyak pekerjaan, untuk melewati ini, itu cara yang jauh lebih baik untuk membangun ekspresi lambda ini ... terima kasih banyak!
Mike Perrenoud
9
Saya harus menggunakan --zip-file fileb://versus --zip-file file://saat menggunakan langkah-langkah ini
McLovin
3
Pastikan Anda hanya zip isi direktori, dan Anda melakukannya dari CLI (menggunakan perintah 'kompres' dari pencari Mac TIDAK akan bekerja ).
Yarin
3
Ini sangat berguna .. setidaknya ada dua hal yang hilang untuk membuat ini bekerja untuk saya ... 1) itu --zip-file fileb:bukan fileuntuk saya. 2) pada MacOS tampaknya dengan 3 garis miring misalnya sepertifileb:///Users/wio/Documents
Tobi
31

Diperlukan .zipfile untuk memasukkan modul npm di Lambda. Dan Anda benar-benar tidak boleh menggunakan editor web Lambda untuk banyak hal - karena dengan kode produksi apa pun, Anda harus mengembangkan secara lokal, berkomitmen untuk git, dll.

ALIRAN SAYA:

1) Fungsi Lambda saya biasanya adalah utilitas pembantu untuk proyek yang lebih besar, jadi saya membuat direktori / aws / lambdas di dalamnya untuk menampungnya.

2) Setiap direktori lambda berisi file index.js yang berisi kode fungsi, file package.json yang menentukan dependensi, dan subdirektori / node_modules . (File package.json tidak digunakan oleh Lambda, hanya supaya kita dapat menjalankan npm installperintah secara lokal .)

package.json:

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

3) Saya .gitignore semua direktori node_modules dan file .zip sehingga file yang dihasilkan dari npm terpasang dan zip tidak akan mengacaukan repo kami.

.gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) Saya menjalankan npm installdari dalam direktori untuk menginstal modul, dan mengembangkan / menguji fungsi secara lokal.

5) Saya .zip direktori lambda dan mengunggahnya melalui konsol.

( PENTING: Jangan gunakan utilitas 'kompres' Mac dari Finder untuk meng-zip file! Anda harus menjalankan zip dari CLI dari dalam root direktori-lihat di sini )

zip -r ../yourfilename.zip * 

CATATAN:

Anda mungkin mengalami masalah jika memasang modul simpul secara lokal di Mac Anda, karena beberapa modul khusus platform mungkin gagal saat digunakan ke lingkungan berbasis Linux Lambda. (Lihat https://stackoverflow.com/a/29994851/165673 )

Solusinya adalah mengkompilasi modul pada instance EC2 yang diluncurkan dari AMI yang sesuai dengan runtime Lambda Node.js yang Anda gunakan (Lihat daftar runtime Lambda dan AMI masing-masing ).


Lihat juga Paket Penerapan AWS Lambda di Node.js - AWS Lambda

Yarin
sumber
9

Semoga ini bisa membantu, dengan kerangka Serverless Anda dapat melakukan sesuatu seperti ini:

  1. Tambahkan hal-hal ini di file serverless.yml Anda:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. Kemudian buat fungsi Lambda Anda, sebarkan serverless deploy, paket yang termasuk dalam serverless.yml akan ada untuk Anda.

Untuk informasi lebih lanjut tentang serverless: https://serverless.com/framework/docs/providers/aws/guide/quick-start/

Toai
sumber
Anda harus menginstalnya duluserverless plugin install --name pluginName
Liad Livnat
1

Modul npm harus dibundel di dalam paket nodejs Anda dan mengunggah ke AWS Lambda Layers sebagai zip, maka Anda perlu merujuk ke modul / js Anda seperti di bawah ini dan menggunakan metode yang tersedia dari itu. const mymodule = membutuhkan ('/ opt / nodejs / MyLogger');

Sunil Chauraha
sumber