Distribuisci funzioni Java Lambda con immagini di container - 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 Java Lambda con immagini di container

Esistono tre modi per creare un'immagine di container per una funzione Lambda in Java:

Suggerimento

Per ridurre il tempo necessario all'attivazione delle funzioni del container Lambda, consulta Utilizzo di compilazioni a più fasi nella documentazione Docker. Per creare immagini di container efficienti, segui le best practice per scrivere file Docker.

Questa pagina spiega come creare, testare e implementare le immagini di container per Lambda.

AWS immagini di base per Java

AWS fornisce le seguenti immagini di base per Java:

Tag Runtime Sistema operativo Dockerfile Definizione come obsoleto

21

Java 21 Amazon Linux 2023 Dockerfile per Java 2.1 su GitHub

Non programmato

17

Java 17 Amazon Linux 2 Dockerfile per Java 17 attivo GitHub

Non pianificato

11

Java 11 Amazon Linux 2 Dockerfile per Java 11 attivo GitHub

Non programmato

8.al2

Java 8 Amazon Linux 2 Dockerfile per Java 8 attivo GitHub

Non programmato

ECRArchivio Amazon: gallery.ecr.aws/lambda/java

Le immagini di base Java 21 e versioni successive si basano sull'immagine container minima di Amazon Linux 2023. Le immagini di base precedenti utilizzavano Amazon Linux 2. AL2023 offre diversi vantaggi rispetto ad Amazon Linux 2, tra cui un ingombro di distribuzione ridotto e versioni aggiornate di librerie come. glibc

AL2Le immagini basate su 023 utilizzano microdnf (symlinked asdnf) come gestore di pacchetti anzichéyum, che è il gestore di pacchetti predefinito in Amazon Linux 2. microdnfè un'implementazione autonoma di. dnf Per un elenco dei pacchetti inclusi nelle immagini AL2 basate su 023, consulta le colonne Minimal Container in Confronto dei pacchetti installati su Amazon Linux 2023 Container Images. Per ulteriori informazioni sulle differenze tra AL2 023 e Amazon Linux 2, consulta la sezione Introduzione al runtime di Amazon Linux 2023 AWS Lambda sul AWS Compute Blog.

Nota

Per eseguire immagini AL2 basate su 023 localmente, incluso with AWS Serverless Application Model (AWS SAM), devi usare Docker versione 20.10.10 o successiva.

Utilizzo di un'immagine di base per Java AWS

Per completare le fasi riportate in questa sezione, è necessario:

Maven
  1. Esegui il comando seguente per creare un progetto Maven utilizzando l'archetipo per Lambda. I parametri seguenti sono obbligatori:

    • service — Il Servizio AWS client da utilizzare nella funzione Lambda. Per un elenco delle fonti disponibili, consulta aws-sdk-java-v2/services on. GitHub

    • region — Il Regione AWS luogo in cui si desidera creare la funzione Lambda.

    • groupId— Lo spazio dei nomi completo del pacchetto dell'applicazione.

    • artifactId— Il nome del tuo progetto. Questo sarà il nome della directory per il progetto.

    In Linux e macOS, esegui questo comando:

    mvn -B archetype:generate \ -DarchetypeGroupId=software.amazon.awssdk \ -DarchetypeArtifactId=archetype-lambda -Dservice=s3 -Dregion=US_WEST_2 \ -DgroupId=com.example.myapp \ -DartifactId=myapp

    In PowerShell, esegui questo comando:

    mvn -B archetype:generate ` "-DarchetypeGroupId=software.amazon.awssdk" ` "-DarchetypeArtifactId=archetype-lambda" "-Dservice=s3" "-Dregion=US_WEST_2" ` "-DgroupId=com.example.myapp" ` "-DartifactId=myapp"

    L'archetipo Maven per Lambda è preconfigurato per la compilazione con Java SE 8 e include una dipendenza da AWS SDK for Java. Se crei il tuo progetto con un archetipo diverso o utilizzando un altro metodo, devi configurare il compilatore Java per Maven e dichiararlo come dipendenza. SDK

  2. Apri la directory myapp/src/main/java/com/example/myapp e cerca il file App.java. Questo è il codice per la funzione Lambda. A fini di test, puoi utilizzare il codice di esempio fornito o sostituirlo con il tuo codice personalizzato.

  3. Torna alla directory principale del progetto e crea un nuovo Dockerfile con la seguente configurazione:

    Nota che l'esempio Dockerfile non include un'USERistruzione. Quando distribuisci un'immagine del contenitore in Lambda, Lambda definisce automaticamente un utente Linux predefinito con le autorizzazioni con privilegi minimi. Questo è diverso dal comportamento standard di Docker, che per impostazione predefinita è l'utente quando non viene fornita alcuna istruzione. root USER

    Esempio Dockerfile
    FROM public.ecr.aws/lambda/java:21 # Copy function code and runtime dependencies from Maven layout COPY target/classes ${LAMBDA_TASK_ROOT} COPY target/dependency/* ${LAMBDA_TASK_ROOT}/lib/ # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "com.example.myapp.App::handleRequest" ]
  4. Compila il progetto e raccogli le dipendenze di runtime.

    mvn compile dependency:copy-dependencies -DincludeScope=runtime
  5. Crea l'immagine Docker con il comando docker build. L'esempio seguente assegna un nome all'immagine docker-image e le assegna il tag test.

    docker build --platform linux/amd64 -t docker-image:test .
    Nota

    Il comando specifica l’opzione --platform linux/amd64 per garantire che il container sia compatibile con l'ambiente di esecuzione di Lambda, indipendentemente dall'architettura della macchina di sviluppo. Se intendi creare una funzione Lambda utilizzando l'architettura del set di ARM64 istruzioni, assicurati di modificare il comando per utilizzare invece l'--platform linux/arm64opzione.

Gradle
  1. Crea una directory per il progetto, quindi passa a quella directory.

    mkdir example cd example
  2. Esegui il comando seguente per fare in modo che Gradle generi un nuovo progetto di applicazione Java nella directory example dell'ambiente. Per Select build script DSL, scegliete 2: Groovy.

    gradle init --type java-application
  3. Apri la directory /example/app/src/main/java/example e cerca il file App.java. Questo è il codice per la funzione Lambda. A fini di test, puoi utilizzare il codice di esempio seguente o sostituirlo con il tuo codice personalizzato.

    Esempio App.java
    package com.example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; public class App implements RequestHandler<Object, String> { public String handleRequest(Object input, Context context) { return "Hello world!"; } }
  4. Apri il file build.gradle. Se stai utilizzando il codice della funzione di esempio del passaggio precedente, sostituisci il contenuto di build.gradle con il seguente. Se utilizzi un codice di funzione personalizzato, modifica il file build.gradle secondo necessità.

    Esempio build.gradle (Groovy) DSL
    plugins { id 'java' } group 'com.example' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' } jar { manifest { attributes 'Main-Class': 'com.example.App' } }
  5. Il comando gradle init del passaggio 2 ha anche generato un caso di test fittizio nella directory app/test. Ai fini di questo tutorial, salta l'esecuzione dei test eliminando la directory /test.

  6. Compilare il progetto.

    gradle build
  7. Nella directory root del progetto (/example), crea un Dockerfile con la seguente configurazione:

    Nota che l'esempio Dockerfile non include un'istruzione. USER Quando distribuisci un'immagine del contenitore in Lambda, Lambda definisce automaticamente un utente Linux predefinito con le autorizzazioni con privilegi minimi. Questo è diverso dal comportamento standard di Docker, che per impostazione predefinita è l'utente quando non viene fornita alcuna istruzione. root USER

    Esempio Dockerfile
    FROM public.ecr.aws/lambda/java:21 # Copy function code and runtime dependencies from Gradle layout COPY app/build/classes/java/main ${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "com.example.App::handleRequest" ]
  8. Crea l'immagine Docker con il comando docker build. L'esempio seguente assegna un nome all'immagine docker-image e le assegna il tag test.

    docker build --platform linux/amd64 -t docker-image:test .
    Nota

    Il comando specifica l’opzione --platform linux/amd64 per garantire che il container sia compatibile con l'ambiente di esecuzione di Lambda, indipendentemente dall'architettura della macchina di sviluppo. Se intendi creare una funzione Lambda utilizzando l'architettura del set di ARM64 istruzioni, assicurati di modificare il comando per utilizzare invece l'--platform linux/arm64opzione.

  1. Avvia l'immagine Docker con il comando docker run. In questo esempio, docker-image è il nome dell'immagine e test è il tag.

    docker run --platform linux/amd64 -p 9000:8080 --read-only docker-image:test

    Questo comando esegue l'immagine come container e crea un endpoint locale in localhost:9000/2015-03-31/functions/function/invocations.

    Nota

    Se hai creato l'immagine Docker per l'architettura del set di ARM64 istruzioni, assicurati di utilizzare l'--platform linux/arm64opzione invece di. --platform linux/amd64

  2. Da una nuova finestra di terminale, invia un evento all'endpoint locale.

    Linux/macOS

    Su MacOS o Linux, esegui il comando seguente curl:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Questo comando richiama la funzione con un evento vuoto e restituisce una risposta. Se utilizzi il tuo codice di funzione anziché il codice di funzione di esempio, potresti voler richiamare la funzione con un JSON payload. Esempio:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    In PowerShell, esegui il seguente Invoke-WebRequest comando:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    Questo comando richiama la funzione con un evento vuoto e restituisce una risposta. Se utilizzi il tuo codice di funzione anziché il codice di funzione di esempio, potresti voler richiamare la funzione con un JSON payload. Esempio:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  3. Ottieni l'ID del container.

    docker ps
  4. Utilizza il comando docker kill per arrestare il container. In questo comando, sostituisci 3766c4ab331c con l'ID del container del passaggio precedente.

    docker kill 3766c4ab331c
Per caricare l'immagine su Amazon ECR e creare la funzione Lambda
  1. Esegui il get-login-passwordcomando per autenticare il Docker nel CLI tuo registro AmazonECR.

    • Imposta il --region valore nel Regione AWS punto in cui desideri creare il ECR repository Amazon.

    • 111122223333Sostituiscilo con il tuo Account AWS ID.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. Crea un repository in Amazon ECR utilizzando il comando create-repository.

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    Nota

    Il ECR repository Amazon deve corrispondere alla funzione Regione AWS Lambda.

    In caso di esito positivo, dovresti ottenere una risposta simile a questa:

    { "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
  3. Copia il repositoryUri dall'output del passaggio precedente.

  4. Esegui il comando docker tag per taggare la tua immagine locale nel tuo ECR repository Amazon come versione più recente. In questo comando:

    • docker-image:testè il nome e il tag della tua immagine Docker. Si tratta del nome e del tag dell'immagine che hai specificato nel docker build comando.

    • Sostituisci l’<ECRrepositoryUri> con l’repositoryUri copiato. Assicurati di includere :latest alla fine diURI.

    docker tag docker-image:test <ECRrepositoryUri>:latest

    Esempio:

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. Esegui il comando docker push per distribuire l'immagine locale nel repository Amazon. ECR Assicurati di includerla alla :latest fine del repository. URI

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  6. Crea un ruolo di esecuzione per la funzione, se non lo hai già fatto. Nella fase successiva è necessario l'Amazon Resource Name (ARN) del ruolo.

  7. Creazione della funzione Lambda PerImageUri, specifica il repository URI di cui hai parlato in precedenza. Assicurati di includere :latest alla fine di. URI

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    Nota

    È possibile creare una funzione utilizzando un'immagine in un AWS account diverso, purché l'immagine si trovi nella stessa regione della funzione Lambda. Per ulteriori informazioni, consulta Autorizzazioni Amazon ECR per più account.

  8. Richiama la funzione.

    aws lambda invoke --function-name hello-world response.json

    Dovresti ottenere una risposta simile a questa:

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. Per vedere l'output della funzione, controlla il file response.json.

Per aggiornare il codice della funzione, devi creare nuovamente l'immagine, caricare la nuova immagine nel ECR repository Amazon e quindi utilizzare il update-function-codecomando per distribuire l'immagine nella funzione Lambda.

Lambda risolve il tag image in un digest di immagini specifico. Ciò significa che se punti il tag image utilizzato per distribuire la funzione su una nuova immagine in AmazonECR, Lambda non aggiorna automaticamente la funzione per utilizzare la nuova immagine.

Per distribuire la nuova immagine nella stessa funzione Lambda, devi usare update-function-codeil comando, anche se il tag dell'immagine in ECR Amazon rimane lo stesso. Nell'esempio seguente, l'--publishopzione crea una nuova versione della funzione utilizzando l'immagine del contenitore aggiornata.

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish

Utilizzo di un'immagine di base alternativa con il client di interfaccia di runtime

Se utilizzi un'immagine di base solo per il sistema operativo o un'immagine di base alternativa, devi includere il client dell'interfaccia di runtime nell'immagine. Il client dell'interfaccia di runtime estende l'Utilizzo del runtime Lambda API per runtime personalizzati, che gestisce l'interazione tra Lambda e il codice della funzione.

Installa il client di interfaccia di runtime per Java nel tuo Dockerfile o come dipendenza nel tuo progetto. Ad esempio, per installare il client di interfaccia di runtime utilizzando il gestore di pacchetti Maven, aggiungi quanto segue al file pom.xml:

<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency>

Per i dettagli del pacchetto, consulta la pagina Client di interfaccia di runtime AWS Lambda Java nel Maven Central Repository. È inoltre possibile esaminare il codice sorgente del client dell'interfaccia di runtime nel GitHub repository AWS Lambda Java Support Libraries.

L'esempio seguente dimostra come creare un'immagine di container per Java utilizzando un'immagine Amazon Corretto. Amazon Corretto è una distribuzione gratuita, multipiattaforma e pronta per la produzione dell'Open Java Development Kit (Open). JDK Il progetto Maven include il client di interfaccia di runtime come dipendenza.

Per completare le fasi riportate in questa sezione, è necessario:

  1. Crea un progetto Maven. I parametri seguenti sono obbligatori:

    • groupId— Lo spazio dei nomi completo del pacchetto dell'applicazione.

    • artifactId— Il nome del tuo progetto. Questo sarà il nome della directory per il progetto.

    Linux/macOS
    mvn -B archetype:generate \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DgroupId=example \ -DartifactId=myapp \ -DinteractiveMode=false
    PowerShell
    mvn -B archetype:generate ` -DarchetypeArtifactId=maven-archetype-quickstart ` -DgroupId=example ` -DartifactId=myapp ` -DinteractiveMode=false
  2. Apri la directory del progetto.

    cd myapp
  3. Apri il file pom.xml e sostituisci il contenuto con quanto riportato di seguito. Questo file include aws-lambda-java-runtime-interface-client come dipendenza. In alternativa, è possibile installare il client di interfaccia di runtime nel Dockerfile. Tuttavia, l'approccio più semplice consiste nell'includere la libreria come dipendenza.

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>example</groupId> <artifactId>hello-lambda</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>hello-lambda</name> <url>http://maven.apache.org</url> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.2</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
  4. Apri la directory myapp/src/main/java/com/example/myapp e cerca il file App.java. Questo è il codice per la funzione Lambda. Sostituisci il codice con il seguente.

    Esempio gestore della funzione
    package example; public class App { public static String sayHello() { return "Hello world!"; } }
  5. Il comando mvn -B archetype:generate del passaggio 1 ha anche generato un test case fittizio nella directory src/test. Ai fini di questo tutorial, salta l'esecuzione dei test eliminando la directory /test generata interamente.

  6. Torna alla directory principale del progetto e crea un nuovo Dockerfile. Il Dockerfile di esempio seguente utilizza un'immagine Amazon Corretto. Amazon Corretto è una distribuzione gratuita, multipiattaforma e pronta per la produzione di Open. JDK

    • Imposta la FROM proprietà sull'immagine URI di base.

    • Imposta l'ENTRYPOINT sul modulo su cui desideri che il container Docker venga eseguito all'avvio. In questo caso, il modulo è il client di interfaccia di runtime.

    • Imposta l'argomento CMD specificando il gestore della funzione Lambda.

    Nota che l'esempio Dockerfile non include un'USERistruzione. Quando distribuisci un'immagine del contenitore in Lambda, Lambda definisce automaticamente un utente Linux predefinito con le autorizzazioni con privilegi minimi. Questo è diverso dal comportamento standard di Docker, che per impostazione predefinita è l'utente quando non viene fornita alcuna istruzione. root USER

    Esempio Dockerfile
    FROM public.ecr.aws/amazoncorretto/amazoncorretto:21 as base # Configure the build environment FROM base as build RUN yum install -y maven WORKDIR /src # Cache and copy dependencies ADD pom.xml . RUN mvn dependency:go-offline dependency:copy-dependencies # Compile the function ADD . . RUN mvn package # Copy the function artifact and dependencies onto a clean base FROM base WORKDIR /function COPY --from=build /src/target/dependency/*.jar ./ COPY --from=build /src/target/*.jar ./ # Set runtime interface client as default command for the container runtime ENTRYPOINT [ "/usr/bin/java", "-cp", "./*", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda" ] # Pass the name of the function handler as an argument to the runtime CMD [ "example.App::sayHello" ]
  7. Crea l'immagine Docker con il comando docker build. L'esempio seguente assegna un nome all'immagine docker-image e le assegna il tag test.

    docker build --platform linux/amd64 -t docker-image:test .
    Nota

    Il comando specifica l’opzione --platform linux/amd64 per garantire che il container sia compatibile con l'ambiente di esecuzione di Lambda, indipendentemente dall'architettura della macchina di sviluppo. Se intendi creare una funzione Lambda utilizzando l'architettura del set di ARM64 istruzioni, assicurati di modificare il comando per utilizzare invece l'--platform linux/arm64opzione.

Usa il simulatore dell'interfaccia di runtime per testare localmente l'immagine. Puoi creare l'emulatore nell'immagine o utilizzare la seguente procedura per installarlo sul tuo computer locale.

Installazione ed esecuzione dell'emulatore di interfaccia di runtime sul computer locale
  1. Dalla directory del progetto, esegui il comando seguente per scaricare l'emulatore di interfaccia di runtime (architettura x86-64) GitHub e installarlo sul computer locale.

    Linux/macOS
    mkdir -p ~/.aws-lambda-rie && \ curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \ chmod +x ~/.aws-lambda-rie/aws-lambda-rie

    Per installare l'emulatore arm64, sostituisci il GitHub repository URL nel comando precedente con quanto segue:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
    PowerShell
    $dirPath = "$HOME\.aws-lambda-rie" if (-not (Test-Path $dirPath)) { New-Item -Path $dirPath -ItemType Directory } $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie" $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie" Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath

    Per installare l'emulatore arm64, sostituisci $downloadLink con quanto segue:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
  2. Avvia l'immagine Docker con il comando docker run. Tieni presente quanto segue:

    • docker-image è il nome dell'immagine e test è il tag.

    • /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello è l'ENTRYPOINT seguito dal CMD del Dockerfile.

    Linux/macOS
    docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \ --entrypoint /aws-lambda/aws-lambda-rie \ --read-only \ docker-image:test \ /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello
    PowerShell
    docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 ` --entrypoint /aws-lambda/aws-lambda-rie ` --read-only ` docker-image:test ` /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello

    Questo comando esegue l'immagine come container e crea un endpoint locale in localhost:9000/2015-03-31/functions/function/invocations.

    Nota

    Se hai creato l'immagine Docker per l'architettura del set di ARM64 istruzioni, assicurati di utilizzare l'--platform linux/arm64opzione invece di. --platform linux/amd64

  3. Pubblica un evento nell'endpoint locale.

    Linux/macOS

    Su MacOS o Linux, esegui il comando seguente curl:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Questo comando richiama la funzione con un evento vuoto e restituisce una risposta. Se utilizzi il tuo codice di funzione anziché il codice di funzione di esempio, potresti voler richiamare la funzione con un JSON payload. Esempio:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    In PowerShell, esegui il seguente Invoke-WebRequest comando:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    Questo comando richiama la funzione con un evento vuoto e restituisce una risposta. Se utilizzi il tuo codice di funzione anziché il codice di funzione di esempio, potresti voler richiamare la funzione con un JSON payload. Esempio:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  4. Ottieni l'ID del container.

    docker ps
  5. Utilizza il comando docker kill per arrestare il container. In questo comando, sostituisci 3766c4ab331c con l'ID del container del passaggio precedente.

    docker kill 3766c4ab331c
Per caricare l'immagine su Amazon ECR e creare la funzione Lambda
  1. Esegui il get-login-passwordcomando per autenticare il Docker nel CLI tuo registro AmazonECR.

    • Imposta il --region valore nel Regione AWS punto in cui desideri creare il ECR repository Amazon.

    • 111122223333Sostituiscilo con il tuo Account AWS ID.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. Crea un repository in Amazon ECR utilizzando il comando create-repository.

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    Nota

    Il ECR repository Amazon deve corrispondere alla funzione Regione AWS Lambda.

    In caso di esito positivo, dovresti ottenere una risposta simile a questa:

    { "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
  3. Copia il repositoryUri dall'output del passaggio precedente.

  4. Esegui il comando docker tag per taggare la tua immagine locale nel tuo ECR repository Amazon come versione più recente. In questo comando:

    • docker-image:testè il nome e il tag della tua immagine Docker. Si tratta del nome e del tag dell'immagine che hai specificato nel docker build comando.

    • Sostituisci l’<ECRrepositoryUri> con l’repositoryUri copiato. Assicurati di includere :latest alla fine diURI.

    docker tag docker-image:test <ECRrepositoryUri>:latest

    Esempio:

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. Esegui il comando docker push per distribuire l'immagine locale nel repository Amazon. ECR Assicurati di includerla alla :latest fine del repository. URI

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  6. Crea un ruolo di esecuzione per la funzione, se non lo hai già fatto. Nella fase successiva è necessario l'Amazon Resource Name (ARN) del ruolo.

  7. Creazione della funzione Lambda PerImageUri, specifica il repository URI di cui hai parlato in precedenza. Assicurati di includere :latest alla fine di. URI

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    Nota

    È possibile creare una funzione utilizzando un'immagine in un AWS account diverso, purché l'immagine si trovi nella stessa regione della funzione Lambda. Per ulteriori informazioni, consulta Autorizzazioni Amazon ECR per più account.

  8. Richiama la funzione.

    aws lambda invoke --function-name hello-world response.json

    Dovresti ottenere una risposta simile a questa:

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. Per vedere l'output della funzione, controlla il file response.json.

Per aggiornare il codice della funzione, devi creare nuovamente l'immagine, caricare la nuova immagine nel ECR repository Amazon e quindi utilizzare il update-function-codecomando per distribuire l'immagine nella funzione Lambda.

Lambda risolve il tag image in un digest di immagini specifico. Ciò significa che se punti il tag image utilizzato per distribuire la funzione su una nuova immagine in AmazonECR, Lambda non aggiorna automaticamente la funzione per utilizzare la nuova immagine.

Per distribuire la nuova immagine nella stessa funzione Lambda, devi usare update-function-codeil comando, anche se il tag dell'immagine in ECR Amazon rimane lo stesso. Nell'esempio seguente, l'--publishopzione crea una nuova versione della funzione utilizzando l'immagine del contenitore aggiornata.

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish