AWS Lambda'da npm modülleri nasıl yüklenir?


153

Web tabanlı düzenleyiciyi kullanarak birkaç Lambda işlevi oluşturdum. Çok uzak çok iyi. Şimdi bunları modüllerle genişletmeye başlamak istiyorum (sözler için Q gibi). Modülleri Lambda'ya nasıl çıkaracağımı çözemiyorum, böylece işlevlerim tarafından tüketilebilirler.

Ben baştan sona kadar okuduktan Bu ancak bir EC2 kurma ve oradan Lambda fonksiyonları çalıştıran dahil görünüyor. Bir işlev oluştururken bir zip yüklemek için bir mekanizma var, ancak bu yerel olarak geliştirilen işlevleri göndermeyi içeriyor gibi görünüyor. Web tabanlı düzenleyicide çalıştığım için bu garip bir iş akışı gibi görünüyor.

Lambda işlevlerimde kullanmak için bazı modülleri nasıl basitçe dağıtabilirim?


8
Hepsi buradaki belgelerde açıklanmıştır - docs.aws.amazon.com/lambda/latest/dg/…
arcseldon

Yanıtlar:


209

NPM modüllerini bir .zipdosya yüklemeden yükleyemezsiniz , ancak aslında bu işlemi iki hızlı komut satırına indirgeyebilirsiniz.

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

  1. Lambda işlev dosyalarınızı ayrı bir dizine koyun. Bunun nedeni, npmpaketleri Lambda için yerel olarak kurmanız ve Lambda'ya yükleyeceğiniz şeyi izole edip test edebilmek istemenizdir.

  2. NPM paketlerinizi npm install packageName, 1. adımda oluşturduğunuz ayrı Lambda dizininizdeyken yerel olarak kurun .

  3. İşlevinizin yerel olarak çalışırken çalıştığından emin olun: node lambdaFunc.js( export.handlerkodunuzu yerel olarak Node ile çalışacak şekilde uyarlamak için kodunuzdaki iki satırı kolayca yorumlayabilirsiniz ).

  4. Lambda'nın dizinine gidin ve içeriği sıkıştırın , dizinin kendisini dahil etmediğinizden emin olun .

    zip -r lambdaFunc.zip .
    
  5. Eğer aws-clihayatınızı kolaylaştırmak istiyorsanız, sahip olmasını önerdiğim kurduysanız, şimdi şu komutu girebilirsiniz:

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

    (Benim yaptığım gibi merak ediyorsanız, yukarıdaki lambdaFunc kısmında alıntı yok)

  6. Artık Lambda konsolunda test seçeneğine tıklayabilirsiniz .

  7. Yukarıdaki komutların her ikisi için kısa bir takma ad eklemenizi öneririm. Çok daha uzun Lambda güncelleme komutu için sahip olduğum şeyler:

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

11
Hedeflediğiniz bölgeyi açıkça belirtmeniz gerekebilir: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox

2
Bu çok daha fazla çalışma gibi görünse de, bu lambda ifadelerini inşa etmenin gerçekten çok daha iyi bir yolu ... çok teşekkürler!
Mike Perrenoud

9
Bu adımları kullanırken --zip-file fileb://vs. kullanmak zorunda kaldım--zip-file file://
McLovin

3
Emin olun zip sadece içeriğini dizinin ve bunu yapmak CLI'den (Mac bulucudan 'kompres' komutunu kullanarak olacak DEĞİL çalışma ).
Yarin

3
Bu çok faydalı oldu .. Bunun benim için çalışmasını sağlamak için en az iki şey eksikti ... 1) benim için --zip-file fileb:değil file. 2) MacOS'ta 3 eğik çizgi gibi görünüyor, örneğinfileb:///Users/wio/Documents
Tobi

34

Lambda'ya npm modüllerini .zipdahil etmek için bir dosya gereklidir . Ve gerçekten de Lambda web düzenleyicisini pek çok şey için kullanmamalısınız - herhangi bir üretim kodunda olduğu gibi, yerel olarak geliştirme, gitme taahhüdü vb.

AKIŞIM:

1) Lambda işlevlerim genellikle daha büyük bir proje için yardımcı araçlar, bu yüzden onları barındırmak için bunun içinde bir / aws / lambdas dizini oluşturuyorum.

2) Her ayrı lambda dizini , işlev kodunu içeren bir index.js dosyası, bağımlılıkları tanımlayan bir package.json dosyası ve / node_modules alt dizini içerir. (Package.json dosyası Lambda tarafından kullanılmaz, sadece npm installkomutu yerel olarak çalıştırabilmemiz içindir .)

package.json:

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

3) Tüm node_modules dizinlerini ve .zip dosyalarını .gitignore ediyorum, böylece npm kurulumlarından ve sıkıştırmadan üretilen dosyalar depomuzu karıştırmasın.

.gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) npm installModülleri kurmak ve işlevi yerel olarak geliştirmek / test etmek için dizinin içinden çalıştırıyorum .

5) Lambda dizinini .zip ve konsol aracılığıyla yüklüyorum.

( ÖNEMLİ: Dosyayı sıkıştırmak için Mac'in Finder'daki 'sıkıştırma' yardımcı programını kullanmayın! Zip'i CLI'den dizinin kökünden çalıştırmalısınız - buraya bakın )

zip -r ../yourfilename.zip * 

NOT:

Bazı platforma özgü modüller Lambda'nın Linux tabanlı ortamına yerleştirildiğinde başarısız olabileceğinden, düğüm modüllerini yerel olarak Mac'inize yüklerseniz sorunlarla karşılaşabilirsiniz. (Bkz. Https://stackoverflow.com/a/29994851/165673 )

Çözüm, kullandığınız Lambda Node.js çalışma zamanına karşılık gelen AMI'den başlatılan bir EC2 bulut sunucusunda modülleri derlemektir ( Lambda çalışma zamanlarının ve ilgili AMI'lerin listesine bakın ).


Ayrıca Node.js'de AWS Lambda Dağıtım Paketi - AWS Lambda'ya bakın


21

Artık bu konularda Lambda Katmanlarını kullanabilirsiniz. İhtiyacınız olan paketi içeren bir katman ekleyin ve mükemmel şekilde çalışacaktır.

Bu gönderiyi takip edin: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e


1
Bu ana kadar katmanları bilmiyordum. Teşekkürler Eldad!
mecograph

AWS Toolkit'i neden kullanmıyorsunuz? "Bunların hepsini" devralmaya çalışıyor gibi görünüyor? (tüm bunların nasıl yapılacağıyla ilgili belgelerde bazı sinir bozucu parçalanmalar var ... a) web tabanlı düzenleyici b) manuel .zip yüklemeleri c) SAM d) Katmanlar şimdi e) AWS Araç Seti ... gezinmeye çalışan bir dev gibi)
Don Cheadle

10

Bunun yardımcı olacağını umuyoruz, Sunucusuz çerçeve ile şöyle bir şey yapabilirsiniz:

  1. Bunları serverless.yml dosyanıza ekleyin:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. Ardından, Lambda işlevinizi oluşturun, dağıtın serverless deploy, serverless.yml'de bulunan paket sizin için orada olacaktır.

Sunucusuz hakkında daha fazla bilgi için: https://serverless.com/framework/docs/providers/aws/guide/quick-start/


önce yüklemeniz gerekirserverless plugin install --name pluginName
Liad Livnat

2

npm modülünün nodejs paketinizin içinde paketlenmesi ve AWS Lambda Katmanlarına zip olarak yüklenmesi gerekir, ardından modülünüze / js'ye aşağıdaki gibi başvurmanız ve ondan mevcut yöntemleri kullanmanız gerekir. const mymodule = required ('/ opt / nodejs / MyLogger');

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.