Utilizzo dei livelli per le funzioni Java Lambda - 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à.

Utilizzo dei livelli per le funzioni Java Lambda

Un layer Lambda è un archivio di file.zip che contiene codice o dati supplementari. 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. Package del contenuto del layer. Ciò significa creare un archivio di file.zip che contenga le dipendenze da utilizzare nelle funzioni.

  2. Crea il livello in Lambda.

  3. Aggiungi il layer alle tue funzioni.

Questo argomento contiene passaggi e linee guida su come impacchettare e creare correttamente un layer Java Lambda con dipendenze di librerie esterne.

Prerequisiti

Per seguire i passaggi di questa sezione, è necessario disporre di quanto segue:

Nota

Assicurati che la versione Java a cui fa riferimento Maven sia la stessa della versione Java della funzione che intendi distribuire. Ad esempio, per una funzione Java 21, il mvn -v comando dovrebbe elencare la versione Java 21 nell'output:

Apache Maven 3.8.6 ... Java version: 21.0.2, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home ...

In questo argomento, facciamo riferimento all'applicazione di layer-javaesempio nel repository awsdocs GitHub . Questa applicazione contiene script che scaricano le dipendenze e generano il layer. L'applicazione contiene anche una funzione corrispondente che utilizza le dipendenze dal livello. Dopo aver creato un livello, potete implementare e richiamare la funzione corrispondente per verificare che tutto funzioni correttamente. Poiché utilizzate il runtime Java 21 per le funzioni, i livelli devono essere compatibili anche con Java 21.

L'applicazione layer-java di esempio contiene un singolo esempio all'interno di due sottodirectory. La layer directory contiene un pom.xml file che definisce le dipendenze dei livelli e gli script per generare il livello. La function directory contiene una funzione di esempio per verificare il funzionamento del layer. Questo tutorial spiega come creare e impacchettare questo layer.

Compatibilità del livello Java con Amazon Linux

Il primo passaggio per creare un livello consiste nel raggruppare tutto il contenuto del livello in un archivio di file .zip. Perché le funzioni Lambda vengano eseguite su Amazon Linux, il contenuto del livello deve essere in grado di compilare e creare in un ambiente Linux.

Il codice Java è progettato per essere indipendente dalla piattaforma, quindi puoi impacchettare i livelli sul tuo computer locale anche se non utilizza un ambiente Linux. Dopo aver caricato il layer Java su Lambda, sarà ancora compatibile con Amazon Linux.

Percorsi di livello per i runtime Java

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 dovrebbe avere le sue dipendenze nei seguenti percorsi di cartella:

  • java/lib

Ad esempio, il file.zip del layer risultante creato in questo tutorial ha la seguente struttura di directory:

layer_content.zip └ java └ lib └ layer-java-layer-1.0-SNAPSHOT.jar

Il file layer-java-layer-1.0-SNAPSHOT.jar JAR (un uber-jar che contiene tutte le nostre dipendenze richieste) si trova correttamente nella directory. java/lib Ciò garantisce che Lambda possa localizzare la libreria durante le chiamate delle funzioni.

Imballaggio del contenuto del livello

In questo esempio, si impacchettano le seguenti due librerie Java in un unico file JAR:

  • aws-lambda-java-core— Un set minimo di definizioni di interfaccia per lavorare con Java in AWS Lambda

  • Jackson: una popolare suite di strumenti di elaborazione dati, in particolare per lavorare con JSON.

Completate i seguenti passaggi per installare e impacchettare il contenuto del layer.

Per installare e impacchettare il contenuto del layer
  1. Clona il aws-lambda-developer-guide GitHub repository, che contiene il codice di esempio necessario nella sample-apps/layer-java directory.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Vai alla layer directory dell'app di layer-java esempio. Questa directory contiene gli script che utilizzate per creare e impacchettare correttamente il layer.

    cd aws-lambda-developer-guide/sample-apps/layer-java/layer
  3. Esaminate il pom.xmlfile. Nella <dependencies> sezione, definisci le dipendenze che desideri includere nel layer, vale a dire le jackson-databind librerie aws-lambda-java-core and. È possibile aggiornare questo file per includere tutte le dipendenze che si desidera includere nel proprio layer.

    Esempio pom.xml
    <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version> </dependency> </dependencies>
    Nota

    La <build> sezione di questo pom.xml file contiene due plugin. maven-compiler-pluginCompila il codice sorgente. Quindi maven-shade-pluginimpacchetta i tuoi artefatti in un unico uber-jar.

  4. Assicurati di disporre delle autorizzazioni per eseguire entrambi gli script.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Esegui lo 1-install.shscript utilizzando il seguente comando:

    ./1-install.sh

    Questo script viene eseguito mvn clean install nella directory corrente. Questo crea l'uber-jar con tutte le dipendenze richieste nella directory. target/

    Esempio 1-install.sh
    mvn clean install
  6. Esegui lo 2-package.shscript utilizzando il seguente comando:

    ./2-package.sh

    Questo script crea la struttura di java/lib directory necessaria per impacchettare correttamente il contenuto del layer. Quindi copia l'uber-jar dalla /target directory nella directory appena creata. java/lib Infine, lo script comprime il contenuto della java directory in un file denominato. layer_content.zip Questo è il file.zip per il livello. È possibile decomprimere il file e verificare che contenga la struttura di file corretta, come mostrato nella Percorsi di livello per i runtime Java sezione.

    Esempio 2-package.sh
    mkdir java mkdir java/lib cp -r target/layer-java-layer-1.0-SNAPSHOT.jar java/lib/ zip -r layer_content.zip java

Creazione del livello

In questa sezione, prendi il layer_content.zip file che hai generato nella sezione precedente e lo carichi come layer Lambda. È possibile caricare un layer utilizzando AWS Management Console o l'API Lambda tramite AWS Command Line Interface ()AWS CLI. Quando caricate il file Layer .zip, nel PublishLayerVersion AWS CLI comando seguente, specificate java21 come runtime compatibile e arm64 come architettura compatibile.

aws lambda publish-layer-version --layer-name java-jackson-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes java21 \ --compatible-architectures "arm64"

Dalla risposta, nota ilLayerVersionArn, che arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1 assomiglia a. Avrai bisogno di questo Amazon Resource Name (ARN) nel passaggio successivo di questo tutorial, quando aggiungi il layer alla tua funzione.

Aggiungere il layer alla tua funzione

In questa sezione, distribuisci una funzione Lambda di esempio che utilizza la libreria Jackson nel suo codice funzione, quindi colleghi il layer. Per distribuire la funzione, è necessario un. Definizione delle autorizzazioni della funzione Lambda con un ruolo di esecuzione Se non disponi di un ruolo di esecuzione esistente, segui i passaggi nella sezione comprimibile. Altrimenti, passa alla sezione successiva per distribuire la funzione.

Per creare un ruolo di esecuzione
  1. Apri la pagina Ruoli nella console IAM.

  2. Scegliere Crea ruolo.

  3. Creare un ruolo con le seguenti proprietà.

    • Trusted entity (Entità attendibileLambda

    • AutorizzazioniAWSLambdaBasicExecutionRole.

    • Nome ruololambda-role.

    La AWSLambdaBasicExecutionRolepolitica dispone delle autorizzazioni necessarie alla funzione per scrivere i log in Logs. CloudWatch

Per distribuire la funzione Lambda
  1. Passa alla directory function/. Se ti trovi attualmente nella layer/ directory, esegui il seguente comando:

    cd ../function
  2. Esamina il codice della funzione. La funzione accetta un input Map<String, String> as e utilizza Jackson per scrivere l'input come stringa JSON prima di convertirlo in un oggetto Java F1Car predefinito. Infine, la funzione utilizza i campi dell'oggetto F1Car per costruire una stringa restituita dalla funzione.

    package example; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Map; public class Handler { public String handleRequest(Map<String, String> input, Context context) throws IOException { // Parse the input JSON ObjectMapper objectMapper = new ObjectMapper(); F1Car f1Car = objectMapper.readValue(objectMapper.writeValueAsString(input), F1Car.class); StringBuilder finalString = new StringBuilder(); finalString.append(f1Car.getDriver()); finalString.append(" is a driver for team "); finalString.append(f1Car.getTeam()); return finalString.toString(); } }
  3. Costruisci il progetto usando il seguente comando Maven:

    mvn package

    Questo comando produce un file JAR nella target/ directory denominata. layer-java-function-1.0-SNAPSHOT.jar

  4. Implementa la funzione. Nel AWS CLI comando seguente, sostituite il --role parametro con il vostro ruolo di esecuzione ARN:

    aws lambda create-function --function-name java_function_with_layer \ --runtime java21 \ --architectures "arm64" \ --handler example.Handler::handleRequest \ --timeout 30 \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://target/layer-java-function-1.0-SNAPSHOT.jar

A questo punto, puoi facoltativamente provare a richiamare la tua funzione prima di collegare il livello. Se provate in questo modo, dovreste ottenere una, ClassNotFoundException perché la vostra funzione non può fare riferimento al pacchetto. requests Per richiamare la tua funzione, usa il seguente AWS CLI comando:

aws lambda invoke --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "driver": "Max Verstappen", "team": "Red Bull" }' response.json

L'output visualizzato dovrebbe essere di questo tipo:

{ "StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST" }

Per visualizzare l'errore specifico, aprite il response.json file di output. Dovresti vedere un messaggio ClassNotFoundException con il seguente messaggio di errore:

"errorMessage":"com.fasterxml.jackson.databind.ObjectMapper","errorType":"java.lang.ClassNotFoundException"

Quindi, collega il livello alla tua funzione. Nel AWS CLI comando seguente, sostituite il --layers parametro con la versione del layer ARN che avete notato in precedenza:

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

Infine, provate a richiamare la vostra funzione usando il seguente comando: AWS CLI

aws lambda invoke --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "driver": "Max Verstappen", "team": "Red Bull" }' response.json

L'output visualizzato dovrebbe essere di questo tipo:

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }

Ciò indica che la funzione è stata in grado di utilizzare la dipendenza Jackson per eseguire correttamente la funzione. È possibile verificare che il response.json file di output contenga la stringa restituita corretta:

"Max Verstappen is a driver for team Red Bull"

Ora è possibile eliminare le risorse create per questo tutorial, a meno che non si voglia conservarle. Eliminando AWS le risorse che non utilizzi più, eviti addebiti inutili ai tuoi Account AWS.

Per eliminare il layer Lambda
  1. Apri la pagina Layers (Livelli) nella console Lambda.

  2. Seleziona il livello che hai creato.

  3. Scegliete Elimina, quindi scegliete nuovamente Elimina.

Per eliminare la funzione Lambda
  1. Aprire la pagina Functions (Funzioni) della console Lambda.

  2. Selezionare la funzione creata.

  3. Scegliere Operazioni, Elimina.

  4. Digita delete nel campo di immissione testo e scegli Delete (Elimina).