Utilizzo dei livelli per le funzioni Lambda Node.js - AWS Lambda

Utilizzo dei livelli per le funzioni Lambda Node.js

Usa i livelli Lambda per impacchettare codice e dipendenze che desideri riutilizzare in più funzioni. I livelli di solito contengono dipendenze dalla libreria, un runtime personalizzato o file di configurazione. La creazione di un livello prevede tre passaggi generali:

  1. Crea un pacchetto per il contenuto del livello. Ciò significa creare un archivio di file con estensione .zip che contiene le dipendenze che desideri utilizzare nelle funzioni.

  2. Crea il livello in Lambda.

  3. Aggiungi il livello alle tue funzioni.

Crea un pacchetto per il contenuto del livello

Per creare un livello, raggruppa i pacchetti in un archivio di file con estensione zip che soddisfi i seguenti requisiti:

  • Crea il livello utilizzando la stessa versione di Node.js che intendi utilizzare per la funzione Lambda. Ad esempio, se create il layer utilizzando Node.js 22, utilizzate il runtime Node.js 22 per la vostra funzione.

  • Il file.zip del livello deve utilizzare una di queste strutture di directory:

    • nodejs/node_modules

    • nodejs/nodeX/node_modules(dove X è la versione di Node.js, ad esempionode22)

    Per ulteriori informazioni, consulta Percorsi dei livelli per ciascun runtime Lambda.

  • I pacchetti del livello devono essere compatibili con Linux. Le funzioni Lambda vengono eseguite su Amazon Linux.

È possibile creare livelli che contengono librerie Node.js di terze parti installate con npm (come axios olodash) o moduli JavaScript personalizzati.

Per creare un livello utilizzando i pacchetti npm
  1. Crea la struttura di directory richiesta e installa i pacchetti direttamente al suo interno:

    mkdir -p nodejs npm install --prefix nodejs lodash axios

    Questo comando installa i pacchetti direttamente nella nodejs/node_modules directory, che è la struttura richiesta da Lambda.

    Nota

    Per i pacchetti con dipendenze native o componenti binari (come sharp o bcrypt), assicurati che siano compatibili con l'ambiente Lambda Linux e l'architettura della tua funzione. Potrebbe essere necessario utilizzare la --platform bandiera:

    npm install --prefix nodejs --platform=linux --arch=x64 sharp

    Per dipendenze native più complesse, potrebbe essere necessario compilarle in un ambiente Linux che corrisponda al runtime Lambda. Consente di utilizzare Docker per questo scopo.

  2. Comprimi il contenuto dei livelli:

    Linux/macOS
    zip -r layer.zip nodejs/
    PowerShell
    Compress-Archive -Path .\nodejs -DestinationPath .\layer.zip

    L'aspetto della struttura di directory dovrebbe essere simile al seguente:

    nodejs/
    ├── package.json
    ├── package-lock.json
    └── node_modules/
        ├── lodash/
        ├── axios/
        └── (dependencies of the other packages)
    Nota
    • Assicurati che il tuo file.zip includa la nodejs directory a livello principale al node_modules suo interno. Questa struttura garantisce che Lambda possa localizzare e importare i pacchi.

    • package-lock.jsonI file package.json and nella nodejs/ directory vengono utilizzati da npm per la gestione delle dipendenze ma non sono richiesti da Lambda per la funzionalità dei livelli. Ogni pacchetto installato contiene già il proprio package.json file che definisce il modo in cui Lambda importa il pacchetto.

Per creare un livello utilizzando il tuo codice
  1. Crea la struttura di directory richiesta per il tuo livello:

    mkdir -p nodejs/node_modules/validator cd nodejs/node_modules/validator
  2. Crea un package.json file per il tuo modulo personalizzato per definire come deve essere importato:

    Esempio nodejs/node_modules/validator/package.json
    { "name": "validator", "version": "1.0.0", "type": "module", "main": "index.mjs" }
  3. Crea il tuo file del modulo JavaScript:

    Esempio nodejs/node_modules/validator/index.mjs
    export function validateOrder(orderData) { // Validates an order and returns formatted data const requiredFields = ['productId', 'quantity']; // Check required fields const missingFields = requiredFields.filter(field => !(field in orderData)); if (missingFields.length > 0) { throw new Error(`Missing required fields: ${missingFields.join(', ')}`); } // Validate quantity const quantity = orderData.quantity; if (!Number.isInteger(quantity) || quantity < 1) { throw new Error('Quantity must be a positive integer'); } // Format and return the validated data return { productId: String(orderData.productId), quantity: quantity, shippingPriority: orderData.priority || 'standard' }; } export function formatResponse(statusCode, body) { // Formats the API response return { statusCode: statusCode, body: JSON.stringify(body) }; }
  4. Comprimi il contenuto dei livelli:

    Linux/macOS
    zip -r layer.zip nodejs/
    PowerShell
    Compress-Archive -Path .\nodejs -DestinationPath .\layer.zip

    L'aspetto della struttura di directory dovrebbe essere simile al seguente:

    nodejs/              
    └── node_modules/
        └── validator/
            ├── package.json
            └── index.mjs
  5. Nella tua funzione, importa e usa i moduli. Esempio:

    import { validateOrder, formatResponse } from 'validator'; export const handler = async (event) => { try { // Parse the order data from the event body const orderData = JSON.parse(event.body || '{}'); // Validate and format the order const validatedOrder = validateOrder(orderData); return formatResponse(200, { message: 'Order validated successfully', order: validatedOrder }); } catch (error) { if (error instanceof Error && error.message.includes('Missing required fields')) { return formatResponse(400, { error: error.message }); } return formatResponse(500, { error: 'Internal server error' }); } };

    È possibile utilizzare i seguenti dati evento per invocare la funzione:

    { "body": "{\"productId\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}" }

    Risposta prevista:

    { "statusCode": 200, "body": "{\"message\":\"Order validated successfully\",\"order\":{\"productId\":\"ABC123\",\"quantity\":2,\"shippingPriority\":\"express\"}}" }

Crea il livello in Lambda.

È possibile creare la funzione Lambda mediante la AWS CLI o la console Lambda.

AWS CLI

Esegui il AWS CLI comando publish-layer-version per creare il livello Lambda:

aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://layer.zip --compatible-runtimes nodejs22.x

Il parametro compatible runtimes è facoltativo. Quando specificato, Lambda utilizza questo parametro per filtrare i livelli nella console Lambda.

Console
Creazione di un livello (console)
  1. Apri la pagina Layers (Livelli) nella console Lambda.

  2. Scegli Create layer (Crea livello).

  3. Scegli Carica un file.zip, quindi carica l'archivio.zip che hai creato in precedenza.

  4. (Facoltativo) Per i runtime compatibili, scegliete il runtime Node.js che corrisponde alla versione Node.js utilizzata per creare il layer.

  5. Seleziona Create (Crea).

Aggiungi il livello alla tua funzione.

AWS CLI

Per collegare il layer alla funzione, eseguite il comando AWS CLIupdate-function-configuration. Usa l'attività ARN per il parametro --layers. L'ARN deve specificare la versione (ad esempio,arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1). Per ulteriori informazioni, consulta Livelli e versioni di livelli.

aws lambda update-function-configuration --function-name my-function --cli-binary-format raw-in-base64-out --layers "arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1"

L'opzione cli-binary-format è necessaria se si utilizza la versione 2 della AWS CLI. Per rendere questa impostazione come predefinita, esegui aws configure set cli-binary-format raw-in-base64-out. Per ulteriori informazioni, consulta la pagina AWS CLI supported global command line options nella Guida per l'utente di AWS Command Line Interface versione 2.

Console
Aggiunta di un livello a una funzione
  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegli la funzione ().

  3. Scorri verso il basso fino alla sezione Livelli, quindi scegli Aggiungi un livello.

  4. In Scegli un livello, seleziona Livelli personalizzati, quindi scegli il tuo livello.

    Nota

    Se non hai aggiunto un runtime compatibile quando hai creato il layer, il tuo layer non verrà elencato qui. È possibile specificare invece il livello ARN.

  5. Scegli Aggiungi.

app di esempio

Per altri esempi di utilizzo dei layer Lambda, consulta l'applicazione di esempio layer-nodejs nel repository GitHub della Developer Guide. AWS Lambda Questa applicazione include un layer che contiene la libreria lodash. Dopo aver creato un livello, puoi implementare e richiamare la funzione corrispondente per verificare che tutto funzioni.