Come caricare i moduli npm in AWS Lambda?


147

Ho creato diverse funzioni Lambda usando l'editor basato sul web. Fin qui tutto bene. Ora vorrei iniziare ad estendere quelli con i moduli (come Q per le promesse). Non riesco a capire come inviare i moduli a Lambda in modo che possano essere consumati dalle mie funzioni.

Ho letto questo, ma sembra implicare la creazione di un EC2 e l'esecuzione delle funzioni Lambda da lì. Esiste un meccanismo per caricare una zip durante la creazione di una funzione, ma ciò sembra implicare l'invio di funzioni sviluppate localmente. Dal momento che sto lavorando nell'editor basato sul web che sembra uno strano flusso di lavoro.

Come posso semplicemente distribuire alcuni moduli da utilizzare nelle mie funzioni Lambda?


7
Tutto è spiegato nei documenti qui - docs.aws.amazon.com/lambda/latest/dg/…
arcseldon

Risposte:


198

Non è possibile caricare i moduli NPM senza caricare un .zipfile, ma in realtà è possibile ottenere questo processo fino a due righe di comando rapide.

Ecco come:

  1. Metti i tuoi file di funzione Lambda in una directory separata. Questo perché si installano i npmpacchetti localmente per Lambda e si desidera poter isolare e testare ciò che si caricherà su Lambda.

  2. Installa i tuoi pacchetti NPM localmente npm install packageNamementre sei nella directory Lambda separata che hai creato nel passaggio # 1.

  3. Assicurati che la tua funzione funzioni quando è in esecuzione localmente: node lambdaFunc.js(puoi semplicemente commentare le due export.handlerrighe nel tuo codice per adattare il tuo codice per l'esecuzione con Node localmente).

  4. Vai alla directory di Lambda e comprimi il contenuto , assicurati di non includere la directory stessa.

    zip -r lambdaFunc.zip .
    
  5. Se hai aws-cliinstallato, che ti suggerisco di avere se vuoi semplificarti la vita, ora puoi inserire questo comando:

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

    (senza virgolette intorno alla parte lambdaFunc sopra nel caso ti chiedi come ho fatto io)

  6. Ora puoi fare clic su test nella console Lambda.

  7. Suggerisco di aggiungere un breve alias per entrambi i comandi sopra. Ecco cosa ho nel mio per il comando di aggiornamento Lambda molto più lungo:

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

11
Potrebbe essere necessario indicare esplicitamente la regione di destinazione: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox

2
Anche se sembra molto più lavoro, per passare attraverso questo, è davvero un modo molto migliore di costruire queste espressioni lambda ... grazie mille!
Mike Perrenoud,

9
Ho dovuto usare --zip-file fileb://contro --zip-file file://mentre usando questi passaggi
McLovin

3
Assicurati di comprimere solo il contenuto della directory e di farlo dalla CLI (usando il comando 'compress' dal Finder di Mac NON funzionerà ).
Yarin,

3
Questo è stato super utile .. mancavano almeno due cose per farlo funzionare per me ... 1) --zip-file fileb:invece che fileper me. 2) su MacOS sembra essere con 3 barre, ad esempiofileb:///Users/wio/Documents
Tobi,

31

È .zipnecessario un file per includere i moduli npm in Lambda. E davvero non dovresti usare l'editor web Lambda per quasi tutto - come con qualsiasi codice di produzione, dovresti sviluppare localmente, impegnarti a git, ecc.

IL MIO FLUSSO:

1) Le mie funzioni Lambda sono di solito utilità di supporto per un progetto più ampio, quindi creo una directory / aws / lambdas all'interno di quella per ospitarle .

2) Ogni singola directory lambda contiene un file index.js contenente il codice funzione, un file package.json che definisce le dipendenze e una sottodirectory / node_modules . (Il file package.json non è utilizzato da Lambda, è solo per poter eseguire localmente il npm installcomando.)

package.json:

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

3) I .gitignore tutte le directory node_modules e i file .zip in modo che i file generati dalle installazioni di npm e zippando non ingombrino il nostro repository.

.gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) Corro npm installdalla directory per installare i moduli e sviluppo / collaudo la funzione localmente.

5) Ho .zip la directory lambda e caricarlo tramite la console.

( IMPORTANTE: non utilizzare l'utilità 'comprimi' di Mac dal Finder per comprimere il file! È necessario eseguire zip dalla CLI dalla radice della directory, vedere qui )

zip -r ../yourfilename.zip * 

NOTA:

Potresti riscontrare problemi se installi i moduli del nodo localmente sul tuo Mac, poiché alcuni moduli specifici della piattaforma potrebbero non funzionare quando vengono distribuiti nell'ambiente Lambda basato su Linux. (Vedi https://stackoverflow.com/a/29994851/165673 )

La soluzione è quella di compilare i moduli su un'istanza EC2 lanciata dall'AMI che corrisponde al runtime Lambda Node.js che stai utilizzando (consulta questo elenco di runtime Lambda e le rispettive AMI ).


Vedi anche Pacchetto di distribuzione AWS Lambda in Node.js - AWS Lambda



9

Spero che questo aiuti, con Serverless framework puoi fare qualcosa del genere:

  1. Aggiungi queste cose nel tuo file serverless.yml:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. Quindi crea la tua funzione Lambda, distribuiscila da serverless deploy, il pacchetto incluso in serverless.yml sarà lì per te.

Per ulteriori informazioni su serverless: https://serverless.com/framework/docs/providers/aws/guide/quick-start/


devi prima installarloserverless plugin install --name pluginName
Liad Livnat il

1

Il modulo npm deve essere raggruppato nel pacchetto nodejs e caricato su AWS Lambda Layers come zip, quindi dovrai fare riferimento al tuo modulo / js come di seguito e utilizzare i metodi disponibili da esso. const mymodule = require ('/ opt / nodejs / MyLogger');

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.