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:
-
Package del contenuto del layer. Ciò significa creare un archivio di file.zip che contenga le dipendenze da utilizzare nelle funzioni.
-
Crea il livello in Lambda.
-
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.
Argomenti
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-java
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
-
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
-
Vai alla
layer
directory dell'app dilayer-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
-
Esaminate il
pom.xml
file. Nella <dependencies>
sezione, definisci le dipendenze che desideri includere nel layer, vale a dire lejackson-databind
librerieaws-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 questopom.xml
file contiene due plugin. maven-compiler-pluginCompila il codice sorgente. Quindi maven-shade-plugin impacchetta i tuoi artefatti in un unico uber-jar. -
Assicurati di disporre delle autorizzazioni per eseguire entrambi gli script.
chmod 744 1-install.sh && chmod 744 2-package.sh
-
Esegui lo
1-install.sh
script 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
-
Esegui lo
2-package.sh
script 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 dellajava
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:
assomiglia a. Avrai bisogno di questo Amazon Resource Name (ARN) nel passaggio successivo di questo tutorial, quando aggiungi il layer alla tua funzione.123456789012
:layer:java-jackson-layer:1
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
-
Apri la pagina Ruoli
nella console IAM. -
Scegliere Crea ruolo.
-
Creare un ruolo con le seguenti proprietà.
-
Trusted entity (Entità attendibile – Lambda
-
Autorizzazioni — AWSLambdaBasicExecutionRole.
-
Nome ruolo –
lambda-role
.
La AWSLambdaBasicExecutionRolepolitica dispone delle autorizzazioni necessarie alla funzione per scrivere i log in Logs. CloudWatch
-
Per distribuire la funzione Lambda
-
Passa alla directory
function/
. Se ti trovi attualmente nellalayer/
directory, esegui il seguente comando:cd ../function
-
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 F1Carpredefinito. 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(); } }
-
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
-
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
-
Apri la pagina Layers
(Livelli) nella console Lambda. -
Seleziona il livello che hai creato.
-
Scegliete Elimina, quindi scegliete nuovamente Elimina.
Per eliminare la funzione Lambda
-
Aprire la pagina Functions (Funzioni)
della console Lambda. -
Selezionare la funzione creata.
-
Scegliere Operazioni, Elimina.
-
Digita
delete
nel campo di immissione testo e scegli Delete (Elimina).