Distribuisci funzioni Lambda in Node.js con archivi di file .zip - AWS Lambda

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Distribuisci funzioni Lambda in Node.js con archivi di file .zip

Il codice della AWS Lambda funzione comprende un file .js o .mjs contenente il codice del gestore della funzione, insieme a tutti i pacchetti e moduli aggiuntivi da cui dipende il codice. Per implementare questo codice della funzione in Lambda, utilizza un pacchetto di implementazione. Questo pacchetto può essere un archivio di file .zip o un'immagine di container. Per ulteriori informazioni sull'uso delle immagini di container con Node.js, consulta la pagina Implementazione di funzioni Lambda in Node.js con immagini di container.

Per creare un pacchetto di implementazione come archivio di file .zip, puoi utilizzare l'utilità di archiviazione di file .zip incorporata del tuo strumento della linea di comando o qualsiasi altra utilità file .zip, come ad esempio 7zip. Gli esempi mostrati nelle sezioni seguenti presuppongono che tu stia utilizzando uno strumento della linea di comando zip in un ambiente Linux o MacOS. Per utilizzare gli stessi comandi in Windows, puoi installare il sottosistema Windows per Linux per ottenere una versione di Ubuntu e Bash integrata con Windows.

Tieni presente che Lambda utilizza le autorizzazioni relative ai POSIX file, quindi potrebbe essere necessario impostare le autorizzazioni per la cartella del pacchetto di distribuzione prima di creare l'archivio del file.zip.

Dipendenze di runtime in Node.js

Per le funzioni Lambda che utilizzano il runtime di Node.js, una dipendenza può essere qualsiasi modulo Node.js. Il runtime di Node.js include una serie di librerie comuni, oltre a una versione di AWS SDK for JavaScript. Il runtime nodejs16.x Lambda include la versione 2.x di. SDK Le versioni di runtime nodejs18.x e successive includono la versione 3 di. SDK Per utilizzare la versione 2 di SDK con le versioni runtime nodejs18.x e successive, aggiungila SDK al pacchetto di distribuzione del file.zip. Se il runtime scelto include la versione di SDK che stai utilizzando, non è necessario includere la SDK libreria nel file.zip. Per scoprire quale versione di SDK è inclusa nel runtime che stai utilizzando, consultaVersioni incluse in Runtime SDK.

Lambda aggiorna periodicamente le SDK librerie nel runtime di Node.js per includere le funzionalità e gli aggiornamenti di sicurezza più recenti. Lambda applica anche patch di sicurezza e aggiornamenti alle altre librerie incluse nel runtime. Per avere il pieno controllo delle dipendenze del pacchetto, puoi aggiungere la tua versione preferita di qualsiasi dipendenza inclusa nel runtime al tuo pacchetto di implementazione. Ad esempio, se desideri utilizzare una versione particolare di SDK for JavaScript, puoi includerla nel tuo file.zip come dipendenza. Per ulteriori informazioni sull'aggiunta di dipendenze incluse nel runtime al tuo file .zip, consulta la pagina Percorso di ricerca delle dipendenze e librerie incluse nel runtime.

In base al modello di responsabilità condivisa di AWS, è tua responsabilità gestire eventuali dipendenze nei pacchetti di implementazione delle tue funzioni. Ciò include l'applicazione di aggiornamenti e patch di sicurezza. Per aggiornare le dipendenze nel pacchetto di implementazione della funzione, crea prima un nuovo file .zip e poi caricalo su Lambda. Per ulteriori informazioni, consulta Creazione di un pacchetto di implementazione .zip con dipendenze e Creazione e aggiornamento delle funzioni Lambda di Node.js utilizzando file .zip.

Creazione di un pacchetto di implementazione .zip senza dipendenze

Se il codice della funzione non ha dipendenze oltre alle librerie incluse nel runtime Lambda, il file .zip contiene solo il file index.js o index.mjs con il codice del gestore della funzione. Utilizza il tuo strumento di compressione preferito per creare un file .zip con il file index.js o index.mjs nella directory principale. Se il file contenente il codice del gestore della funzione non si trova nella directory principale del file .zip, Lambda non è in grado di eseguire il codice.

Per informazioni su come implementare il file .zip per creare una nuova funzione Lambda o aggiornarne una esistente, consulta la sezione Creazione e aggiornamento delle funzioni Lambda di Node.js utilizzando file .zip.

Creazione di un pacchetto di implementazione .zip con dipendenze

Se il codice della funzione dipende da pacchetti o moduli non inclusi nel runtime Node.js di Lambda, puoi aggiungere queste dipendenze al file .zip con il codice della funzione oppure utilizzare un livello Lambda. Le istruzioni in questa sezione mostrano come includere le dipendenze nel pacchetto di implementazione .zip. Per istruzioni sull'inclusione di dipendenze in un livello, consulta Creazione di un livello Node.js per dipendenze.

I CLI comandi di esempio seguenti creano un file con estensione zip denominato my_deployment_package.zip contenente il index.mjs file index.js or con il codice del gestore della funzione e le relative dipendenze. Nell'esempio, installi le dipendenze utilizzando il gestore di pacchetti npm.

Per creare il pacchetto di implementazione
  1. Passa alla directory del progetto contenente il file del codice sorgente index.js o index.mjs. In questo esempio, la directory è denominata my_function.

    cd my_function
  2. Installa le librerie richieste dalla tua funzione nella directory node_modules utilizzando il comando npm install. In questo esempio installi l' SDK AWS X-Ray per Node.js.

    npm install aws-xray-sdk

    Questo crea una struttura di cartelle simile alla seguente:

    ~/my_function ├── index.mjs └── node_modules ├── async ├── async-listener ├── atomic-batcher ├── aws-sdk ├── aws-xray-sdk ├── aws-xray-sdk-core

    Al tuo pacchetto di implementazione puoi anche aggiungere moduli personalizzati che crei in autonomia. Crea una directory in node_modules con il nome del tuo modulo e salva lì i tuoi pacchetti personalizzati.

  3. Crea un file .zip dei contenuti della cartella di progetto della directory principale. Utilizza l'opzione (ricorsiva) r per garantire che lo zip comprima le sottocartelle.

    zip -r my_deployment_package.zip .

Creazione di un livello Node.js per dipendenze

Le istruzioni in questa sezione spiegano come includere dipendenze in un livello. Per istruzioni sull'inclusione di dipendenze in un pacchetto di implementazione, consulta Creazione di un pacchetto di implementazione .zip con dipendenze.

Quando si aggiunge un livello a una funzione, Lambda carica il contenuto del livello nella directory /opt di quell'ambiente di esecuzione. Per ogni runtime Lambda, la variabile PATH include percorsi di cartelle specifici nella directory /opt. Per garantire che la PATH variabile raccolga il contenuto del layer, il file Layer .zip deve avere le sue dipendenze nei seguenti percorsi di cartella:

  • nodejs/node_modules

  • nodejs/node16/node_modules (NODE_PATH)

  • nodejs/node18/node_modules (NODE_PATH)

  • nodejs/node20/node_modules (NODE_PATH)

Ad esempio, la struttura del file .zip del livello potrebbe essere simile alla seguente:

xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk

Lambda rileva automaticamente tutte le librerie nella directory /opt/lib e tutti i file binari nella directory /opt/bin. Per accertarti che Lambda trovi correttamente il contenuto del tuo livello, crea un livello con la seguente struttura:

custom-layer.zip └ lib | lib_1 | lib_2 └ bin | bin_1 | bin_2

Dopo aver creato un pacchetto del livello, consulta Creazione ed eliminazione di livelli in Lambda e Aggiunta di livelli alle funzioni per completare l'impostazione del livello.

Percorso di ricerca delle dipendenze e librerie incluse nel runtime

Il runtime di Node.js include una serie di librerie comuni, oltre a una versione di AWS SDK for JavaScript. Se desideri utilizzare una versione diversa di una libreria inclusa nel runtime, puoi farlo raggruppandola con la tua funzione o aggiungendola come dipendenza nel tuo pacchetto di implementazione. Ad esempio, è possibile utilizzare una versione diversa di aggiungendola al SDK pacchetto di distribuzione.zip. Puoi anche includerlo in un livello Lambda per la tua funzione.

Quando utilizzi un'istruzione import o require nel codice, il runtime di Node.js cerca nelle directory nel percorso NODE_PATH finché non trova il modulo. Per impostazione predefinita, la prima posizione cercata dal runtime è la directory in cui il pacchetto di implementazione .zip viene decompresso e montato (/var/task). Se includi una versione di una libreria inclusa nel runtime nel tuo pacchetto di implementazione, questa versione avrà la precedenza sulla versione inclusa nel runtime. Le dipendenze nel pacchetto di implementazione hanno la precedenza anche sulle dipendenze nei livelli.

Quando aggiungi una dipendenza a un livello, Lambda la estrae in /opt/nodejs/nodexx/node_modules, dove nodexx rappresenta la versione del runtime che stai utilizzando. Nel percorso di ricerca, questa directory ha la precedenza sulla directory contenente le librerie incluse nel runtime (/var/lang/lib/node_modules). Le librerie nei livelli di funzione hanno quindi la precedenza sulle versioni incluse nel runtime.

Puoi visualizzare il percorso di ricerca completo per la tua funzione Lambda aggiungendo la seguente riga di codice.

console.log(process.env.NODE_PATH)

Puoi anche aggiungere dipendenze in una cartella separata all'interno del tuo pacchetto .zip. Ad esempio, potresti aggiungere un modulo personalizzato a una cartella del tuo pacchetto .zip denominata common. Quando il pacchetto .zip viene decompresso e montato, questa cartella viene inserita nella directory /var/task. Per utilizzare nel codice una dipendenza da una cartella del pacchetto di distribuzione.zip, utilizza un'const { } = require()istruzione import { } from or, a seconda che si stia utilizzando CJS o ESM la risoluzione del modulo. Per esempio:

import { myModule } from './common'

Se raggruppi il codice con esbuild, rollup o qualcosa di simile, le dipendenze utilizzate dalla funzione vengono raggruppate in uno o più file. Si consiglia di utilizzare questo metodo per eliminare le dipendenze ogni volta che è possibile. Rispetto all'aggiunta di dipendenze al pacchetto di implementazione, il raggruppamento del codice comporta un miglioramento delle prestazioni perché si riducono le operazioni di I/O.

Creazione e aggiornamento delle funzioni Lambda di Node.js utilizzando file .zip

Dopo aver creato il pacchetto di implementazione .zip, puoi utilizzarlo per creare una nuova funzione Lambda o aggiornarne una esistente. Puoi distribuire il tuo pacchetto.zip utilizzando la console Lambda, il AWS Command Line Interface e Lambda. API Puoi anche creare e aggiornare le funzioni Lambda usando AWS Serverless Application Model (AWS SAM) e AWS CloudFormation.

La dimensione massima per un pacchetto di implementazione .zip per Lambda è di 250 MB (dopo l'estrazione). Nota che questo limite si applica alla dimensione combinata di tutti i file caricati, inclusi eventuali livelli Lambda.

Il runtime Lambda necessita dell'autorizzazione per leggere i file nel pacchetto di distribuzione. Nella notazione ottale delle autorizzazioni Linux, Lambda richiede 644 permessi per i file non eseguibili (rw-r--r--) e 755 permessi () per le directory e i file eseguibili. rwxr-xr-x

In Linux e macOS, utilizza il comando chmod per modificare le autorizzazioni file su file e directory nel pacchetto di implementazione. Ad esempio, per assegnare a un file eseguibile le autorizzazioni corrette, utilizza il comando seguente.

chmod 755 <filepath>

Per modificare le autorizzazioni file in Windows, consulta Set, View, Change, or Remove Permissions on an Object nella documentazione di Microsoft Windows.

Creazione e aggiornamento delle funzioni con file .zip utilizzando la console

Per creare una nuova funzione, devi prima creare la funzione nella console, quindi devi caricare il tuo archivio .zip. Per aggiornare una funzione esistente, apri la pagina relativa alla funzione, quindi segui la stessa procedura per aggiungere il file .zip aggiornato.

Se il file .zip ha dimensioni inferiori a 50 MB, è possibile creare o aggiornare una funzione caricando il file direttamente dal computer locale. Per i file .zip di dimensioni superiori a 50 MB, prima è necessario caricare il pacchetto in un bucket Amazon S3. Per istruzioni su come caricare un file in un bucket Amazon S3 utilizzando AWS Management Console, consulta la Guida introduttiva ad Amazon S3. Per caricare file utilizzando la AWS CLI, consulta Move objects nella Guida per l'AWS CLI utente.

Nota

Non è possibile modificare il tipo di pacchetto di distribuzione (.zip o immagine del contenitore) per una funzione esistente. Ad esempio, non è possibile convertire una funzione di immagine del contenitore per utilizzare un archivio di file.zip. È necessario creare una nuova funzione.

Creazione di una nuova funzione (console)
  1. Apri la pagina Funzioni della console Lambda e scegli Crea funzione.

  2. Scegli Author from scratch (Crea da zero).

  3. In Basic information (Informazioni di base) eseguire queste operazioni:

    1. In Nome funzione, inserisci il nome della funzione.

    2. Per Runtime, seleziona il runtime che desideri utilizzare.

    3. (Facoltativo) Per Architettura, scegli l'architettura del set di istruzioni per la funzione. L'architettura predefinita è x86_64. Assicurati che il pacchetto di implementazione per la tua funzione sia compatibile con l'architettura del set di istruzioni scelta.

  4. (Opzionale) In Autorizzazioni espandere Modifica ruolo di esecuzione predefinito. Puoi creare un nuovo ruolo di esecuzione o utilizzare un ruolo esistente.

  5. Scegli Crea funzione. Lambda crea una funzione di base "Hello world" utilizzando il runtime scelto.

Caricamento di un archivio .zip dal computer locale (console)
  1. Nella pagina Funzioni della console Lambda, scegli la funzione per cui vuoi caricare il file .zip.

  2. Scegli la scheda Codice.

  3. Nel riquadro Origine del codice, scegli Carica da.

  4. Scegli File .zip.

  5. Per caricare il file .zip, procedi come segue:

    1. Seleziona Carica, quindi seleziona il tuo file .zip nel selettore di file.

    2. Seleziona Apri.

    3. Seleziona Salva.

Caricamento di un archivio .zip da un bucket Amazon S3 (console)
  1. Nella pagina Funzioni della console Lambda, scegli la funzione per cui vuoi caricare un nuovo file .zip.

  2. Scegli la scheda Codice.

  3. Nel riquadro Origine del codice, scegli Carica da.

  4. Scegli Posizione Amazon S3.

  5. Incolla il link Amazon S3 URL del tuo file.zip e scegli Salva.

Aggiornamento delle funzioni dei file .zip tramite l'editor di codice della console

Per alcune funzioni con pacchetti di implementazione .zip, puoi utilizzare l'editor di codice integrato nella console Lambda per aggiornare direttamente il codice della funzione. Per utilizzare questa funzione, la funzione deve soddisfare i seguenti criteri:

  • La funzione deve utilizzare uno dei runtime del linguaggio interpretato (Python, Node.js o Ruby)

  • Il pacchetto di implementazione della funzione deve avere dimensioni inferiori a 3 MB.

Il codice della funzione per le funzioni con pacchetti di implementazione di immagini di container non può essere modificato direttamente nella console.

Aggiornamento del codice della funzione utilizzando l'editor di codice della console
  1. Apri la pagina Funzioni della console Lambda e scegli la tua funzione.

  2. Scegli la scheda Codice.

  3. Nel riquadro Origine del codice, seleziona il tuo file di codice sorgente e modificalo nell'editor di codice integrato.

  4. Quando hai finito di modificare il codice, scegli Implementa per salvare le modifiche e aggiornare la funzione.

Creazione e aggiornamento di funzioni con file.zip utilizzando il AWS CLI

È possibile utilizzare la AWS CLI per creare una nuova funzione o aggiornare una funzione esistente mediante un file .zip. Usa la funzione create-function e update-function-codei comandi per distribuire il tuo pacchetto .zip. Se il file .zip ha dimensioni inferiori a 50 MB, è possibile caricare il pacchetto .zip da una posizione di file nella macchina di compilazione locale. Per i file di dimensioni maggiori, è necessario caricare il pacchetto .zip da un bucket Amazon S3. Per istruzioni su come caricare un file su un bucket Amazon S3 utilizzando AWS CLI, consulta Move objects nella User Guide.AWS CLI

Nota

Se carichi il tuo file.zip da un bucket Amazon S3 utilizzando AWS CLI il, il bucket deve trovarsi nella stessa posizione della Regione AWS tua funzione.

Per creare una nuova funzione utilizzando un file.zip con AWS CLI, devi specificare quanto segue:

  • Il nome della funzione (--function-name)

  • Il runtime della tua funzione (--runtime)

  • L'Amazon Resource Name (ARN) del ruolo di esecuzione della tua funzione (--role)

  • Il nome del metodo del gestore nel codice della funzione (--handler)

È inoltre necessario specificare la posizione del file .zip. Se il file .zip si trova in una cartella sulla macchina di compilazione locale, utilizza l'opzione --zip-file per specificare il percorso del file, come mostrato nel seguente comando di esempio.

aws lambda create-function --function-name myFunction \ --runtime nodejs20.x --handler index.handler \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --zip-file fileb://myFunction.zip

Per specificare la posizione del file .zip in un bucket Amazon S3, utilizza l'opzione --code illustrata nel seguente comando di esempio. È necessario utilizzare il parametro S3ObjectVersion solo per gli oggetti con controllo delle versioni.

aws lambda create-function --function-name myFunction \ --runtime nodejs20.x --handler index.handler \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion

Per aggiornare una funzione esistente utilizzando ilCLI, specifichi il nome della funzione utilizzando il --function-name parametro. È inoltre necessario specificare la posizione del file .zip che desideri utilizzare per aggiornare il codice della funzione. Se il file .zip si trova in una cartella sulla macchina di compilazione locale, utilizza l'opzione --zip-file per specificare il percorso del file, come mostrato nel seguente comando di esempio.

aws lambda update-function-code --function-name myFunction \ --zip-file fileb://myFunction.zip

Per specificare la posizione del file .zip in un bucket Amazon S3, utilizza le opzioni --s3-bucket e --s3-key come illustrato nel seguente comando di esempio. È necessario utilizzare il parametro --s3-object-version solo per gli oggetti con controllo delle versioni.

aws lambda update-function-code --function-name myFunction \ --s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version

Creazione e aggiornamento di funzioni con file.zip utilizzando Lambda API

Per creare e aggiornare funzioni utilizzando un archivio di file.zip, utilizzate le seguenti operazioni: API

Creazione e aggiornamento di funzioni con file.zip utilizzando AWS SAM

Il AWS Serverless Application Model (AWS SAM) è un toolkit che aiuta a semplificare il processo di creazione ed esecuzione di applicazioni serverless su. AWS Definite le risorse per l'applicazione in un JSON modello YAML o e utilizzate l'interfaccia a riga di AWS SAM comando (AWS SAM CLI) per creare, impacchettare e distribuire le applicazioni. Quando crei una funzione Lambda da un AWS SAM modello, crea AWS SAM automaticamente un pacchetto di distribuzione.zip o un'immagine del contenitore con il codice della funzione e le eventuali dipendenze specificate. Per ulteriori informazioni sull'utilizzo AWS SAM per creare e distribuire funzioni Lambda, consulta la Guida introduttiva AWS Serverless Application Model alla AWS SAM Developer Guide.

È inoltre possibile utilizzare AWS SAM per creare una funzione Lambda utilizzando un archivio di file.zip esistente. Per creare una funzione Lambda utilizzando AWS SAM, puoi salvare il tuo file.zip in un bucket Amazon S3 o in una cartella locale sulla tua macchina di compilazione. Per istruzioni su come caricare un file su un bucket Amazon S3 utilizzando AWS CLI, consulta Move objects nella User Guide.AWS CLI

Nel AWS SAM modello, la AWS::Serverless::Function risorsa specifica la funzione Lambda. In questa risorsa, imposta le seguenti proprietà per creare una funzione utilizzando un archivio di file .zip:

  • PackageType: imposta il valore su Zip

  • CodeUri- impostato sull'Amazon S3 del codice della funzioneURI, sul percorso della cartella locale o sull'oggetto FunctionCode

  • Runtime: imposta il runtime prescelto

Inoltre AWS SAM, se il tuo file.zip è più grande di 50 MB, non è necessario caricarlo prima in un bucket Amazon S3. AWS SAM puoi caricare pacchetti.zip fino alla dimensione massima consentita di 250 MB (decompressi) da una posizione sulla macchina di compilazione locale.

Per ulteriori informazioni sulla distribuzione delle funzioni utilizzando il file.zip in AWS SAM, consulta AWS: :Serverless: :Function nella Developer Guide.AWS SAM

Creazione e aggiornamento di funzioni con file.zip utilizzando AWS CloudFormation

È possibile utilizzare AWS CloudFormation per creare una funzione Lambda utilizzando un archivio di file.zip. Per creare una funzione Lambda da un file .zip, devi prima caricare il file su un bucket Amazon S3. Per istruzioni su come caricare un file su un bucket Amazon S3 utilizzando AWS CLI, consulta Move objects nella User Guide.AWS CLI

Nel AWS CloudFormation modello, la AWS::Lambda::Function risorsa specifica la funzione Lambda. In questa risorsa, imposta le seguenti proprietà per creare una funzione utilizzando un archivio di file .zip:

  • PackageType: imposta il valore su Zip

  • Code: inserisci il nome del bucket Amazon S3 e il nome del file .zip nei campi S3Bucket e S3Key

  • Runtime: imposta il runtime prescelto

Il file.zip che AWS CloudFormation genera non può superare i 4 MB. Per ulteriori informazioni sulla distribuzione di funzioni utilizzando il file.zip in AWS CloudFormation, vedere AWS: :Lambda: :Function nella Guida per l'utente.AWS CloudFormation