

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Création de fonctions Lambda avec Java
<a name="lambda-java"></a>

Vous pouvez exécuter du code Java dans AWS Lambda. Lambda fournit des [runtimes](lambda-runtimes.md) pour Java qui exécutent votre code afin de traiter des événements. Votre code s'exécute dans un environnement Amazon Linux qui inclut les AWS informations d'identification d'un rôle Gestion des identités et des accès AWS (IAM) que vous gérez.

Lambda prend en charge les environnements d’exécution Java suivants.<a name="java-runtimes"></a>


| Name | Identifiant | Système d’exploitation | Date d’obsolescence | Créer la fonction de blocage | Mettre à jour la fonction de blocage | 
| --- | --- | --- | --- | --- | --- | 
|  Java 25  |  `java25`  |  Amazon Linux 2023  |   30 juin 2029   |   31 juillet 2029   |   31 août 2029   | 
|  Java 21  |  `java21`  |  Amazon Linux 2023  |   30 juin 2029   |   31 juillet 2029   |   31 août 2029   | 
|  Java 17  |  `java17`  |  Amazon Linux 2  |   30 juin 2027   |   31 juillet 2027   |   31 août 2027   | 
|  Java 11  |  `java11`  |  Amazon Linux 2  |   30 juin 2027   |   31 juillet 2027   |   31 août 2027   | 
|  Java 8  |  `java8.al2`  |  Amazon Linux 2  |   30 juin 2027   |   31 juillet 2027   |   31 août 2027   | 

AWS fournit les bibliothèques suivantes pour les fonctions Java. Ces bibliothèques sont disponibles via le [Référentiel central Maven](https://search.maven.org/search?q=g:com.amazonaws).
+ [com.amazonaws : aws-lambda-java-core](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-core) (obligatoire) — Définit les interfaces des méthodes du gestionnaire et l'objet de contexte que le moteur d'exécution transmet au gestionnaire. Si vous définissez vos propres types d’entrée, c’est la seule bibliothèque dont vous avez besoin.
+ [com.amazonaws : aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-events) — Types d'entrée pour les événements provenant de services qui invoquent des fonctions Lambda.
+ [com.amazonaws : aws-lambda-java-log 4j2](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-log4j2) [— Une bibliothèque d'ajout pour Apache Log4j 2 que vous pouvez utiliser pour ajouter l'ID de demande pour l'appel en cours dans vos journaux de fonctions.](java-logging.md)
+ [AWS SDK pour Java](https://github.com/aws/aws-sdk-java-v2) 2.0 — Le SDK AWS officiel pour le langage de programmation Java.

Ajoutez ces bibliothèques à votre définition de build comme suit :

------
#### [ Gradle ]

```
dependencies {
    implementation 'com.amazonaws:aws-lambda-java-core:1.2.2'
    implementation 'com.amazonaws:aws-lambda-java-events:3.11.1'
    runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.1'
}
```

------
#### [ Maven ]

```
  <dependencies>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.2.2</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-events</artifactId>
      <version>3.11.1</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-log4j2</artifactId>
      <version>1.5.1</version>
    </dependency>
  </dependencies>
```

------

**Important**  
N'utilisez pas de composants privés de l'API JDK, tels que des champs privés, des méthodes ou des classes. Les composants d'API non publics peuvent être modifiés ou supprimés dans n'importe quelle mise à jour, ce qui peut entraîner l'interruption de votre application.

**Pour créer une fonction Java**

1. Ouvrez la [console Lambda](https://console.aws.amazon.com/lambda).

1. Sélectionnez **Créer une fonction**.

1. Configurez les paramètres suivants :
   + **Nom de la fonction** : saisissez le nom de la fonction.
   + **Runtime** : Choisissez **Java 25**.

1. Choisissez **Créer une fonction**.

La console crée une fonction Lambda avec une classe de gestionnaire nommée `Hello`. Étant donné que Java est un langage compilé, vous ne pouvez pas afficher ou modifier le code source dans la console Lambda, mais vous pouvez modifier sa configuration, l’invoquer et configurer des déclencheurs.

**Note**  
Pour démarrer le développement d'applications dans votre environnement local, déployez l'un des [exemples d'applications](java-samples.md) disponibles dans le GitHub référentiel de ce guide.

La classe `Hello` comporte une fonction nommée `handleRequest` qui accepte un objet d’événement et un objet de contexte. Il s’agit de la [fonction de gestionnaire](java-handler.md) que Lambda appelle lors de l’invocation de la fonction. Le runtime de la fonction Java obtient les événements d’invocations à partir de Lambda et les transmet au gestionnaire. Dans la configuration de fonction, la valeur de gestionnaire est `example.Hello::handleRequest`.

Pour mettre à jour le code de la fonction, vous créez un package de déploiement, qui est une archive .zip contenant le code de votre fonction. Au fur et à mesure du développement de votre fonction, nous vous conseillons de stocker le code de votre fonction dans le contrôle de code source, d’ajouter des bibliothèques et d’automatiser les déploiements. Commencez par [créer un package de déploiement](java-package.md) et mettre à jour votre code dans la ligne de commande.

Le runtime de la fonction transmet un objet de contexte au gestionnaire, en plus de l’événement d’invocation. L’[objet de contexte](java-context.md) contient des informations supplémentaires sur l’invocation, la fonction et l’environnement d’exécution. Des informations supplémentaires sont disponibles dans les variables d’environnement.

Votre fonction Lambda est fournie avec un groupe de CloudWatch journaux Logs. La fonction runtime envoie les détails de chaque appel à CloudWatch Logs. Il relaie tous les [journaux que votre fonction génère](java-logging.md) pendant l’invocation. Si votre fonction renvoie une erreur, Lambda met en forme l’erreur et la renvoie à l’appelant.

**Topics**
+ [Définition du gestionnaire de fonction Lambda dans Java](java-handler.md)
+ [Déployer des fonctions Lambda en Java avec des archives de fichiers .zip ou JAR](java-package.md)
+ [Déployer des fonctions Lambda en Java avec des images conteneurs](java-image.md)
+ [Utilisation de couches pour les fonctions Lambda Java](java-layers.md)
+ [Personnalisation de la sérialisation pour les fonctions Lambda Java](java-custom-serialization.md)
+ [Personnalisation du comportement de démarrage de l’environnement d’exécution Java pour les fonctions Lambda](java-customization.md)
+ [Utilisation de l’objet de contexte Lambda pour récupérer les informations de la fonction Java](java-context.md)
+ [Journalisation et surveillance des fonctions Lambda Java](java-logging.md)
+ [Instrumentation du code Java dans AWS Lambda](java-tracing.md)
+ [Exemples d'applications Java pour AWS Lambda](java-samples.md)

# Définition du gestionnaire de fonction Lambda dans Java
<a name="java-handler"></a>

Le *gestionnaire* de fonction Lambda est la méthode dans votre code de fonction qui traite les événements. Lorsque votre fonction est invoquée, Lambda exécute la méthode du gestionnaire. Votre fonction s’exécute jusqu’à ce que le gestionnaire renvoie une réponse, se ferme ou expire.

Cette page explique comment utiliser les gestionnaires de fonctions Lambda dans Java, notamment des options pour la configuration du projet, les conventions de dénomination et les pratiques exemplaires. Cette page inclut également un exemple de fonction Lambda Java qui collecte des informations relatives à une commande, produit un reçu sous forme de fichier texte et place ce fichier dans un compartiment Amazon Simple Storage Service (Amazon S3). Pour plus d’informations sur le déploiement de votre fonction après l’avoir écrite, consultez [Déployer des fonctions Lambda en Java avec des archives de fichiers .zip ou JAR](java-package.md) ou [Déployer des fonctions Lambda en Java avec des images conteneurs](java-image.md).

**Topics**
+ [Configuration de votre projet de gestionnaire Java](#java-handler-setup)
+ [Exemple de code de fonction Lambda Java](#java-example-code)
+ [Définitions de classe valides pour les gestionnaires Java](#java-handler-signatures)
+ [Convention de nommage du gestionnaire](#java-example-naming)
+ [Définition et accès à l’objet d’événement d’entrée](#java-handler-input)
+ [Accès et utilisation de l’objet de contexte Lambda](#java-example-context)
+ [Utilisation du SDK AWS pour Java  v2 dans votre gestionnaire](#java-example-sdk-usage)
+ [Accès aux variables d’environnement](#java-example-envvars)
+ [Utilisation de l'état global](#java-handler-state)
+ [Pratiques exemplaires en matière de code pour les fonctions Lambda Java](#java-best-practices)

## Configuration de votre projet de gestionnaire Java
<a name="java-handler-setup"></a>

Lorsque vous utilisez des fonctions Lambda en Java, le processus consiste à écrire votre code, à le compiler et à déployer les artefacts compilés sur Lambda. Vous pouvez initialiser un projet Java Lambda de différentes manières. Par exemple, vous pouvez utiliser des outils comme l’[archétype Maven pour les fonctions Lambda,](https://github.com/aws/aws-sdk-java-v2/tree/master/archetypes/archetype-lambda) la [commande AWS SAM CLI sam init](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-init.html) ou même une configuration de projet Java standard dans votre IDE préféré, comme IntelliJ IDEA ou Visual Studio Code. Vous pouvez également créer manuellement la structure de fichiers requise.

Un projet de fonction Lambda Java typique suit cette structure générale :

```
/project-root
    └ src
        └ main
            └ java
                └ example
                    └ OrderHandler.java (contains main handler)
                    └ <other_supporting_classes>
     └ build.gradle OR pom.xml
```

Vous pouvez utiliser Maven ou Gradle pour créer votre projet et gérer les dépendances.

La logique de gestion principale de votre fonction réside dans un fichier Java situé sous le répertoire `src/main/java/example`. Dans l’exemple présenté sur cette page, nous nommons ce fichier `OrderHandler.java`. Outre ce fichier, vous pouvez inclure des classes Java supplémentaires selon vos besoins. Lorsque vous déployez votre fonction sur Lambda, assurez-vous de spécifier la classe Java qui contient la méthode de gestion principale que Lambda doit invoquer lors d’une invocation.

## Exemple de code de fonction Lambda Java
<a name="java-example-code"></a>

L’exemple de code de fonction Lambda Java 21 suivant prend en compte les informations relatives à une commande, produit un reçu sous forme de fichier texte et place ce fichier dans un compartiment Amazon S3.

**Example `OrderHandler.java`Fonction Lambda**  

```
package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;

import java.nio.charset.StandardCharsets;

/**
 * Lambda handler for processing orders and storing receipts in S3.
 */
public class OrderHandler implements RequestHandler<OrderHandler.Order, String> {

    private static final S3Client S3_CLIENT = S3Client.builder().build();

    /**
     * Record to model the input event.
     */
    public record Order(String orderId, double amount, String item) {}

    @Override
    public String handleRequest(Order event, Context context) {
        try {
            // Access environment variables
            String bucketName = System.getenv("RECEIPT_BUCKET");
            if (bucketName == null || bucketName.isEmpty()) {
                throw new IllegalArgumentException("RECEIPT_BUCKET environment variable is not set");
            }

            // Create the receipt content and key destination
            String receiptContent = String.format("OrderID: %s\nAmount: $%.2f\nItem: %s",
                    event.orderId(), event.amount(), event.item());
            String key = "receipts/" + event.orderId() + ".txt";

            // Upload the receipt to S3
            uploadReceiptToS3(bucketName, key, receiptContent);

            context.getLogger().log("Successfully processed order " + event.orderId() +
                    " and stored receipt in S3 bucket " + bucketName);
            return "Success";

        } catch (Exception e) {
            context.getLogger().log("Failed to process order: " + e.getMessage());
            throw new RuntimeException(e);
        }
    }

    private void uploadReceiptToS3(String bucketName, String key, String receiptContent) {
        try {
            PutObjectRequest putObjectRequest = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(key)
                    .build();

            // Convert the receipt content to bytes and upload to S3
            S3_CLIENT.putObject(putObjectRequest, RequestBody.fromBytes(receiptContent.getBytes(StandardCharsets.UTF_8)));
        } catch (S3Exception e) {
            throw new RuntimeException("Failed to upload receipt to S3: " + e.awsErrorDetails().errorMessage(), e);
        }
    }
}
```

Ce fichier `OrderHandler.java` comprend les sections suivantes :
+ `package example` : en Java, cela peut être n’importe quoi, mais cela doit correspondre à la structure de répertoires de votre projet. Ici, nous utilisons `package example`, car la structure de répertoires est `src/main/java/example`.
+ Instructions `import` : utilisez ces instructions pour importer les classes Java que votre fonction Lambda nécessite.
+ `public class OrderHandler ...` : définit votre classe Java et doit être une [définition de classe valide](#java-handler-signatures).
+ `private static final S3Client S3_CLIENT ...` : initialise un client S3 en dehors de l’une des méthodes de la classe. Cela oblige Lambda à exécuter ce code pendant la [phase d’initialisation](lambda-runtime-environment.md#runtimes-lifecycle-ib).
+ `public record Order ...` : définissez la forme de l’événement d’entrée attendu dans cet [enregistrement](https://openjdk.org/jeps/395) Java personnalisé.
+ `public String handleRequest(Order event, Context context)` : il s’agit de la **méthode de gestion principale**, qui contient la logique principale de votre application.
+ `private void uploadReceiptToS3(...) {}` : il s’agit d’une méthode auxiliaire référencée par la méthode de gestion principale `handleRequest`.

### Exemples de fichiers build.gradle et pom.xml
<a name="java-gradle-maven-example"></a>

Le fichier `build.gradle` ou `pom.xml` suivant accompagne cette fonction.

------
#### [ build.gradle ]

```
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.amazonaws:aws-lambda-java-core:1.2.3'
    implementation 'software.amazon.awssdk:s3:2.28.29'
    implementation 'org.slf4j:slf4j-nop:2.0.16'
}

task buildZip(type: Zip) {
    from compileJava
    from processResources
    into('lib') {
        from configurations.runtimeClasspath
    }
}

java {
    sourceCompatibility = JavaVersion.VERSION_21
    targetCompatibility = JavaVersion.VERSION_21
}

build.dependsOn buildZip
```

------
#### [ pom.xml ]

```
<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>com.example</groupId>
    <artifactId>example-java</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>example-java-function</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
            <version>2.28.29</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>2.0.16</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.5.2</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.4.1</version>
                <configuration>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*</exclude>
                                <exclude>META-INF/versions/**</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version>
                <configuration>
                    <release>21</release>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
```

------

Pour que cette fonction fonctionne correctement, son [rôle d’exécution](lambda-intro-execution-role.md) doit autoriser l’action `s3:PutObject`. Assurez-vous également de définir la variable d’environnement `RECEIPT_BUCKET`. Après une invocation réussie, le compartiment Amazon S3 doit contenir un fichier de reçu.

**Note**  
Cette fonction peut nécessiter des paramètres de configuration supplémentaires pour s’exécuter correctement sans expiration de délai. Nous recommandons de configurer 256 Mo de mémoire et un délai d’attente de 10 secondes. La première invocation peut prendre plus de temps en raison d’un [démarrage à froid](lambda-runtime-environment.md#cold-start-latency). Les invocations suivantes devraient s’exécuter beaucoup plus rapidement en raison de la réutilisation de l’environnement d’exécution.

## Définitions de classe valides pour les gestionnaires Java
<a name="java-handler-signatures"></a>

Pour définir votre classe, la bibliothèque [aws-lambda-java-core](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-core) définit deux interfaces pour les méthodes du gestionnaire. Utilisez les interfaces fournies pour simplifier la configuration du gestionnaire et valider la signature de la méthode au moment de la compilation.
+ [ com.amazonaws.services.lambda.runtime.RequestHandler](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/RequestHandler.java)
+ [ com.amazonaws.services.lambda.runtime.RequestStreamHandler](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/RequestStreamHandler.java)

L’interface `RequestHandler` est un type générique qui prend deux paramètres : le type d’entrée et le type de sortie. Les deux types doivent être des objets. Dans cet exemple, notre classe `OrderHandler` implémente `RequestHandler<OrderHandler.Order, String>`. Le type d’entrée est l’enregistrement `Order` que nous définissons dans la classe, et le type de sortie est `String`.

```
public class OrderHandler implements RequestHandler<OrderHandler.Order, String> {
    ...
}
```

Lorsque vous utilisez cette interface, le moteur d’exécution Java désérialise l’événement dans l’objet avec le type d’entrée et sérialise la sortie en texte. Utilisez cette interface lorsque la sérialisation intégrée fonctionne avec vos types d’entrée et de sortie.

Pour utiliser votre propre sérialisation, vous pouvez implémenter l’interface `RequestStreamHandler`. Avec cette interface, Lambda transmet à votre gestionnaire un flux d’entrée et un flux de sortie. Le gestionnaire lit les octets du flux d’entrée, écrit dans le flux de sortie et renvoie une valeur vide. Pour un exemple d’utilisation de l’environnement d’exécution Java 21, consultez [HandlerStream.java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-basic/src/main/java/example/HandlerStream.java).

Si vous travaillez uniquement avec des types de base et génériques (c’est-à-dire `String`, `Integer`, `List` ou `Map`) dans votre fonction Java, vous n’avez pas besoin d’implémenter d’interface. Par exemple, si votre fonction prend une entrée `Map<String, String>` et renvoie une valeur `String`, votre définition de classe et votre signature de gestionnaire peuvent ressembler à ce qui suit :

```
public class ExampleHandler {
    public String handleRequest(Map<String, String> input, Context context) {
        ...
    }
}
```

De plus, lorsque vous n’implémentez pas d’interface, l’objet de [contexte](java-context.md) est facultatif. Par exemple, votre définition de classe et votre signature de gestionnaire peuvent ressembler à ce qui suit :

```
public class NoContextHandler {
   public String handleRequest(Map<String, String> input) {
        ...
   }
}
```

## Convention de nommage du gestionnaire
<a name="java-example-naming"></a>

Pour les fonctions Lambda en Java, si vous implémentez l’interface `RequestHandler` ou `RequestStreamHandler`, la méthode de votre gestionnaire principal doit être nommée `handleRequest`. Incluez également la balise `@Override` au-dessus de votre méthode `handleRequest`. Lorsque vous déployez votre fonction sur Lambda, spécifiez le gestionnaire principal dans la configuration de votre fonction au format suivant :
+ *<package>*.*<Class>* – Par exemple, `example.OrderHandler`.

Pour les fonctions Lambda en Java qui n’implémentent pas l’interface `RequestHandler` ou `RequestStreamHandler`, vous pouvez utiliser n’importe quel nom pour le gestionnaire. Lorsque vous déployez votre fonction sur Lambda, spécifiez le gestionnaire principal dans la configuration de votre fonction au format suivant :
+ *<package>*.*<Class>*::*<handler\$1method\$1name>* – Par exemple, `example.Handler::mainHandler`.

## Définition et accès à l’objet d’événement d’entrée
<a name="java-handler-input"></a>

JSON est le format d’entrée le plus courant et standard pour les fonctions Lambda. Dans cet exemple, la fonction exige une entrée similaire à l’exemple suivant :

```
{
    "orderId": "12345",
    "amount": 199.99,
    "item": "Wireless Headphones"
}
```

Lorsque vous utilisez des fonctions Lambda dans Java 17 ou version plus récente, vous pouvez définir la forme de l’événement d’entrée attendu sous la forme d’un enregistrement Java. Dans cet exemple, nous définissons un enregistrement au sein de la classe `OrderHandler` pour représenter un objet `Order` :

```
public record Order(String orderId, double amount, String item) {}
```

Cet enregistrement correspond à la forme d’entrée attendue. Après avoir défini votre enregistrement, vous pouvez écrire une signature de gestionnaire qui utilise une entrée JSON conforme à la définition de l’enregistrement. L’environnement d’exécution Java désérialise automatiquement ce JSON en un objet Java. Vous pouvez ensuite accéder aux champs de l’objet. Par exemple, `event.orderId` récupère la valeur de `orderId` à partir de l’entrée d’origine.

**Note**  
Les enregistrements Java sont une fonctionnalité des environnements d’exécution Java 17 et des versions plus récentes uniquement. Dans toutes les exécutions Java, vous pouvez utiliser une classe pour représenter les données des événements. Dans de tels cas, vous pouvez utiliser une bibliothèque comme [jackson](https://github.com/FasterXML/jackson) pour désérialiser les entrées JSON.

### Autres types d’événements d’entrée
<a name="java-input-event-types"></a>

Il existe de nombreux événements d’entrée possibles pour les fonctions Lambda en Java :
+ `Integer`, `Long`, `Double`, etc. – L’événement est un nombre sans mise en forme supplémentaire, par exemple, `3.5`. Le moteur d’exécution Java convertit la valeur en un objet du type spécifié.
+ `String` – L’événement est une chaîne JSON incluant des guillemets, par exemple, `“My string”`. Le moteur d’exécution convertit la valeur en objet `String`, sans guillemets.
+ `List<Integer>`, `List<String>`, `List<Object>`, etc. – L’événement est un tableau JSON. Le moteur d’exécution le désérialise en un objet du type ou de l’interface spécifié.
+ `InputStream` – L’événement a un type JSON quelconque. Le moteur d’exécution transmet un flux d’octets du document au gestionnaire sans modification. Vous désérialisez l’entrée et écrivez la sortie dans un flux de sortie.
+ Type de bibliothèque – Pour les événements envoyés par d’autres services AWS, utilisez les types de la bibliothèque [aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-events). Par exemple, si votre fonction Lambda est invoquée par Amazon Simple Queue Service (SQS), utilisez l’objet `SQSEvent` comme entrée.

## Accès et utilisation de l’objet de contexte Lambda
<a name="java-example-context"></a>

L’[objet de contexte](java-context.md) Lambda contient des informations sur l’invocation, la fonction et l’environnement d’exécution. Dans cet exemple, l’objet de contexte est de type `com.amazonaws.services.lambda.runtime.Context`, et constitue le deuxième argument de la fonction de gestion principale.

```
public String handleRequest(Order event, Context context) {
    ...
}
```

Si votre classe implémente l’interface [RequestHandler](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/RequestHandler.java) ou [RequestStreamHandler](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/RequestStreamHandler.java), l’objet de contexte est un argument obligatoire. Dans le cas contraire, l’objet de contexte est facultatif. Pour plus d’informations sur les signatures de gestionnaire acceptées valides, consultez [Définitions de classe valides pour les gestionnaires Java](#java-handler-signatures).

Si vous appelez d’autres services à l’aide du kit SDK AWS, l’objet de contexte est requis dans quelques domaines clés. Par exemple, pour générer des journaux de fonction pour Amazon CloudWatch, vous pouvez utiliser la méthode `context.getLogger()` pour obtenir un objet `LambdaLogger` à enregistrer. Dans cet exemple, nous pouvons utiliser l’enregistreur pour enregistrer un message d’erreur si le traitement échoue pour une raison quelconque :

```
context.getLogger().log("Failed to process order: " + e.getMessage());
```

En dehors de la journalisation, vous pouvez également utiliser l’objet de contexte pour surveiller les fonctions. Pour plus d’informations sur la copie d’objets, consultez [Utilisation de l’objet de contexte Lambda pour récupérer les informations de la fonction Java](java-context.md).

## Utilisation du SDK AWS pour Java  v2 dans votre gestionnaire
<a name="java-example-sdk-usage"></a>

Vous utiliserez souvent les fonctions Lambda pour interagir avec d’autres ressources AWS ou pour les mettre à jour. Le moyen le plus simple d’interagir avec ces ressources est d’utiliser le SDK AWS pour Java v2.

**Note**  
Le SDK AWS pour Java (v1) est en mode de maintenance et atteindra la fin du support le 31 décembre 2025. Nous vous recommandons de n’utiliser que le SDK AWS pour Java v2 à l’avenir.

Pour ajouter des dépendances du SDK à votre fonction, ajoutez-les dans votre fichier `build.gradle` pour Gradle ou dans votre fichier `pom.xml` pour Maven. Nous vous recommandons de n’ajouter que les bibliothèques dont vous avez besoin pour votre fonction. Dans l’exemple de code précédent, nous avons utilisé la bibliothèque `software.amazon.awssdk.services.s3`. Dans Gradle, vous pouvez ajouter cette dépendance en ajoutant la ligne suivante dans la section des dépendances de `build.gradle` :

```
implementation 'software.amazon.awssdk:s3:2.28.29'
```

Dans Maven, ajoutez les lignes suivantes dans la section `<dependencies>` de `pom.xml` :

```
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3</artifactId>
        <version>2.28.29</version>
    </dependency>
```

**Note**  
Il ne s’agit peut-être pas de la version la plus récente du SDK. Choisissez la version du SDK adéquate pour votre application.

Importez ensuite les dépendances directement dans votre classe Java :

```
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
```

L’exemple de code initialise ensuite un client Amazon S3 comme suit :

```
private static final S3Client S3_CLIENT = S3Client.builder().build();
```

Dans cet exemple, nous avons initialisé notre client Amazon S3 en dehors de la fonction de gestionnaire principale pour éviter d’avoir à l’initialiser à chaque fois que nous invoquons notre fonction. Après avoir initialisé votre client SDK, vous pouvez l’utiliser pour interagir avec d’autres services AWS. L’exemple de code appelle l’API Amazon S3 `PutObject` comme suit :

```
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
    .bucket(bucketName)
    .key(key)
    .build();

// Convert the receipt content to bytes and upload to S3
S3_CLIENT.putObject(putObjectRequest, RequestBody.fromBytes(receiptContent.getBytes(StandardCharsets.UTF_8)));
```

## Accès aux variables d’environnement
<a name="java-example-envvars"></a>

Dans le code de votre gestionnaire, vous pouvez référencer n’importe quelle [variable d’environnement](configuration-envvars.md) à l’aide de la méthode `System.getenv()`. Dans cet exemple, nous référençons la variable d’environnement `RECEIPT_BUCKET` définie à l’aide de la ligne de code suivante :

```
String bucketName = System.getenv("RECEIPT_BUCKET");
if (bucketName == null || bucketName.isEmpty()) {
    throw new IllegalArgumentException("RECEIPT_BUCKET environment variable is not set");
}
```

## Utilisation de l'état global
<a name="java-handler-state"></a>

Lambda exécute votre code statique et le constructeur de classe pendant la [phase d’initialisation](lambda-runtime-environment.md#runtimes-lifecycle-ib) avant d’invoquer votre fonction pour la première fois. Les ressources créées pendant l’initialisation restent en mémoire entre les invocations, ce qui vous évite d’avoir à les créer chaque fois que vous invoquez votre fonction.

Dans l’exemple de code, le code d’initialisation du client S3 se trouve en dehors de la méthode du gestionnaire principal. L’exécution initialise le client avant que la fonction n’exécute son premier événement, et le client reste disponible pour être réutilisé pendant toutes les invocations.

## Pratiques exemplaires en matière de code pour les fonctions Lambda Java
<a name="java-best-practices"></a>

Respectez les directives de la liste suivante pour utiliser les pratiques exemplaires de codage lors de la création de vos fonctions Lambda :
+ **Séparez le gestionnaire Lambda de votre logique principale.** Cela vous permet de créer une fonction testable plus unitaire.
+ **Contrôlez les dépendances du package de déploiement de vos fonctions. ** L’environnement d’exécution AWS Lambda contient un certain nombre de bibliothèques. Pour activer le dernier ensemble de mises à jour des fonctionnalités et de la sécurité, Lambda met régulièrement à jour ces bibliothèques. Ces mises à jour peuvent introduire de subtiles modifications dans le comportement de votre fonction Lambda. Pour disposer du contrôle total des dépendances que votre fonction utilise, empaquetez toutes vos dépendances avec votre package de déploiement. 
+ **Réduisez la complexité de vos dépendances.** Privilégiez les infrastructures plus simples qui se chargent rapidement au démarrage de l’[environnement d’exécution](lambda-runtime-environment.md). Par exemple, préférez les infrastructures d’injection (IoC) de dépendances Java plus simples comme [Dagger](https://google.github.io/dagger/) ou [Guice](https://github.com/google/guice), à des plus complexes comme [Spring Framework](https://github.com/spring-projects/spring-framework).
+ **Réduisez la taille de votre package de déploiement selon ses besoins relatifs à l’environnement d’exécution. ** Cela contribue à réduire le temps nécessaire au téléchargement et à la décompression de votre package de déploiement avant l'invocation. Pour les fonctions créées dans Java, évitez de charger la totalité de la bibliothèque du kit SDK AWS comme partie intégrante de votre package de déploiement. À la place, appuyez-vous de façon sélective sur les modules qui sélectionnent les composants du kit SDK dont vous avez besoin (par exemple, DynamoDB, modules du kit SDK Amazon S3 et [bibliothèques principales Lambda](https://github.com/aws/aws-lambda-java-libs)).

**Tirez parti de la réutilisation de l’environnement d’exécution pour améliorer les performances de votre fonction.** Initialisez les clients SDK et les connexions à la base de données en dehors du gestionnaire de fonctions et mettez en cache les actifs statiques localement dans le répertoire `/tmp`. Les invocations ultérieures traitées par la même instance de votre fonction peuvent réutiliser ces ressources. Cela permet d’économiser des coûts, tout en réduisant le temps d’exécution de la fonction.

Pour éviter des éventuelles fuites de données entre les invocations, n’utilisez pas l’environnement d’exécution pour stocker des données utilisateur, des événements ou d’autres informations ayant un impact sur la sécurité. Si votre fonction repose sur un état réversible qui ne peut pas être stocké en mémoire dans le gestionnaire, envisagez de créer une fonction distincte ou des versions distinctes d’une fonction pour chaque utilisateur.

**Utilisez une directive keep-alive pour maintenir les connexions persistantes.** Lambda purge les connexions inactives au fil du temps. Si vous tentez de réutiliser une connexion inactive lorsque vous invoquez une fonction, cela entraîne une erreur de connexion. Pour maintenir votre connexion persistante, utilisez la directive Keep-alive associée à votre environnement d’exécution. Pour obtenir un exemple, consultez [Réutilisation des connexions avec Keep-Alive dans Node.js](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-reusing-connections.html).

**Utilisez des [variables d’environnement](configuration-envvars.md) pour transmettre des paramètres opérationnels à votre fonction.** Par exemple, si vous écrivez dans un compartiment Amazon S3 au lieu de coder en dur le nom du compartiment dans lequel vous écrivez, configurez le nom du compartiment comme variable d’environnement.

**Évitez d’utiliser des invocations récursives** dans votre fonction Lambda, lorsque la fonction s’invoque elle-même ou démarre un processus susceptible de l’invoquer à nouveau. Cela peut entraîner un volume involontaire d’invocations de fonction et des coûts accrus. Si vous constatez un volume involontaire d’invocations, définissez immédiatement la simultanéité réservée à la fonction sur `0` afin de limiter toutes les invocations de la fonction, pendant que vous mettez à jour le code.

**N’utilisez pas d’API non publiques non documentées** dans le code de votre fonction Lambda. Pour les exécutions gérées AWS Lambda, Lambda applique périodiquement des mises à jour de sécurité et fonctionnelles aux API internes de Lambda. Ces mises à jour internes de l’API peuvent être incompatibles avec les versions antérieures, entraînant des conséquences imprévues telles que des échecs d’invocation si votre fonction dépend de ces API non publiques. Consultez la [Référence d’API](https://docs.aws.amazon.com/lambda/latest/api/welcome.html) pour obtenir la liste des API accessibles au public.

**Écriture du code idempotent.** L’écriture de code idempotent pour vos fonctions garantit ne gestion identique des événements dupliqués. Votre code doit valider correctement les événements et gérer correctement les événements dupliqués. Pour de plus amples informations, veuillez consulter[Comment faire en sorte que ma fonction Lambda soit idempotente ?](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-idempotent/).
+ **Évitez d’utiliser le cache DNS de Java.** Les fonctions Lambda mettent déjà en cache les réponses DNS. Si vous utilisez un autre cache DNS, vous risquez de subir des interruptions de connexion.

  La classe `java.util.logging.Logger` peut activer indirectement le cache DNS de la JVM. Pour remplacer les paramètres par défaut, définissez [networkaddress.cache.ttl](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/net/InetAddress.html#inetaddress-caching-heading) sur 0 avant de procéder à l’initialisation de `logger`. Exemple :

  ```
  public class MyHandler {
    // first set TTL property
    static{
     java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
    }
   // then instantiate logger
    var logger = org.apache.logging.log4j.LogManager.getLogger(MyHandler.class);
  }
  ```
+ **Réduisez le temps que Lambda met à décompresser les packages de déploiement** créés dans Java en plaçant vos fichiers `.jar` de dépendance dans un répertoire /lib distinct. Cette solution est plus rapide que le placement de tout le code de votre fonction dans un seul fichier .jar comprenant une multitude de fichiers `.class`. Pour obtenir des instructions, consultez [Déployer des fonctions Lambda en Java avec des archives de fichiers .zip ou JAR](java-package.md).

# Déployer des fonctions Lambda en Java avec des archives de fichiers .zip ou JAR
<a name="java-package"></a>

Le code de votre AWS Lambda fonction se compose de scripts ou de programmes compilés et de leurs dépendances. Pour déployer votre code de fonction vers Lambda, vous utilisez un *package de déploiement*. Lambda prend en charge deux types de packages de déploiement : les images conteneurs et les archives de fichiers .zip. 

Cette page explique comment créer votre package de déploiement sous forme de fichier .zip ou Jar, puis utiliser le package de déploiement pour déployer votre code de fonction à AWS Lambda l'aide de AWS Command Line Interface (AWS CLI).

**Important**  
Java 25 a introduit le support pour les caches Ahead-of-Time (AOT). Nous vous recommandons vivement de ne pas utiliser de caches AOT lors du déploiement de vos fonctions sous forme d'archives de fichiers .zip ou JAR, car les caches peuvent provoquer un comportement inattendu lorsque Lambda met à jour le runtime géré. Pour plus d'informations, voir[Ahead-of-Time (AOT) et caches CDS](java-customization.md#aot-cds-caches).

**Topics**
+ [Conditions préalables](#java-package-prereqs)
+ [Outils et bibliothèques](#java-package-libraries)
+ [Création d’un package de déploiement avec Gradle](#java-package-gradle)
+ [Utilisation des couches pour les dépendances](#java-package-layers)
+ [Création d’un package de déploiement avec Maven](#java-package-maven)
+ [Chargement d’un package de déploiement avec la console Lambda](#java-package-console)
+ [Téléchargement d'un package de déploiement à l'aide du AWS CLI](#java-package-cli)
+ [Téléchargement d'un package de déploiement avec AWS SAM](#java-package-cloudformation)

## Conditions préalables
<a name="java-package-prereqs"></a>

 AWS CLI Il s'agit d'un outil open source qui vous permet d'interagir avec les AWS services à l'aide de commandes dans votre interface de ligne de commande. Pour effectuer les étapes de cette section, vous devez disposer de la [version 2 de l’AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

## Outils et bibliothèques
<a name="java-package-libraries"></a>

AWS fournit les bibliothèques suivantes pour les fonctions Java. Ces bibliothèques sont disponibles via le [Référentiel central Maven](https://search.maven.org/search?q=g:com.amazonaws).
+ [com.amazonaws : aws-lambda-java-core](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-core) (obligatoire) — Définit les interfaces des méthodes du gestionnaire et l'objet de contexte que le moteur d'exécution transmet au gestionnaire. Si vous définissez vos propres types d’entrée, c’est la seule bibliothèque dont vous avez besoin.
+ [com.amazonaws : aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-events) — Types d'entrée pour les événements provenant de services qui invoquent des fonctions Lambda.
+ [com.amazonaws : aws-lambda-java-log 4j2](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-log4j2) [— Une bibliothèque d'ajout pour Apache Log4j 2 que vous pouvez utiliser pour ajouter l'ID de demande pour l'appel en cours dans vos journaux de fonctions.](java-logging.md)
+ [AWS SDK pour Java](https://github.com/aws/aws-sdk-java-v2) 2.0 — Le SDK AWS officiel pour le langage de programmation Java.

Ajoutez ces bibliothèques à votre définition de build comme suit :

------
#### [ Gradle ]

```
dependencies {
    implementation 'com.amazonaws:aws-lambda-java-core:1.2.2'
    implementation 'com.amazonaws:aws-lambda-java-events:3.11.1'
    runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.1'
}
```

------
#### [ Maven ]

```
  <dependencies>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.2.2</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-events</artifactId>
      <version>3.11.1</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-log4j2</artifactId>
      <version>1.5.1</version>
    </dependency>
  </dependencies>
```

------

Afin de créer un package de déploiement, compilez votre code de fonction et vos dépendances dans un seul fichier .zip ou Java Archive (JAR). Pour Gradle, [utilisez le type de build `Zip`](#java-package-gradle). Pour Apache Maven, [utilisez le plug-in Maven Shade](#java-package-maven). Pour télécharger votre package de déploiement, utilisez la console Lambda, l'API Lambda ou (). AWS Serverless Application Model AWS SAM

**Note**  
Pour que la taille de votre package de déploiement reste petite, empaquetez les dépendances de votre fonction en couches. Les couches vous permettent de gérer vos dépendances de manière indépendante. Elles peuvent être utilisées par plusieurs fonctions et partagées avec d’autres comptes. Pour de plus amples informations, veuillez consulter [Gestion des dépendances Lambda à l’aide de couches](chapter-layers.md).

## Création d’un package de déploiement avec Gradle
<a name="java-package-gradle"></a>

Afin de créer un package de déploiement avec le code et les dépendances de votre fonction dans Gradle, utilisez le type de build `Zip`. Voici un exemple tiré d’un [fichier exemple build.gradle complet](https://github.com/awsdocs/aws-lambda-developer-guide/blob/main/sample-apps/s3-java/build.gradle) :

**Example build.gradle – Tâche de génération**  

```
task buildZip(type: Zip) {
    into('lib') {
        from(jar)
        from(configurations.runtimeClasspath)
    }
}
```

Cette configuration de build donne lieu à un package de déploiement dans le répertoire `build/distributions`. Dans l’instruction `into('lib')`, la tâche `jar` assemble une archive jar contenant vos classes principales dans un dossier nommé `lib`. De plus, la tâche `configurations.runtimeClassPath` copie les bibliothèques de dépendances du chemin de classe de génération dans le même dossier `lib`.

**Example build.gradle – Dépendances**  

```
dependencies {
    ...
    implementation 'com.amazonaws:aws-lambda-java-core:1.2.2'
    implementation 'com.amazonaws:aws-lambda-java-events:3.11.1'
    implementation 'org.apache.logging.log4j:log4j-api:2.17.1'
    implementation 'org.apache.logging.log4j:log4j-core:2.17.1'
    runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.17.1'
    runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.1'
    ...
}
```

Lambda charge les fichiers JAR dans l’ordre alphabétique Unicode. Si plusieurs fichiers JAR du répertoire `lib` contiennent la même classe, le premier fichier est utilisé. Vous pouvez utiliser le script shell suivant afin d’identifier les classes en double :

**Example test-zip.sh**  

```
mkdir -p expanded
unzip path/to/my/function.zip -d expanded
find ./expanded/lib -name '*.jar' | xargs -n1 zipinfo -1 | grep '.*.class' | sort | uniq -c | sort
```

## Utilisation des couches pour les dépendances
<a name="java-package-layers"></a>

Vous pouvez empaqueter les dépendances de votre fonction par couches afin de réduire la taille de votre package de déploiement et de gérer les dépendances de manière indépendante. Pour de plus amples informations, veuillez consulter [Utilisation de couches pour les fonctions Lambda Java](java-layers.md).

## Création d’un package de déploiement avec Maven
<a name="java-package-maven"></a>

Pour créer un package de déploiement avec Maven, utilisez le [plug-in Maven Shade](https://maven.apache.org/plugins/maven-shade-plugin/). Le plug-in crée un fichier JAR qui contient le code de fonction compilé et toutes ses dépendances.

**Example pom.xml – Configuration du plugin**  

```
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.2</version>
        <configuration>
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
```

Pour créer le package de déploiement, utilisez la commande `mvn package`.

```
[INFO] Scanning for projects...
[INFO] -----------------------< com.example:java-maven >-----------------------
[INFO] Building java-maven-function 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java-maven ---
[INFO] Building jar: target/java-maven-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-shade-plugin:3.2.2:shade (default) @ java-maven ---
[INFO] Including com.amazonaws:aws-lambda-java-core:jar:1.2.2 in the shaded jar.
[INFO] Including com.amazonaws:aws-lambda-java-events:jar:3.11.1 in the shaded jar.
[INFO] Including joda-time:joda-time:jar:2.6 in the shaded jar.
[INFO] Including com.google.code.gson:gson:jar:2.8.6 in the shaded jar.
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing target/java-maven-1.0-SNAPSHOT.jar with target/java-maven-1.0-SNAPSHOT-shaded.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  8.321 s
[INFO] Finished at: 2020-03-03T09:07:19Z
[INFO] ------------------------------------------------------------------------
```

Cette commande génère un fichier JAR dans le répertoire `target`.

**Note**  
Si vous travaillez avec un [JAR multi-version (MRJAR)](https://openjdk.org/jeps/238), vous devez inclure le MRJAR (c’est-à-dire le JAR ombré produit par le plugin Maven Shade) dans le répertoire `lib` et le zipper avant de charger votre package de déploiement sur Lambda. Sinon, Lambda pourrait ne pas décompresser correctement votre fichier JAR, ce qui ferait que votre fichier `MANIFEST.MF` serait ignoré.

Si vous utilisez la bibliothèque appender (`aws-lambda-java-log4j2`), vous devez également configurer un transformateur pour le plug-in Maven Shade. La bibliothèque de transformateurs combine les versions d’un fichier cache qui apparaissent à la fois dans la bibliothèque appender et dans Log4j.

**Example pom.xml – Configuration du plugin avec l’appender Log4j 2**  

```
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.2</version>
        <configuration>
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="com.github.edwgiz.maven_shade_plugin.log4j2_cache_transformer.PluginsCacheFileTransformer">
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>com.github.edwgiz</groupId>
            <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
            <version>2.13.0</version>
          </dependency>
        </dependencies>
      </plugin>
```

## Chargement d’un package de déploiement avec la console Lambda
<a name="java-package-console"></a>

 Pour créer une nouvelle fonction, vous devez d’abord créer la fonction dans la console, puis charger votre fichier .zip ou JAR. Pour mettre à jour une fonction existante, ouvrez la page de votre fonction, puis suivez la même procédure pour ajouter votre fichier .zip ou JAR mis à jour. 

 Si votre fichier package de déploiement fait moins de 50 Mo, vous pouvez créer ou mettre à jour une fonction en chargeant le fichier directement à partir de votre ordinateur local. Pour les fichiers .zip ou JAR de plus de 50 Mo, vous devez d’abord charger votre package dans un compartiment Amazon S3. Pour savoir comment charger un fichier dans un compartiment Amazon S3 à l'aide du AWS Management Console, consultez [Getting started with Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html). Pour télécharger des fichiers à l'aide de AWS CLI, voir [Déplacer des objets](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) dans le *guide de AWS CLI l'utilisateur*. 

**Note**  
Vous ne pouvez pas modifier le [type de package de déploiement](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-PackageType) (.zip ou image de conteneur) d’une fonction existante. Par exemple, vous ne pouvez pas convertir une fonction d’image de conteneur pour utiliser un fichier d’archive .zip à la place. Vous devez créer une nouvelle fonction.

**Pour créer une nouvelle fonction (console)**

1. Ouvrez la [page Fonctions](https://console.aws.amazon.com/lambda/home#/functions) de la console Lambda et choisissez **Créer une fonction**.

1. Choisissez **Créer à partir de zéro**.

1. Sous **Informations de base**, procédez comme suit :

   1. Pour **Nom de la fonction**, saisissez le nom de la fonction.

   1. Pour **Exécution**, sélectionnez l’exécution que vous souhaitez utiliser.

   1. (Facultatif) Pour **Architecture**, choisissez l’architecture de l’ensemble des instructions pour votre fonction. L’architecture par défaut est x86\$164. Assurez-vous que le package de déploiement .zip pour votre fonction est compatible avec l’architecture de l’ensemble d’instructions que vous sélectionnez.

1. (Facultatif) Sous **Permissions (Autorisations)**, développez **Change default execution role (Modifier le rôle d’exécution par défaut)**. Vous pouvez créer un **rôle d’exécution** ou en utiliser un existant.

1. Choisissez **Créer une fonction**. Lambda crée une fonction de base « Hello world » à l’aide de l’exécution de votre choix.

**Pour charger une archive .zip ou JAR à partir de votre ordinateur local (console)**

1. Sur la [page Fonctions](https://console.aws.amazon.com/lambda/home#/functions) de la console Lambda, choisissez la fonction pour laquelle vous souhaitez charger le fichier .zip ou JAR.

1. Sélectionnez l’onglet **Code**.

1. Dans le volet **Source du code**, choisissez **Charger à partir de**.

1. Choisissez un **fichier .zip ou .jar**.

1. Pour charger un fichier .zip ou JAR, procédez comme suit :

   1. Sélectionnez **Charger**, puis choisissez votre fichier .zip ou JAR dans le sélecteur de fichiers.

   1. Choisissez **Ouvrir**.

   1. Choisissez **Enregistrer**.

**Pour charger une archive .zip ou JAR depuis un compartiment Amazon S3 (console)**

1. Sur la [page Fonctions](https://console.aws.amazon.com/lambda/home#/functions) de la console Lambda, choisissez la fonction pour laquelle vous souhaitez charger un nouveau fichier .zip ou JAR.

1. Sélectionnez l’onglet **Code**.

1. Dans le volet **Source du code**, choisissez **Charger à partir de**.

1. Choisissez l’**emplacement Amazon S3**.

1. Collez l’URL du lien Amazon S3 de votre fichier .zip et choisissez **Enregistrer**.

## Téléchargement d'un package de déploiement à l'aide du AWS CLI
<a name="java-package-cli"></a>

 Vous pouvez utiliser la [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) pour créer une nouvelle fonction ou pour mettre à jour une fonction existante à l’aide d’un fichier .zip ou JAR. Utilisez la [fonction de création](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) et [update-function-code](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html)les commandes pour déployer votre package .zip ou JAR. Si votre fichier est inférieur à 50 Mo, vous pouvez charger le package à partir d’un emplacement de fichier sur votre machine de génération locale. Pour les fichiers plus volumineux, vous devez charger votre package .zip ou JAR à partir d’un compartiment Amazon S3. Pour savoir comment charger un fichier dans un compartiment Amazon S3 à l'aide du AWS CLI, consultez la section [Déplacer des objets](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) dans le *guide de AWS CLI l'utilisateur*. 

**Note**  
Si vous chargez votre fichier .zip ou JAR depuis un compartiment Amazon S3 à l'aide du AWS CLI, le compartiment doit se trouver au même endroit Région AWS que votre fonction.

 Pour créer une nouvelle fonction à l'aide d'un fichier .zip ou JAR avec le AWS CLI, vous devez spécifier les éléments suivants : 
+ Le nom de votre fonction (`--function-name`)
+ L’exécution de votre fonction (`--runtime`)
+ L’Amazon Resource Name (ARN) du [rôle d’exécution](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) de votre fonction (`--role`)
+ Le nom de la méthode du gestionnaire dans votre code de fonction (`--handler`)

 Vous devez également indiquer l’emplacement de votre fichier .zip ou JAR. Si votre fichier .zip ou JAR se trouve dans un dossier sur votre machine de génération locale, utilisez l’option `--zip-file` pour spécifier le chemin d’accès du fichier, comme le montre l’exemple de commande suivant. 

```
aws lambda create-function --function-name myFunction \
--runtime java25 --handler example.handler \
--role arn:aws:iam::123456789012:role/service-role/my-lambda-role \
--zip-file fileb://myFunction.zip
```

 Pour spécifier l’emplacement du fichier .zip dans un compartiment Amazon S3, utilisez l’option `--code` comme le montre l’exemple de commande suivant. Vous devez uniquement utiliser le paramètre `S3ObjectVersion` pour les objets soumis à la gestion des versions. 

```
aws lambda create-function --function-name myFunction \
--runtime java25 --handler example.handler \
--role arn:aws:iam::123456789012:role/service-role/my-lambda-role \
--code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion
```

 Pour mettre à jour une fonction existante à l’aide de l’interface de ligne de commande, vous devez spécifier le nom de votre fonction à l’aide du paramètre `--function-name`. Vous devez également spécifier l’emplacement du fichier .zip que vous souhaitez utiliser pour mettre à jour votre code de fonction. Si votre fichier .zip se trouve dans un dossier sur votre machine de génération locale, utilisez l’option `--zip-file` pour spécifier le chemin d’accès du fichier, comme le montre l’exemple de commande suivant. 

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

 Pour spécifier l’emplacement du fichier .zip dans un compartiment Amazon S3, utilisez les options `--s3-bucket` et `--s3-key` comme le montre l’exemple de commande suivant. Vous devez uniquement utiliser le paramètre `--s3-object-version` pour les objets soumis à la gestion des versions. 

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

## Téléchargement d'un package de déploiement avec AWS SAM
<a name="java-package-cloudformation"></a>

Vous pouvez l'utiliser AWS SAM pour automatiser les déploiements de votre code de fonction, de votre configuration et de vos dépendances. AWS SAM est une extension de CloudFormation qui fournit une syntaxe simplifiée pour définir des applications sans serveur. L’exemple de modèle suivant définit une fonction avec un package de déploiement dans le répertoire `build/distributions` utilisé par Gradle :

**Example template.yml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Lambda application that calls the Lambda API.
Resources:
  function:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      CodeUri: build/distributions/java-basic.zip
      Handler: example.Handler
      Runtime: java25
      Description: Java function
      MemorySize: 512
      Timeout: 10
      # Function's execution role
      Policies:
        - AWSLambdaBasicExecutionRole
        - AWSLambda_ReadOnlyAccess
        - AWSXrayWriteOnlyAccess
        - AWSLambdaVPCAccessExecutionRole
      Tracing: Active
```

Pour créer la fonction, utilisez les commandes `package` et `deploy`. Ces commandes sont des personnalisations de l AWS CLI. Elles encapsulent d’autres commandes pour charger le package de déploiement sur Amazon S3, réécrivent le modèle avec l’URI de l’objet, et mettent à jour le code de la fonction.

L’exemple de script suivant exécute une build Gradle et télécharge le package de déploiement qu’il crée. Il crée une CloudFormation pile la première fois que vous l'exécutez. Si la pile existe déjà, le script la met à jour.

**Example deploy.sh**  

```
#!/bin/bash
set -eo pipefail
aws cloudformation package --template-file template.yml --s3-bucket MY_BUCKET --output-template-file out.yml
aws cloudformation deploy --template-file out.yml --stack-name java-basic --capabilities CAPABILITY_NAMED_IAM
```

Afin d’obtenir un exemple de travail complet, consultez les exemples d’applications suivants :

**Exemples d’applications Lambda en Java**
+ [example-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/example-java) : fonction Java qui montre comment utiliser Lambda pour traiter les commandes. Cette fonction montre comment définir et désérialiser un objet d'événement d'entrée personnalisé, utiliser le AWS SDK et enregistrer les sorties.
+ [java-basic](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-basic) – Ensemble de fonctions Java minimales avec des tests unitaires et une configuration de journalisation variable.
+ [java events](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-events) – Ensemble de fonctions Java contenant du code squelette permettant de gérer les événements de divers services tels qu’Amazon API Gateway, Amazon SQS et Amazon Kinesis. Ces fonctions utilisent la dernière version de la [aws-lambda-java-events](#java-package)bibliothèque (3.0.0 et versions ultérieures). Ces exemples ne nécessitent pas le AWS SDK comme dépendance.
+ [s3-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/s3-java) – Fonction Java qui traite les événements de notification d’Amazon S3 et utilise la bibliothèque de classes Java (JCL) pour créer des miniatures à partir de fichiers d’image chargés.
+ [layer-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/layer-java) : fonction Java qui illustre comment utiliser une couche Lambda pour empaqueter les dépendances séparément du code de votre fonction principale.

# Déployer des fonctions Lambda en Java avec des images conteneurs
<a name="java-image"></a>

Il existe trois méthodes pour créer une image de conteneur pour une fonction Lambda Java :
+ [Utilisation d'une image AWS de base pour Java](#java-image-instructions)

  Les [images de base AWS](images-create.md#runtimes-images-lp) sont préchargées avec une exécution du langage, un client d’interface d’exécution pour gérer l’interaction entre Lambda et votre code de fonction, et un émulateur d’interface d’exécution pour les tests locaux.
+ [Utilisation d'une image de base AWS uniquement pour le système d'exploitation](images-create.md#runtimes-images-provided)

  [AWS Les images de base réservées](https://gallery.ecr.aws/lambda/provided) au système d'exploitation contiennent une distribution Amazon Linux et l'émulateur [d'interface d'exécution](https://github.com/aws/aws-lambda-runtime-interface-emulator/). Ces images sont couramment utilisées pour créer des images de conteneur pour les langages compilés, tels que [Go](go-image.md#go-image-provided) et [Rust](lambda-rust.md), et pour une langue ou une version linguistique pour laquelle Lambda ne fournit pas d’image de base, comme Node.js 19. Vous pouvez également utiliser des images de base uniquement pour le système d'exploitation pour implémenter un [environnement d'exécution personnalisé](runtimes-custom.md). Pour rendre l’image compatible avec Lambda, vous devez inclure le [client d’interface d’exécution pour Java](#java-image-clients) dans l’image.
+ [Utilisation d'une image non AWS basique](#java-image-clients)

  Vous pouvez utiliser une autre image de base à partir d’un autre registre de conteneur, comme Alpine Linux ou Debian. Vous pouvez également utiliser une image personnalisée créée par votre organisation. Pour rendre l’image compatible avec Lambda, vous devez inclure le [client d’interface d’exécution pour Java](#java-image-clients) dans l’image.

**Astuce**  
Pour réduire le temps nécessaire à l’activation des fonctions du conteneur Lambda, consultez [Utiliser des générations en plusieurs étapes](https://docs.docker.com/build/building/multi-stage/) (français non garanti) dans la documentation Docker. Pour créer des images de conteneur efficaces, suivez la section [Bonnes pratiques pour l’écriture de Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) (français non garanti).

Cette page explique comment créer, tester et déployer des images de conteneur pour Lambda.

**Topics**
+ [AWS images de base pour Java](#java-image-base)
+ [Utilisation d'une image AWS de base pour Java](#java-image-instructions)
+ [Utilisation d’une autre image de base avec le client d’interface d’exécution](#java-image-clients)

## AWS images de base pour Java
<a name="java-image-base"></a>

AWS fournit les images de base suivantes pour Java :


| Étiquettes | Environnement d’exécution | Système d’exploitation | Dockerfile | Obsolescence | 
| --- | --- | --- | --- | --- | 
| 25 | Java 25 | Amazon Linux 2023 | [Dockerfile pour Java 2.5 sur GitHub](https://github.com/aws/aws-lambda-base-images/blob/java25/Dockerfile.java25) |   30 juin 2029   | 
| 21 | Java 21 | Amazon Linux 2023 | [Dockerfile pour Java 21 sur GitHub](https://github.com/aws/aws-lambda-base-images/blob/java21/Dockerfile.java21) |   30 juin 2029   | 
| 17 | Java 17 | Amazon Linux 2 | [Dockerfile pour Java 17 sur GitHub](https://github.com/aws/aws-lambda-base-images/blob/java17/Dockerfile.java17) |   30 juin 2027   | 
| 11 | Java 11 | Amazon Linux 2 | [Dockerfile pour Java 11 sur GitHub](https://github.com/aws/aws-lambda-base-images/blob/java11/Dockerfile.java11) |   30 juin 2027   | 
| 8.al2 | Java 8 | Amazon Linux 2 | [Dockerfile pour Java 8 sur GitHub](https://github.com/aws/aws-lambda-base-images/blob/java8.al2/Dockerfile.java8.al2) |   30 juin 2027   | 

Référentiel Amazon ECR : [gallery.ecr. aws/lambda/java](https://gallery.ecr.aws/lambda/java)

Les images de base de Java 21 et versions ultérieures sont basées sur l’[image de conteneur minimale Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/minimal-container.html). Les images de base antérieures utilisaient Amazon Linux 2. AL2023 offre plusieurs avantages par rapport à Amazon Linux 2, notamment un encombrement de déploiement réduit et des versions mises à jour de bibliothèques telles que`glibc`.

AL2023les images basées sur un lien symbolique sont utilisées `microdnf` comme gestionnaire de packages au lieu de`yum`, qui est le gestionnaire de packages par défaut dans Amazon Linux 2. `dnf` `microdnf`est une implémentation autonome de. `dnf` Pour obtenir la liste des packages inclus dans les images AL2023 basées, reportez-vous aux colonnes **Conteneur minimal** de la section [Comparaison des packages installés sur les images de conteneur Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/al2023-container-image-types.html). Pour plus d'informations sur les différences entre Amazon Linux 2 AL2023 et Amazon, consultez [la section Présentation du runtime Amazon Linux 2023 AWS Lambda](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/) sur le blog AWS Compute.

**Note**  
Pour exécuter des images AL2023 basées localement, y compris avec AWS Serverless Application Model (AWS SAM), vous devez utiliser Docker version 20.10.10 ou ultérieure.

## Utilisation d'une image AWS de base pour Java
<a name="java-image-instructions"></a>

### Conditions préalables
<a name="java-image-prerequisites"></a>

Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
+ Java (par exemple, [Amazon Corretto](https://aws.amazon.com/corretto))
+ [Apache Maven](https://maven.apache.org/) ou [Gradle](https://gradle.org/install/)
+ [AWS CLI version 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker) (version minimale 25.0.0)
+ Le [plug-in buildx](https://github.com/docker/buildx/blob/master/README.md) Docker.

### Création d’une image à partir d’une image de base
<a name="java-image-create"></a>

------
#### [ Maven ]

1. Exécutez la commande suivante pour créer un projet Maven en utilisant l’[archétype de Lambda](https://github.com/aws/aws-sdk-java-v2/tree/master/archetypes/archetype-lambda). Les paramètres suivants sont obligatoires :
   + **service** — Le Service AWS client à utiliser dans la fonction Lambda. Pour une liste des sources disponibles, voir [aws-sdk-java-v2/services](https://github.com/aws/aws-sdk-java-v2/tree/master/services) on GitHub.
   + **region** — L' Région AWS endroit où vous souhaitez créer la fonction Lambda.
   + **groupId** : l’espace de noms complet du package de votre application.
   + **artifactId** : le nom de votre projet. Cette valeur devient le nom du répertoire de votre projet.

   Sous Linux et macOS, exécutez cette commande :

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

   Dans PowerShell, exécutez cette commande :

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

   L’archétype Maven pour Lambda est préconfiguré pour compiler avec Java SE 8 et inclut une dépendance au kit AWS SDK pour Java. Si vous créez votre projet avec un archétype différent ou en utilisant une autre méthode, vous devez [configurer le compilateur Java pour Maven](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-project-maven.html#configure-maven-compiler) et [déclarer le kit SDK comme une dépendance](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-project-maven.html#configure-maven-compiler).

1. Ouvrez le répertoire `myapp/src/main/java/com/example/myapp` et trouvez le fichier `App.java`. Il s’agit du code de la fonction Lambda. Vous pouvez utiliser l’exemple de code fourni pour les tests ou le remplacer par le vôtre.

1. Retournez au répertoire racine du projet, puis créez un nouveau Dockerfile avec la configuration suivante :
   + Définir la propriété `FROM` sur l’[URI de l’image de base](https://gallery.ecr.aws/lambda/java).
   + Définir l’argument `CMD` pour le gestionnaire de la fonction Lambda.

   Notez que l’exemple de Dockerfile n’inclut pas d’[instruction USER](https://docs.docker.com/reference/dockerfile/#user). Lorsque vous déployez une image de conteneur sur Lambda, Lambda définit automatiquement un utilisateur Linux par défaut disposant d’autorisations de moindre privilège. Ceci est différent du comportement standard de Docker qui est défini par défaut par l’utilisateur `root` lorsqu’aucune instruction `USER` n’est fournie.  
**Example 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" ]
   ```

1. Compilez le projet et rassemblez les dépendances de l’environnement d’exécution.

   ```
   mvn compile dependency:copy-dependencies -DincludeScope=runtime
   ```

1. Générez l’image Docker à l’aide de la commande [docker build](https://docs.docker.com/engine/reference/commandline/build/). L’exemple suivant nomme l’image `docker-image` et lui donne la [balise](https://docs.docker.com/engine/reference/commandline/build/#tag) `test`. Pour rendre votre image compatible avec Lambda, vous devez utiliser l’option `--provenance=false`.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**Note**  
La commande spécifie l’option `--platform linux/amd64` pour garantir la compatibilité de votre conteneur avec l’environnement d’exécution Lambda, quelle que soit l’architecture de votre machine de génération. Si vous avez l'intention de créer une fonction Lambda à l'aide de l'architecture du jeu ARM64 d'instructions, veillez à modifier la commande pour utiliser l'`--platform linux/arm64`option à la place.

------
#### [ Gradle ]

1. Créez un répertoire pour le projet, puis passez à ce répertoire.

   ```
   mkdir example
   cd example
   ```

1. Exécutez la commande suivante pour que Gradle génère un nouveau projet d’application Java dans le répertoire `example` de votre environnement. Pour **Sélectionner le script de construction DSL**, choisissez **2 : Groovy**.

   ```
   gradle init --type java-application
   ```

1. Ouvrez le répertoire `/example/app/src/main/java/example` et trouvez le fichier `App.java`. Il s’agit du code de la fonction Lambda. Vous pouvez utiliser l’exemple de code suivant pour le tester, ou le remplacer par le vôtre.  
**Example 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!";
       }
   }
   ```

1. Ouvrez le fichier `build.gradle`. Si vous utilisez l’exemple de code de fonction de l’étape précédente, remplacez le contenu de `build.gradle` par ce qui suit. Si vous utilisez votre propre code de fonction, modifiez votre fichier `build.gradle` selon vos besoins.  
**Example 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'
     }
   }
   ```

1. La commande `gradle init` de l’étape 2 a également généré un cas de test fictif dans le répertoire `app/test`. Pour les besoins de ce tutoriel, passez outre l’exécution des tests en supprimant le répertoire `/test`.

1. Générez le projet.

   ```
   gradle build
   ```

1. Dans le répertoire racine du projet (`/example`), créez un fichier Docker avec la configuration suivante :
   + Définir la propriété `FROM` sur l’[URI de l’image de base](https://gallery.ecr.aws/lambda/java).
   + Utilisez la commande COPY pour copier le code de la fonction et les dépendances de l’environnement d’exécution dans `{LAMBDA_TASK_ROOT}`, une [variable d’environnement définie par Lambda](configuration-envvars.md#configuration-envvars-runtime).
   + Définir l’argument `CMD` pour le gestionnaire de la fonction Lambda.

   Notez que l’exemple de Dockerfile n’inclut pas d’[instruction USER](https://docs.docker.com/reference/dockerfile/#user). Lorsque vous déployez une image de conteneur sur Lambda, Lambda définit automatiquement un utilisateur Linux par défaut disposant d’autorisations de moindre privilège. Ceci est différent du comportement standard de Docker qui est défini par défaut par l’utilisateur `root` lorsqu’aucune instruction `USER` n’est fournie.  
**Example 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" ]
   ```

1. Générez l’image Docker à l’aide de la commande [docker build](https://docs.docker.com/engine/reference/commandline/build/). L’exemple suivant nomme l’image `docker-image` et lui donne la [balise](https://docs.docker.com/engine/reference/commandline/build/#tag) `test`. Pour rendre votre image compatible avec Lambda, vous devez utiliser l’option `--provenance=false`.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**Note**  
La commande spécifie l’option `--platform linux/amd64` pour garantir la compatibilité de votre conteneur avec l’environnement d’exécution Lambda, quelle que soit l’architecture de votre machine de génération. Si vous avez l'intention de créer une fonction Lambda à l'aide de l'architecture du jeu ARM64 d'instructions, veillez à modifier la commande pour utiliser l'`--platform linux/arm64`option à la place.

------

### (Facultatif) Testez l'image localement
<a name="java-image-test"></a>

1. Démarrez votre image Docker à l’aide de la commande **docker run**. Dans cet exemple, `docker-image` est le nom de l’image et `test` est la balise.

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

   Cette commande exécute l’image en tant que conteneur et crée un point de terminaison local à `localhost:9000/2015-03-31/functions/function/invocations`.
**Note**  
Si vous avez créé l'image Docker pour l'architecture du jeu ARM64 d'instructions, veillez à utiliser l'`--platform linux/arm64`option au lieu de`--platform linux/amd64`.

1. À partir d’une nouvelle fenêtre de terminal, publiez un événement au point de terminaison local.

------
#### [ Linux/macOS ]

   Sous Linux et macOS, exécutez la commande `curl` suivante :

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

   Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Si vous utilisez votre propre code de fonction plutôt que l’exemple de code de fonction, vous pouvez invoquer la fonction avec une charge utile JSON. Exemple :

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

------
#### [ PowerShell ]

   Dans PowerShell, exécutez la `Invoke-WebRequest` commande suivante :

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

   Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Si vous utilisez votre propre code de fonction plutôt que l’exemple de code de fonction, vous pouvez invoquer la fonction avec une charge utile JSON. Exemple :

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

------

1. Obtenez l’ID du conteneur.

   ```
   docker ps
   ```

1. Utilisez la commande [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) pour arrêter le conteneur. Dans cette commande, remplacez `3766c4ab331c` par l’ID du conteneur de l’étape précédente.

   ```
   docker kill 3766c4ab331c
   ```

### Déploiement de l’image
<a name="java-image-deploy"></a>

**Pour charger l’image sur Amazon RIE et créer la fonction Lambda**

1. Exécutez la [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html)commande pour authentifier la CLI Docker auprès de votre registre Amazon ECR.
   + Définissez la `--region` valeur à l' Région AWS endroit où vous souhaitez créer le référentiel Amazon ECR.
   + `111122223333`Remplacez-le par votre Compte AWS identifiant.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. Créez un référentiel dans Amazon ECR à l’aide de la commande [create-repository](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html).

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**Note**  
Le référentiel Amazon ECR doit être Région AWS identique à la fonction Lambda.

   En cas de succès, vous obtenez une réponse comme celle-ci :

   ```
   {
       "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"
           }
       }
   }
   ```

1. Copiez le `repositoryUri` à partir de la sortie de l’étape précédente.

1. Exécutez la commande [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) pour étiqueter votre image locale dans votre référentiel Amazon ECR en tant que dernière version. Dans cette commande :
   + `docker-image:test` est le nom et la [balise](https://docs.docker.com/engine/reference/commandline/build/#tag) de votre image Docker. Il s’agit du nom et de la balise de l’image que vous avez spécifiés dans la commande `docker build`.
   + Remplacez `<ECRrepositoryUri>` par l’`repositoryUri` que vous avez copié. Assurez-vous d’inclure `:latest` à la fin de l’URI.

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

   Exemple :

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. Exécutez la commande [docker push](https://docs.docker.com/engine/reference/commandline/push/) pour déployer votre image locale dans le référentiel Amazon ECR. Assurez-vous d’inclure `:latest` à la fin de l’URI du référentiel.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. [Créez un rôle d’exécution](lambda-intro-execution-role.md#permissions-executionrole-api) pour la fonction, si vous n’en avez pas déjà un. Vous aurez besoin de l’Amazon Resource Name (ARN) du rôle à l’étape suivante.

1. Créez la fonction Lambda. Pour `ImageUri`, indiquez l’URI du référentiel mentionné précédemment. Assurez-vous d’inclure `:latest` à la fin de l’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
   ```
**Note**  
Vous pouvez créer une fonction en utilisant une image d'un autre AWS compte, à condition que l'image se trouve dans la même région que la fonction Lambda. Pour de plus amples informations, veuillez consulter [Autorisations entre comptes Amazon ECR](images-create.md#configuration-images-xaccount-permissions).

1. Invoquer la fonction.

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

   Vous devriez obtenir une réponse comme celle-ci :

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

1. Pour voir la sortie de la fonction, consultez le fichier `response.json`.

Pour mettre à jour le code de fonction, vous devez créer à nouveau l'image, télécharger la nouvelle image dans le référentiel Amazon ECR, puis utiliser la [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)commande pour déployer l'image sur la fonction Lambda.

Lambda résout l’étiquette d’image en hachage d’image spécifique. Cela signifie que si vous pointez la balise d’image qui a été utilisée pour déployer la fonction vers une nouvelle image dans Amazon ECR, Lambda ne met pas automatiquement à jour la fonction pour utiliser la nouvelle image.

Pour déployer la nouvelle image sur la même fonction Lambda, vous devez utiliser la [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)commande, même si la balise d'image dans Amazon ECR reste la même. Dans l’exemple suivant, l’option `--publish` crée une version de la fonction à l’aide de l’image du conteneur mise à jour.

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

## Utilisation d’une autre image de base avec le client d’interface d’exécution
<a name="java-image-clients"></a>

Si vous utilisez une [image de base uniquement pour le système d’exploitation](images-create.md#runtimes-images-provided) ou une autre image de base, vous devez inclure le client d’interface d’exécution dans votre image. Le client d’interface d’exécution étend le[API de runtime](runtimes-api.md), qui gère l’interaction entre Lambda et votre code de fonction.

Installez le client d’interface d’exécution pour Java dans votre Dockerfile ou en tant que dépendance dans votre projet. Par exemple, pour installer le client d’interface d’exécution à l’aide du gestionnaire de packages Maven, ajoutez ce qui suit à votre fichier `pom.xml` :

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

Pour plus de détails sur le package, consultez [Client d’interface d’exécution AWS Lambda](https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-runtime-interface-client) dans le référentiel central Maven. Vous pouvez également consulter le code source du client de l'interface d'exécution dans le GitHub référentiel [AWS Lambda Java Support Libraries](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-runtime-interface-client).

L’exemple suivant montre comment créer une image de conteneur pour Java à l’aide d’une [image Amazon Corretto](https://gallery.ecr.aws/amazoncorretto/amazoncorretto). Amazon Corretto est une distribution sans coût, multiplateforme et prête à la production de Open Java Development Kit (OpenJDK). Le projet Maven inclut le client d’interface d’exécution en tant que dépendance.

### Conditions préalables
<a name="java-alt-prerequisites"></a>

Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
+ Java (par exemple, [Amazon Corretto](https://aws.amazon.com/corretto))
+ [Apache Maven](https://maven.apache.org/)
+ [AWS CLI version 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker) (version minimale 25.0.0)
+ Le [plug-in buildx](https://github.com/docker/buildx/blob/master/README.md) Docker.

### Création d’une image à partir d’une image de base alternative
<a name="java-alt-create"></a>

1. Créez un projet Maven. Les paramètres suivants sont obligatoires :
   + **groupId** : l’espace de noms complet du package de votre application.
   + **artifactId** : le nom de votre projet. Cette valeur devient le nom du répertoire de votre projet.

------
#### [ 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
   ```

------

1. Ouvrez le répertoire du projet.

   ```
   cd myapp
   ```

1. Ouvrez le fichier `pom.xml` et remplacez le contenu par ce qui suit. Ce fichier inclut le [aws-lambda-java-runtime-interface-client](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-runtime-interface-client) en tant que dépendance. Vous pouvez également installer le client de l’interface d’exécution dans le Dockerfile. Toutefois, l’approche la plus simple consiste à inclure la bibliothèque en tant que dépendance.

   ```
   <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>
   ```

1. Ouvrez le répertoire `myapp/src/main/java/com/example/myapp` et trouvez le fichier `App.java`. Il s’agit du code de la fonction Lambda. Remplacez le code par ce qui suit.  
**Example gestionnaire de fonctions**  

   ```
   package example;
   
   public class App {
       public static String sayHello() {
           return "Hello world!";
       }
   }
   ```

1. La commande `mvn -B archetype:generate` de l’étape 1 a également généré un cas de test fictif dans le répertoire `src/test`. Pour les besoins de ce tutoriel, passez outre l’exécution des tests en supprimant l’intégralité de ce répertoire `/test` généré.

1. Retournez au répertoire racine du projet, puis créez un nouveau Dockerfile. L’exemple de Dockerfile suivant utilise une [image Amazon Corretto](https://gallery.ecr.aws/amazoncorretto/amazoncorretto). Amazon Corretto est une distribution sans coût, multiplateforme et prête à la production d’OpenJDK.
   + Définissez la propriété `FROM` sur l’URI de l’image de base.
   + Définissez le `ENTRYPOINT` sur le module que vous souhaitez que le conteneur Docker exécute lorsqu’il démarre. Dans ce cas, le module est le client d’interface d’exécution.
   + Définir l’argument `CMD` pour le gestionnaire de la fonction Lambda.

   Notez que l’exemple de Dockerfile n’inclut pas d’[instruction USER](https://docs.docker.com/reference/dockerfile/#user). Lorsque vous déployez une image de conteneur sur Lambda, Lambda définit automatiquement un utilisateur Linux par défaut disposant d’autorisations de moindre privilège. Ceci est différent du comportement standard de Docker qui est défini par défaut par l’utilisateur `root` lorsqu’aucune instruction `USER` n’est fournie.  
**Example 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" ]
   ```

1. Générez l’image Docker à l’aide de la commande [docker build](https://docs.docker.com/engine/reference/commandline/build/). L’exemple suivant nomme l’image `docker-image` et lui donne la [balise](https://docs.docker.com/engine/reference/commandline/build/#tag) `test`. Pour rendre votre image compatible avec Lambda, vous devez utiliser l’option `--provenance=false`.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**Note**  
La commande spécifie l’option `--platform linux/amd64` pour garantir la compatibilité de votre conteneur avec l’environnement d’exécution Lambda, quelle que soit l’architecture de votre machine de génération. Si vous avez l'intention de créer une fonction Lambda à l'aide de l'architecture du jeu ARM64 d'instructions, veillez à modifier la commande pour utiliser l'`--platform linux/arm64`option à la place.

### (Facultatif) Testez l’image localement
<a name="java-alt-test"></a>

Utilisez l’[émulateur d’interface d’exécution](https://github.com/aws/aws-lambda-runtime-interface-emulator/) pour tester l’image localement. Vous pouvez [intégrer l’émulateur dans votre image](https://github.com/aws/aws-lambda-runtime-interface-emulator/?tab=readme-ov-file#build-rie-into-your-base-image) ou utiliser la procédure suivante pour l’installer sur votre machine locale.

**Pour installer et exécuter l’émulateur d’interface d’exécution sur votre ordinateur local**

1. Depuis le répertoire de votre projet, exécutez la commande suivante pour télécharger l'émulateur d'interface d'exécution (architecture x86-64) GitHub et l'installer sur votre machine 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
   ```

   Pour installer l'émulateur arm64, remplacez l'URL du GitHub référentiel dans la commande précédente par la suivante :

   ```
   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
   ```

   Pour installer l’émulateur arm64, remplacez `$downloadLink` par ce qui suit :

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------

1. Démarrez votre image Docker à l’aide de la commande **docker run**. Notez ce qui suit :
   + `docker-image` est le nom de l’image et `test` est la balise.
   + `/usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello` est le `ENTRYPOINT` suivi du `CMD` depuis votre Dockerfile.

------
#### [ Linux/macOS ]

   ```
   docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
       --entrypoint /aws-lambda/aws-lambda-rie \
       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 `
   docker-image:test `
       /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello
   ```

------

   Cette commande exécute l’image en tant que conteneur et crée un point de terminaison local à `localhost:9000/2015-03-31/functions/function/invocations`.
**Note**  
Si vous avez créé l'image Docker pour l'architecture du jeu ARM64 d'instructions, veillez à utiliser l'`--platform linux/arm64`option au lieu de`--platform linux/amd64`.

1. Publiez un événement au point de terminaison local.

------
#### [ Linux/macOS ]

   Sous Linux et macOS, exécutez la commande `curl` suivante :

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

   Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Si vous utilisez votre propre code de fonction plutôt que l’exemple de code de fonction, vous pouvez invoquer la fonction avec une charge utile JSON. Exemple :

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

------
#### [ PowerShell ]

   Dans PowerShell, exécutez la `Invoke-WebRequest` commande suivante :

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

   Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Si vous utilisez votre propre code de fonction plutôt que l’exemple de code de fonction, vous pouvez invoquer la fonction avec une charge utile JSON. Exemple :

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

------

1. Obtenez l’ID du conteneur.

   ```
   docker ps
   ```

1. Utilisez la commande [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) pour arrêter le conteneur. Dans cette commande, remplacez `3766c4ab331c` par l’ID du conteneur de l’étape précédente.

   ```
   docker kill 3766c4ab331c
   ```

### Déploiement de l’image
<a name="java-alt-deploy"></a>

**Pour charger l’image sur Amazon RIE et créer la fonction Lambda**

1. Exécutez la [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html)commande pour authentifier la CLI Docker auprès de votre registre Amazon ECR.
   + Définissez la `--region` valeur à l' Région AWS endroit où vous souhaitez créer le référentiel Amazon ECR.
   + `111122223333`Remplacez-le par votre Compte AWS identifiant.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. Créez un référentiel dans Amazon ECR à l’aide de la commande [create-repository](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html).

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**Note**  
Le référentiel Amazon ECR doit être Région AWS identique à la fonction Lambda.

   En cas de succès, vous obtenez une réponse comme celle-ci :

   ```
   {
       "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"
           }
       }
   }
   ```

1. Copiez le `repositoryUri` à partir de la sortie de l’étape précédente.

1. Exécutez la commande [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) pour étiqueter votre image locale dans votre référentiel Amazon ECR en tant que dernière version. Dans cette commande :
   + `docker-image:test` est le nom et la [balise](https://docs.docker.com/engine/reference/commandline/build/#tag) de votre image Docker. Il s’agit du nom et de la balise de l’image que vous avez spécifiés dans la commande `docker build`.
   + Remplacez `<ECRrepositoryUri>` par l’`repositoryUri` que vous avez copié. Assurez-vous d’inclure `:latest` à la fin de l’URI.

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

   Exemple :

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. Exécutez la commande [docker push](https://docs.docker.com/engine/reference/commandline/push/) pour déployer votre image locale dans le référentiel Amazon ECR. Assurez-vous d’inclure `:latest` à la fin de l’URI du référentiel.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. [Créez un rôle d’exécution](lambda-intro-execution-role.md#permissions-executionrole-api) pour la fonction, si vous n’en avez pas déjà un. Vous aurez besoin de l’Amazon Resource Name (ARN) du rôle à l’étape suivante.

1. Créez la fonction Lambda. Pour `ImageUri`, indiquez l’URI du référentiel mentionné précédemment. Assurez-vous d’inclure `:latest` à la fin de l’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
   ```
**Note**  
Vous pouvez créer une fonction en utilisant une image d'un autre AWS compte, à condition que l'image se trouve dans la même région que la fonction Lambda. Pour de plus amples informations, veuillez consulter [Autorisations entre comptes Amazon ECR](images-create.md#configuration-images-xaccount-permissions).

1. Invoquer la fonction.

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

   Vous devriez obtenir une réponse comme celle-ci :

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

1. Pour voir la sortie de la fonction, consultez le fichier `response.json`.

Pour mettre à jour le code de fonction, vous devez créer à nouveau l'image, télécharger la nouvelle image dans le référentiel Amazon ECR, puis utiliser la [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)commande pour déployer l'image sur la fonction Lambda.

Lambda résout l’étiquette d’image en hachage d’image spécifique. Cela signifie que si vous pointez la balise d’image qui a été utilisée pour déployer la fonction vers une nouvelle image dans Amazon ECR, Lambda ne met pas automatiquement à jour la fonction pour utiliser la nouvelle image.

Pour déployer la nouvelle image sur la même fonction Lambda, vous devez utiliser la [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)commande, même si la balise d'image dans Amazon ECR reste la même. Dans l’exemple suivant, l’option `--publish` crée une version de la fonction à l’aide de l’image du conteneur mise à jour.

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

# Utilisation de couches pour les fonctions Lambda Java
<a name="java-layers"></a>

Utilisez les [couches Lambda](chapter-layers.md) pour empaqueter le code et les dépendances que vous souhaitez réutiliser dans plusieurs fonctions. Les couches contiennent généralement des dépendances de bibliothèque, une [exécution personnalisée](runtimes-custom.md), ou des fichiers de configuration. La création d’une couche implique trois étapes générales :

1. Empaquetez le contenu de votre couche. Cela signifie créer une archive de fichiers .zip contenant les dépendances que vous souhaitez utiliser dans vos fonctions.

1. Créez la couche dans Lambda.

1. Ajoutez la couche à vos fonctions.

**Topics**
+ [Empaqueter le contenu de votre couche](#java-layers-package)
+ [Créer la couche dans Lambda](#publishing-layer)
+ [Ajouter la couche à votre fonction](#java-layer-adding)

## Empaqueter le contenu de votre couche
<a name="java-layers-package"></a>

Pour créer une couche, regroupez vos packages dans une archive (fichier .zip) répondant aux exigences suivantes :
+ Assurez-vous que la version Java à laquelle Maven ou Gradle fait référence est identique à la version Java de la fonction que vous souhaitez déployer. Par exemple, pour une fonction Java 25, la `mvn -v` commande doit répertorier Java 25 dans la sortie.
+ Vos dépendances doivent être stockées dans le répertoire `java/lib`, à la racine du fichier .zip. Pour de plus amples informations, veuillez consulter [Chemins d’accès de couche pour chaque exécution Lambda](packaging-layers.md#packaging-layers-paths).
+ Les packages de votre couche doivent être compatibles avec Linux. Les fonctions Lambda s’exécutent sur Amazon Linux.

Vous pouvez créer des couches contenant des bibliothèques Java tierces ou vos propres modules et packages Java. La procédure suivante utilise Maven. Vous pouvez également utiliser Gradle pour empaqueter le contenu de votre couche.

**Créer une couche à l’aide de dépendances Maven**

1. Créez un projet Apache Maven avec un fichier `pom.xml` qui définit vos dépendances.

   L’exemple suivant inclut [Jackson Databind](https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind) pour le traitement JSON. La `<build>` section utilise le [maven-dependency-plugin](https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-dependency-plugin)pour créer des fichiers JAR distincts pour chaque dépendance au lieu de les regrouper dans un seul uber-jar. Si vous souhaitez créer un uber-jar, utilisez le. [maven-shade-plugin](https://maven.apache.org/plugins/maven-shade-plugin/)  
**Example pom.xml**  

   ```
   <dependencies>
       <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId>
           <version>2.17.0</version>
       </dependency>
   </dependencies>
   
   <build>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.13.0</version>
               <configuration>
                   <source>21</source>
                   <target>21</target>
                   <release>21</release>
               </configuration>
           </plugin>
           
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-dependency-plugin</artifactId>
               <version>3.6.1</version>
               <executions>
                   <execution>
                       <id>copy-dependencies</id>
                       <phase>package</phase>
                       <goals>
                           <goal>copy-dependencies</goal>
                       </goals>
                       <configuration>
                           <outputDirectory>${project.build.directory}/lib</outputDirectory>
                       </configuration>
                   </execution>
               </executions>
           </plugin>
       </plugins>
   </build>
   ```

1. Générez le projet. Cette commande crée tous les fichiers JAR de dépendance dans le répertoire `target/lib/`.

   ```
   mvn clean package
   ```

1. Créez la structure de répertoires requise pour votre couche :

   ```
   mkdir -p java/lib
   ```

1. Copiez les fichiers JAR de dépendance dans le répertoire `java/lib` :

   ```
   cp target/lib/*.jar java/lib/
   ```

1. Compressez le contenu de la couche :

------
#### [ Linux/macOS ]

   ```
   zip -r layer.zip java/
   ```

------
#### [ PowerShell ]

   ```
   Compress-Archive -Path .\java -DestinationPath .\layer.zip
   ```

------

   La structure de répertoire de votre fichier .zip devrait se présenter comme suit :

   ```
   java/              
   └── lib/
       ├── jackson-databind-2.17.0.jar
       ├── jackson-core-2.17.0.jar
       └── jackson-annotations-2.17.0.jar
   ```
**Note**  
Assurez-vous que votre fichier .zip inclut le répertoire `java` au niveau racine avec `lib` à l’intérieur. Cette structure garantit que Lambda peut localiser et importer vos bibliothèques. Chaque dépendance est conservée dans un fichier JAR distinct plutôt que regroupée dans un fichier uber-jar.

## Créer la couche dans Lambda
<a name="publishing-layer"></a>

Vous pouvez publier votre couche à l'aide de la console Lambda AWS CLI ou de la console Lambda.

------
#### [ AWS CLI ]

Exécutez la [publish-layer-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-layer-version.html) AWS CLI commande pour créer la couche Lambda :

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

Le paramètre [compatible runtimes](https://docs.aws.amazon.com/lambda/latest/api/API_PublishLayerVersion.html#lambda-PublishLayerVersion-request-CompatibleRuntimes) est facultatif. Lorsqu’il est spécifié, Lambda utilise ce paramètre pour filtrer les couches dans la console Lambda.

------
#### [ Console ]

**Pour créer une couche (console)**

1. Ouvrez la [page Couches](https://console.aws.amazon.com/lambda/home#/layers) de la console Lambda.

1. Sélectionnez **Créer un calque**.

1. Choisissez **Charger un fichier .zip**, puis chargez l’archive .zip que vous avez créée précédemment.

1. (Facultatif) Pour **Environnements d’exécution compatibles**, choisissez l’environnement d’exécution Java qui correspond à la version de Java que vous avez utilisée pour créer votre couche.

1. Choisissez **Créer**.

------

## Ajouter la couche à votre fonction
<a name="java-layer-adding"></a>

------
#### [ AWS CLI ]

Pour associer la couche à votre fonction, exécutez la [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) AWS CLI commande. Utilisez l’ARN de la couche pour le paramètre `--layers`. L’ARN doit spécifier la version (par exemple, `arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1`). Pour de plus amples informations, veuillez consulter [Couches et versions de couches](chapter-layers.md#lambda-layer-versions).

```
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'**cli-binary-format**option est obligatoire si vous utilisez AWS CLI la version 2. Pour faire de ce paramètre le paramètre par défaut, exécutez `aws configure set cli-binary-format raw-in-base64-out`. Pour plus d’informations, consultez les [options de ligne de commande globales AWS CLI prises en charge](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) dans le *Guide de l’utilisateur AWS Command Line Interface version 2*.

------
#### [ Console ]

**Ajouter une couche à une fonction**

1. Ouvrez la [page Functions](https://console.aws.amazon.com/lambda/home#/functions) (Fonctions) de la console Lambda.

1. Choisissez la fonction.

1. Faites défiler jusqu’à la section **Couches**, puis choisissez **Ajouter une couche**.

1. Sous **Choisir une couche**, sélectionnez **Couches personnalisées**, puis choisissez votre couche.
**Note**  
Si vous n’avez pas ajouté d’[environnement d’exécution compatible](https://docs.aws.amazon.com/lambda/latest/api/API_PublishLayerVersion.html#lambda-PublishLayerVersion-request-CompatibleRuntimes) lors de la création de la couche, celle-ci ne sera pas répertoriée ici. Vous pouvez spécifier l’ARN de la couche à la place.

1. Choisissez **Ajouter**.

------

# Personnalisation de la sérialisation pour les fonctions Lambda Java
<a name="java-custom-serialization"></a>

Les [environnements d’exécution gérés par Lambda Java](lambda-java.md#java-runtimes) prennent en charge la sérialisation personnalisée pour les événements JSON. La sérialisation personnalisée peut simplifier votre code et potentiellement améliorer les performances.

**Topics**
+ [Cas d’utilisation de la sérialisation personnalisée](#custom-serialization-use-cases)
+ [Implémentation de sérialisation personnalisée](#implement-custom-serialization)
+ [Test de la sérialisation personnalisée](#test-custom-serialization)

## Cas d’utilisation de la sérialisation personnalisée
<a name="custom-serialization-use-cases"></a>

Lorsque votre fonction Lambda est invoquée, les données d’événement d’entrée doivent être désérialisées dans un objet Java, et la sortie de votre fonction doit être sérialisée à nouveau dans un format pouvant être renvoyé en tant que réponse de la fonction. Les environnements d’exécution gérés par Lambda Java fournissent des fonctionnalités de sérialisation et de désérialisation par défaut qui fonctionnent bien pour gérer les données utiles d’événements provenant de divers services AWS, tels qu’Amazon API Gateway et Amazon Simple Queue Service (Amazon SQS). Pour utiliser ces événements d’intégration de services dans votre fonction, ajoutez la dépendance [aws-java-lambda-events](https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-events) à votre projet. Cette bibliothèque AWS contient des objets Java représentant ces événements d’intégration de services.

Vous pouvez également utiliser vos propres objets pour représenter l’événement JSON que vous transmettez à votre fonction Lambda. L’environnement d’exécution géré tente de sérialiser le JSON vers une nouvelle instance de votre objet avec son comportement par défaut. Si le sérialiseur par défaut n’a pas le comportement souhaité pour votre cas d’utilisation, utilisez la sérialisation personnalisée.

Par exemple, si votre gestionnaire de fonctions attend une classe `Vehicle` en entrée, avec la structure suivante :

```
public class Vehicle {
    private String vehicleType;
    private long vehicleId;
}
```

Cependant, les données utiles de l’événement JSON ressemblent à ceci :

```
{
    "vehicle-type": "car",
    "vehicleID": 123
}
```

Dans ce scénario, la sérialisation par défaut dans l’environnement d’exécution géré s’attend à ce que les noms de propriété JSON correspondent au camel case des noms de propriété de classe Java (`vehicleType`, `vehicleId`). Dans la mesure où les noms des propriétés dans l’événement JSON ne sont pas écrits en camel case (`vehicle-type`,`vehicleID`), vous devez utiliser une sérialisation personnalisée.

## Implémentation de sérialisation personnalisée
<a name="implement-custom-serialization"></a>

Utilisez une [interface de fournisseur](https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html) de services pour charger le sérialiseur de votre choix au lieu de la logique de sérialisation par défaut de l’environnement d’exécution géré. Vous pouvez sérialiser vos données utiles d’événements JSON directement dans des objets Java, à l’aide de l’interface standard `RequestHandler`.

**Pour utiliser la sérialisation personnalisée dans votre fonction Lambda Java**

1. Ajoutez la bibliothèque [aws-lambda-java-core](https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core) en tant que dépendance. Cette bibliothèque inclut l’interface [CustomPojoSerializer](https://github.com/aws/aws-lambda-java-libs/blob/main/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/CustomPojoSerializer.java), ainsi que d’autres définitions d’interface permettant de travailler avec Java dans Lambda.

1. Créez un fichier nommé `com.amazonaws.services.lambda.runtime.CustomPojoSerializer` dans votre répertoire `src/main/resources/META-INF/services/` de votre projet.

1. Dans ce fichier, spécifiez le nom complet de votre implémentation de sérialiseur personnalisé, qui doit implémenter l’interface `CustomPojoSerializer`. Exemple :

   ```
   com.mycompany.vehicles.CustomLambdaSerialzer
   ```

1. Implémentez l’interface `CustomPojoSerializer` pour fournir votre logique de sérialisation personnalisée.

1. Utilisez l’interface standard `RequestHandler` de votre fonction Lambda. L’environnement d’exécution géré utilisera votre sérialiseur personnalisé.

Pour d’avantage d’exemples d’implémenation de la sérialisation personnalisée à l’aide de bibliothèques populaires telles que fastJson, Gson, Moshi et jackson-jr, consultez l’exemple [custom-serialization](https://github.com/aws/aws-lambda-java-libs/tree/main/samples/custom-serialization) dans le référentiel GitHub AWS.

## Test de la sérialisation personnalisée
<a name="test-custom-serialization"></a>

Testez votre fonction pour vous assurer que votre logique de sérialisation et de désérialisation fonctionne comme prévu. Vous pouvez utiliser l’interface de ligne de commande AWS Serverless Application Model (AWS SAM CLI) pour émuler l’invocation de vos données utiles Lambda. Cela peut vous aider à tester et à itérer rapidement votre fonction lorsque vous introduisez un sérialiseur personnalisé.

1. Créez un fichier avec les données utiles de l’événement JSON avec lesquelles vous souhaitez invoquer votre fonction, puis appelez le AWS SAM CLI.

1. Exécutez la commande [sam local invoke](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-invoke.html ) pour invoquer votre fonction localement. Exemple :

   ```
   sam local invoke -e src/test/resources/event.json
   ```

Pour plus d’informations, consultez [Locally invoke Lambda functions with AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-using-invoke.html).

# Personnalisation du comportement de démarrage de l’environnement d’exécution Java pour les fonctions Lambda
<a name="java-customization"></a>

Cette page décrit les paramètres spécifiques aux fonctions Java dans AWS Lambda. Vous pouvez utiliser ces paramètres pour personnaliser le comportement de démarrage de l'exécution Java. Cela permet de réduire le temps de latence et d'améliorer les performances globales de la fonction, sans avoir à modifier le code.

**Topics**
+ [Présentation de la variable d’environnement `JAVA_TOOL_OPTIONS`](#java-tool-options)
+ [Patch Log4j pour Log4Shell](#log4shell-patch)
+ [Ahead-of-Time (AOT) et caches CDS](#aot-cds-caches)

## Présentation de la variable d’environnement `JAVA_TOOL_OPTIONS`
<a name="java-tool-options"></a>

Sur Java, Lambda prend en charge la variable d'environnement `JAVA_TOOL_OPTIONS` pour définir des variables de ligne de commande supplémentaires dans Lambda. Vous pouvez utiliser cette variable d'environnement de différentes manières, par exemple pour personnaliser les paramètres de compilation par niveaux. L'exemple suivant montre comment utiliser la variable d'environnement `JAVA_TOOL_OPTIONS` pour ce cas d'utilisation.

### Exemple : personnalisation des paramètres de compilation par niveaux
<a name="tiered-compilation"></a>

La compilation par niveaux est une fonctionnalité de la JVM (Java Virtual Machine). Vous pouvez utiliser des paramètres de compilation hiérarchisés spécifiques pour tirer le meilleur parti des compilateurs de la JVM just-in-time (JIT). Généralement, le compilateur C1 est optimisé pour un démarrage rapide. Le compilateur C2 est optimisé pour obtenir les meilleures performances globales, mais il utilise également plus de mémoire et prend plus de temps pour y parvenir. Il existe cinq niveaux différents de compilation par niveaux. Au niveau 0, la JVM interprète le bytecode Java. Au niveau 4, la JVM utilise le compilateur C2 pour analyser les données de profilage collectées lors du démarrage de l'application. Au fil du temps, elle surveille l'utilisation du code pour identifier les meilleures optimisations.

La personnalisation du niveau de compilation à plusieurs niveaux peut vous aider à optimiser les performances de vos fonctions Java. Pour les petites fonctions qui s'exécutent rapidement, le réglage de la compilation hiérarchisée au niveau 1 peut contribuer à améliorer les performances de démarrage à froid en faisant en sorte que la JVM utilise le compilateur C1. Ce paramètre produit rapidement du code natif optimisé, mais il ne génère aucune donnée de profilage et n'utilise jamais le compilateur C2. Pour les fonctions plus volumineuses nécessitant des calculs intensifs, le fait de définir la compilation hiérarchisée au niveau 4 maximise les performances globales au détriment d'une consommation de mémoire supplémentaire et d'un travail d'optimisation supplémentaire lors des premiers appels après le provisionnement de chaque environnement d'exécution Lambda.

Pour les environnements d'exécution Java 11 et inférieurs, Lambda utilise les paramètres de compilation hiérarchisée par défaut de la JVM. Pour Java 17 et Java 21, Lambda configure la JVM pour arrêter la compilation hiérarchisée au niveau 1 par défaut. À partir de Java 25, Lambda arrête toujours la compilation hiérarchisée au niveau 1 par défaut, sauf en cas d'utilisation SnapStart ou de provisionnement de la concurrence, auquel cas les paramètres JVM par défaut sont utilisés. Cela améliore les performances SnapStart et la simultanéité provisionnée sans entraîner de pénalité de démarrage à froid, car la compilation à plusieurs niveaux est effectuée en dehors du chemin d'appel dans ces cas. Pour optimiser cet avantage, vous pouvez utiliser l'amorçage, c'est-à-dire l'exécution de chemins de code lors de l'initialisation de la fonction pour déclencher le JIT avant de prendre le SnapStart snapshot ou lorsque les environnements d'exécution de la concurrence provisionnée sont préprovisionnés. Pour plus d'informations, consultez le billet de blog [Optimisation des performances de démarrage à froid de AWS Lambda à l'aide de stratégies d'amorçage avancées avec](https://aws.amazon.com/blogs/compute/optimizing-cold-start-performance-of-aws-lambda-using-advanced-priming-strategies-with-snapstart/). SnapStart

**Pour personnaliser les paramètres de compilation par niveaux (console)**

1. Ouvrez la [page Fonctions](https://console.aws.amazon.com/lambda/home#/functions) de la console Lambda.

1. Choisissez une fonction Java pour laquelle vous souhaitez personnaliser la compilation par niveau.

1. Choisissez l'onglet **Configuration**, puis **Variables d'environnement** dans le menu de gauche.

1. Choisissez **Modifier**.

1. Choisissez **Ajouter une variable d’environnement**.

1.  Pour Nom de la clé, saisissez `JAVA_TOOL_OPTIONS`. Pour Valeur, saisissez `-XX:+TieredCompilation -XX:TieredStopAtLevel=1`.   
![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/java-tool-options-tiered-compilation.png)

1. Choisissez **Enregistrer**.

**Note**  
Vous pouvez également utiliser Lambda SnapStart pour atténuer les problèmes de démarrage à froid. SnapStartutilise des instantanés mis en cache de votre environnement d'exécution pour améliorer de manière significative les performances de démarrage. Pour plus d'informations sur les SnapStart fonctionnalités, les limitations et les régions prises en charge, consultez[Améliorer les performances de démarrage avec Lambda SnapStart](snapstart.md).

### Exemple : personnalisation du comportement de GC à l'aide de JAVA\$1TOOL\$1OPTIONS
<a name="gc-behavior"></a>

Les exécutions Java 11 utilisent le récupérateur de mémoire (GC) [Serial](https://docs.oracle.com/en/java/javase/18/gctuning/available-collectors.html#GUID-45794DA6-AB96-4856-A96D-FDE5F7DEE498) pour la récupération de mémoire. Par défaut, les exécutions Java 17 utilisent également le GC Serial. Toutefois, avec Java 17, vous pouvez également utiliser la variable d'environnement `JAVA_TOOL_OPTIONS` pour modifier le GC par défaut. Vous pouvez choisir entre le GC Parallel et le [GC Shenandoah](https://wiki.openjdk.org/display/shenandoah/Main).

Par exemple, si votre charge de travail utilise plus de mémoire et de multiples CPUs, pensez à utiliser le Parallel GC pour de meilleures performances. Vous pouvez le faire en ajoutant ce qui suit à la valeur de votre variable d'environnement `JAVA_TOOL_OPTIONS` :

```
-XX:+UseParallelGC
```

Si votre charge de travail comporte de nombreux objets de courte durée, vous pouvez bénéficier d'une réduction de la consommation de mémoire en activant le mode générationnel du ramasse-miettes Shenandoah introduit dans Java 25. Pour ce faire, ajoutez ce qui suit à la valeur de votre variable d'`JAVA_TOOL_OPTIONS`environnement :

```
-XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational
```

## Patch Log4j pour Log4Shell
<a name="log4shell-patch"></a>

Les environnements d'exécution Lambda pour Java 8, 11, 17 et 21 incluent un correctif pour atténuer la vulnérabilité Log4Shell (CVE-2021-44228) dans Log4j, un framework de journalisation Java populaire. Ce correctif entraîne une surcharge des performances de démarrage à froid. Si vous utilisez une version corrigée de Log4j (version 2.17.0 ou ultérieure), vous pouvez désactiver ce correctif pour améliorer les performances de démarrage à froid. Pour désactiver le correctif, définissez la variable d'`AWS_LAMBDA_DISABLE_CVE_2021_44228_PROTECTION`environnement sur`true`.

À partir de Java 25, les environnements d'exécution Lambda n'incluent plus le correctif Log4Shell. Vous devez vérifier que vous utilisez Log4j version 2.17.0 ou ultérieure.

## Ahead-of-Time (AOT) et caches CDS
<a name="aot-cds-caches"></a>

À partir de Java 25, le moteur d'exécution Lambda inclut un cache Ahead-of-Time (AOT) pour le client d'interface d'exécution Java (RIC), un composant d'exécution qui interroge activement les événements provenant de l'API Lambda Runtime. Cela améliore les performances de démarrage à froid.

Les caches AOT sont spécifiques à une version de machine virtuelle Java. Lorsque Lambda met à jour le runtime géré, il met également à jour le cache AOT du RIC. Toutefois, si vous déployez vos propres caches AOT, ceux-ci peuvent être invalidés ou entraîner un comportement inattendu après une mise à jour d'exécution. Nous recommandons donc vivement de ne pas utiliser les caches AOT lorsque vous utilisez des environnements d'exécution gérés. Pour utiliser les caches AOT, vous devez déployer vos fonctions à l'aide d'images de conteneur.

Les caches AOT ne peuvent pas être utilisés avec les caches de partage de données de classe (CDS). Si vous déployez des caches CDS dans votre fonction Lambda, Lambda désactive le cache AOT.

# Utilisation de l’objet de contexte Lambda pour récupérer les informations de la fonction Java
<a name="java-context"></a>

Lorsque Lambda exécute votre fonction, il transmet un objet contexte au [gestionnaire](java-handler.md). Cet objet fournit des méthodes et des propriétés fournissant des informations sur l’invocation, la fonction et l’environnement d’exécution.

**Méthodes de contexte**
+ `getRemainingTimeInMillis()` – Renvoie le nombre de millisecondes restant avant l'expiration de l'exécution.
+ `getFunctionName()` – Renvoie le nom de la fonction Lambda.
+ `getFunctionVersion()` – Renvoie la [version](configuration-versions.md) de la fonction.
+ `getInvokedFunctionArn()` – Renvoie l'Amazon Resource Name (ARN) utilisé pour invoquer la fonction. Indique si l'appelant a spécifié un numéro de version ou un alias.
+ `getMemoryLimitInMB()` – Renvoie la quantité de mémoire allouée à la fonction.
+ `getAwsRequestId()` – Renvoie l'identifiant de la demande d'invocation.
+ `getLogGroupName()` – Renvoie le groupe de journaux pour la fonction.
+ `getLogStreamName()` – Renvoie le flux de journal de l'instance de fonction.
+ `getIdentity()` – (applications mobiles) Renvoie des informations sur l'identité Amazon Cognito qui a autorisé la demande.
+ `getClientContext()` – (applications mobiles) Renvoie le contexte client fourni à Lambda par l'application client.
+ `getLogger()` – Renvoie l'[objet enregistreur](java-logging.md) pour la fonction.

L'exemple suivant montre une fonction qui utilise l'objet contexte pour accéder à l'enregistreur Lambda.

**Example [handler.java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-basic/src/main/java/example/Handler.java)**  

```
package example;

import [com.amazonaws.services.lambda.runtime.Context](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/Context.java);
import [com.amazonaws.services.lambda.runtime.LambdaLogger](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/LambdaLogger.java);
import [com.amazonaws.services.lambda.runtime.RequestHandler](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/RequestHandler.java);

import java.util.Map;

// Handler value: example.Handler
public class Handler implements RequestHandler<Map<String,String>, Void>{

  @Override
  public Void handleRequest(Map<String,String> event, Context context)
  {
    LambdaLogger logger = context.getLogger();
    logger.log("EVENT TYPE: " + event.getClass());
    return null;
  }
}
```

La fonction enregistre le type de classe de l’événement entrant avant de le renvoyer `null`.

**Example sortie de journal**  

```
EVENT TYPE: class java.util.LinkedHashMap
```

L'interface de l'objet contexte est disponible dans la bibliothèque [aws-lambda-java-core](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-core). Vous pouvez implémenter cette interface pour créer une classe de contexte à des fins de test. L'exemple suivant montre une classe de contexte qui renvoie des valeurs factices pour la plupart des propriétés et un enregistreur de test opérationnel.

**Example [src/test/java/example/TestContext.java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-basic/src/test/java/example/TestContext.java)**  

```
package example;

import [com.amazonaws.services.lambda.runtime.Context](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/Context.java);
import [com.amazonaws.services.lambda.runtime.CognitoIdentity](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/CognitoIdentity.java);
import [com.amazonaws.services.lambda.runtime.ClientContext](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/ClientContext.java);
import [com.amazonaws.services.lambda.runtime.LambdaLogger](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/LambdaLogger.java);

public class TestContext implements Context{

  public TestContext() {}
  public String getAwsRequestId(){
    return new String("495b12a8-xmpl-4eca-8168-160484189f99");
  }
  public String getLogGroupName(){
    return new String("/aws/lambda/my-function");
  }
  public String getLogStreamName(){
    return new String("2020/02/26/[$LATEST]704f8dxmpla04097b9134246b8438f1a");
  }
  public String getFunctionName(){
    return new String("my-function");
  }
  public String getFunctionVersion(){
    return new String("$LATEST");
  }
  public String getInvokedFunctionArn(){
    return new String("arn:aws:lambda:us-east-2:123456789012:function:my-function");
  }
  public CognitoIdentity getIdentity(){
    return null;
  }
  public ClientContext getClientContext(){
    return null;
  }
  public int getRemainingTimeInMillis(){
    return 300000;
  }
  public int getMemoryLimitInMB(){
    return 512;
  }
  public LambdaLogger getLogger(){
    return new TestLogger();
  }

}
```

Pour de plus amples informations sur la journalisation, veuillez consulter [Journalisation et surveillance des fonctions Lambda Java](java-logging.md).

## Contexte dans des exemples d'applications
<a name="java-context-samples"></a>

Le référentiel GitHub de ce guide comprend des exemples d'applications qui démontrent l'utilisation de l'objet contextuel. Chaque exemple d'application inclut des scripts facilitant le déploiement et le nettoyage, un modèle AWS Serverless Application Model (AWS SAM) et des ressources de support.

**Exemples d’applications Lambda en Java**
+ [example-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/example-java) : fonction Java qui montre comment utiliser Lambda pour traiter les commandes. Cette fonction montre comment définir et désérialiser un objet d’événement d’entrée personnalisé, utiliser le SDK AWS et enregistrer les sorties.
+ [java-basic](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-basic) – Ensemble de fonctions Java minimales avec des tests unitaires et une configuration de journalisation variable.
+ [java events](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-events) – Ensemble de fonctions Java contenant du code squelette permettant de gérer les événements de divers services tels qu’Amazon API Gateway, Amazon SQS et Amazon Kinesis. Ces fonctions utilisent la dernière version (3.0.0 et ultérieure) de la bibliothèque [aws-lambda-java-events](java-package.md). Ces exemples ne nécessitent pas le kit SDK AWS comme dépendance.
+ [s3-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/s3-java) – Fonction Java qui traite les événements de notification d’Amazon S3 et utilise la bibliothèque de classes Java (JCL) pour créer des miniatures à partir de fichiers d’image chargés.
+ [layer-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/layer-java) : fonction Java qui illustre comment utiliser une couche Lambda pour empaqueter les dépendances séparément du code de votre fonction principale.

# Journalisation et surveillance des fonctions Lambda Java
<a name="java-logging"></a>

AWS Lambda surveille automatiquement les fonctions Lambda et envoie des entrées de journal à Amazon. CloudWatch Votre fonction Lambda est fournie avec un groupe de CloudWatch journaux Logs et un flux de journaux pour chaque instance de votre fonction. L’environnement d’exécution Lambda envoie des détails sur chaque invocation et d’autres sorties provenant du code de votre fonction au flux de journaux. Pour plus d'informations sur CloudWatch les journaux, consultez[Envoi automatique des journaux de la fonction Lambda à CloudWatch Logs](monitoring-cloudwatchlogs.md).

Pour produire des journaux à partir de votre code de fonction, vous pouvez utiliser des méthodes sur [java.lang.System](https://docs.oracle.com/javase/8/docs/api/java/lang/System.html), ou tout module de journalisation qui écrit sur stdout ou stderr.

**Topics**
+ [Création d’une fonction qui renvoie des journaux](#java-logging-output)
+ [Utilisation des contrôles de journalisation avancés de Lambda avec Java](#java-logging-advanced)
+ [Implémentation de la journalisation avancée avec Log4j2 et J SLF4](#java-logging-log4j2)
+ [Utilisation d’autres outils et bibliothèques de journalisation](#java-tools-libraries)
+ [Utilisation de Powertools pour AWS Lambda (Java) et AWS SAM pour la journalisation structurée](#java-logging-sam)
+ [Affichage des journaux dans la console Lambda](#java-logging-console)
+ [Afficher les journaux dans la CloudWatch console](#java-logging-cwconsole)
+ [Afficher les journaux à l'aide de AWS Command Line Interface (AWS CLI)](#java-logging-cli)
+ [Suppression de journaux](#java-logging-delete)
+ [Exemple de code de journalisation](#java-logging-samples)

## Création d’une fonction qui renvoie des journaux
<a name="java-logging-output"></a>

Pour générer les journaux à partir de votre code de fonction, vous pouvez utiliser des méthodes sur [java.lang.System ](https://docs.oracle.com/javase/8/docs/api/java/lang/System.html) ou n’importe quelle bibliothèque de journalisation qui écrit dans `stdout` ou `stderr`. La [aws-lambda-java-core](java-package.md)bibliothèque fournit une classe d'enregistreur nommée à `LambdaLogger` laquelle vous pouvez accéder depuis l'objet de contexte. La classe d’enregistreur prend en charge les journaux multilignes.

L’exemple suivant utilise l’enregistreur `LambdaLogger` fourni par l’objet de contexte.

**Example handler.java**  

```
// Handler value: example.Handler
public class Handler implements RequestHandler<Object, String>{
  Gson gson = new GsonBuilder().setPrettyPrinting().create();
  @Override
  public String handleRequest(Object event, Context context)
  {
    LambdaLogger logger = context.getLogger();
    String response = new String("SUCCESS");
    // log execution details
    logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv()));
    logger.log("CONTEXT: " + gson.toJson(context));
    // process event
    logger.log("EVENT: " + gson.toJson(event));
    return response;
  }
}
```

**Example format des journaux**  

```
START RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0 Version: $LATEST
ENVIRONMENT VARIABLES: 
{
    "_HANDLER": "example.Handler",
    "AWS_EXECUTION_ENV": "AWS_Lambda_java8",
    "AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "512",
    ...
}
CONTEXT: 
{
    "memoryLimit": 512,
    "awsRequestId": "6bc28136-xmpl-4365-b021-0ce6b2e64ab0",
    "functionName": "java-console",
    ...
}
EVENT:
{
  "records": [
    {
      "messageId": "19dd0b57-xmpl-4ac1-bd88-01bbb068cb78",
      "receiptHandle": "MessageReceiptHandle",
      "body": "Hello from SQS!",
       ...
    }
  ]
}
END RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0
REPORT RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0	Duration: 198.50 ms	Billed Duration: 724 ms	Memory Size: 512 MB	Max Memory Used: 90 MB	Init Duration: 524.75 ms
```

L’environnement d’exécution Java enregistre les lignes `START`, `END` et `REPORT` pour chaque invocation. La ligne de rapport fournit les détails suivants.

**Champs de données de la ligne REPORT**
+ **RequestId**— L'identifiant de demande unique pour l'invocation.
+ **Duration** – Temps que la méthode de gestion du gestionnaire de votre fonction a consacré au traitement de l’événement.
+ **Billed Duration** : temps facturé pour l’invocation.
+ **Memory Size** – Quantité de mémoire allouée à la fonction.
+ **Max Memory Used** – Quantité de mémoire utilisée par la fonction. Lorsque les appels partagent un environnement d’exécution, Lambda indique la mémoire maximale utilisée pour toutes les invocations. Ce comportement peut entraîner une valeur signalée plus élevée que prévu.
+ **Init Duration** : pour la première requête servie, temps qu’il a pris à l’exécution charger la fonction et exécuter le code en dehors de la méthode du gestionnaire.
+ **XRAY TraceId** — Pour les demandes suivies, l'[ID de AWS X-Ray trace.](services-xray.md)
+ **SegmentId**— Pour les demandes tracées, l'identifiant du segment X-Ray.
+ **Sampled** : pour les demandes suivies, résultat de l’échantillonnage.

## Utilisation des contrôles de journalisation avancés de Lambda avec Java
<a name="java-logging-advanced"></a>

Pour mieux contrôler la manière dont les journaux de vos fonctions sont capturés, traités et consommés, vous pouvez configurer les options de journalisation suivantes pour les environnements d’exécution Java pris en charge :
+ **Format de journal** : choisissez entre le format texte brut et le format JSON structuré pour les journaux de votre fonction
+ **Niveau du journal** : pour les journaux au format JSON, choisissez le niveau de détail des journaux auxquels Lambda envoie CloudWatch, par exemple ERROR, DEBUG ou INFO
+ **Groupe de journaux** : choisissez le groupe de CloudWatch journaux auquel votre fonction envoie les journaux

Pour plus d’informations sur ces options de journalisation et pour savoir comment configurer votre fonction pour les utiliser, consultez [Configuration de commandes de journalisation avancées pour votre fonction Lambda](monitoring-logs.md#monitoring-cloudwatchlogs-advanced).

Pour utiliser le format de journal et les options de niveau de journal avec vos fonctions Java Lambda, consultez les instructions des sections suivantes.

### Utilisation du format de journal JSON structuré avec Java
<a name="java-logging-advanced-JSON"></a>

Si vous sélectionnez JSON pour le format de journal de votre fonction, Lambda envoie les journaux en utilisant la classe `LambdaLogger` sous forme de JSON structuré. Chaque objet de journal JSON contient au moins quatre paires clé-valeur avec les clés suivantes :
+ `"timestamp"` - heure à laquelle le message de journal a été généré
+ `"level"` - niveau de journalisation attribué au message
+ `"message"` - contenu du message de journal
+ `"AWSrequestId"` - identifiant unique de la demande pour l’invocation de la fonction

Selon la méthode de journalisation que vous utilisez, les sorties de journal de votre fonction capturées au format JSON peuvent également contenir des paires clé-valeur supplémentaires.

Pour attribuer un niveau aux journaux que vous créez à l’aide de l’enregistreur `LambdaLogger`, vous devez fournir un argument `LogLevel` dans votre commande de journalisation, comme illustré dans l’exemple suivant.

**Example Code de journalisation Java**  

```
LambdaLogger logger = context.getLogger();
logger.log("This is a debug log", LogLevel.DEBUG);
```

Cette sortie de journal produite par cet exemple de code serait capturée dans CloudWatch Logs comme suit :

**Example Enregistrement de journaux JSON**  

```
{
    "timestamp":"2023-11-01T00:21:51.358Z",
    "level":"DEBUG",
    "message":"This is a debug log",
    "AWSrequestId":"93f25699-2cbf-4976-8f94-336a0aa98c6f"
}
```

Si vous n’attribuez aucun niveau à la sortie de votre journal, Lambda lui attribuera automatiquement le niveau INFO.

Si votre code utilise déjà une autre bibliothèque de journaux pour produire des journaux structurés JSON, vous n’avez pas besoin d’apporter de modifications. Lambda ne double code aucun journal déjà codé au format JSON. Même si vous configurez votre fonction pour utiliser le format de journal JSON, vos sorties de journalisation apparaissent CloudWatch dans la structure JSON que vous définissez.

### Utilisation du filtrage au niveau du journal avec Java
<a name="java-logging-advanced-levels"></a>

 AWS Lambda Pour filtrer les journaux de votre application en fonction de leur niveau de journalisation, votre fonction doit utiliser des journaux au format JSON. Vous pouvez effectuer cette opération de deux façons :
+ Créez des sorties de journal à l’aide de la norme `LambdaLogger` et configurez votre fonction pour utiliser le format de journal JSON. Lambda filtre ensuite les sorties de votre journal à l’aide de la paire clé-valeur « niveau » de l’objet JSON décrit dans [Utilisation du format de journal JSON structuré avec Java](#java-logging-advanced-JSON). Pour savoir comment configurer le format de journal de votre fonction, consultez [Configuration de commandes de journalisation avancées pour votre fonction Lambda](monitoring-logs.md#monitoring-cloudwatchlogs-advanced).
+ Utilisez une autre bibliothèque ou méthode de journalisation pour créer des journaux structurés JSON dans votre code qui incluent une paire clé-valeur « niveau » définissant le niveau de sortie du journal. Vous pouvez utiliser n’importe quelle bibliothèque de journalisation qui écrit des journaux JSON dans `stdout` ou `stderr`. Par exemple, vous pouvez utiliser Powertools for AWS Lambda ou le package Log4j2 pour générer des sorties de journal structurées JSON à partir de votre code. Pour en savoir plus, consultez [Utilisation de Powertools pour AWS Lambda (Java) et AWS SAM pour la journalisation structurée](#java-logging-sam) et [Implémentation de la journalisation avancée avec Log4j2 et J SLF4](#java-logging-log4j2).

Lorsque vous configurez votre fonction pour utiliser le filtrage au niveau des journaux, vous devez sélectionner l'une des options suivantes pour le niveau de journaux que Lambda doit envoyer à Logs : CloudWatch 


| Niveau du journal | Utilisation standard | 
| --- | --- | 
| TRACE (le plus détaillé) | Les informations les plus précises utilisées pour tracer le chemin d’exécution de votre code | 
| DEBUG | Informations détaillées pour le débogage du système | 
| INFO | Messages qui enregistrent le fonctionnement normal de votre fonction | 
| WARN | Messages relatifs à des erreurs potentielles susceptibles d’entraîner un comportement inattendu si elles ne sont pas traitées | 
| ERROR | Messages concernant les problèmes qui empêchent le code de fonctionner comme prévu | 
| FATAL (moindre détail) | Messages relatifs à des erreurs graves entraînant l’arrêt du fonctionnement de l’application | 

Pour que Lambda puisse filtrer les journaux de votre fonction, vous devez également inclure une paire `"timestamp"` clé-valeur dans la sortie de votre journal JSON. L’heure doit être spécifiée dans un format d’horodatage [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) valide. Si vous ne fournissez pas d’horodatage valide, Lambda attribuera au journal le niveau INFO et ajoutera un horodatage pour vous.

Lambda envoie les journaux du niveau sélectionné et inférieur à. CloudWatch Par exemple, si vous configurez un niveau de journalisation WARN, Lambda envoie des journaux correspondant aux niveaux WARN, ERROR et FATAL.

## Implémentation de la journalisation avancée avec Log4j2 et J SLF4
<a name="java-logging-log4j2"></a>

**Note**  
 AWS Lambda n'inclut pas Log4j2 dans ses environnements d'exécution gérés ni dans ses images de conteneur de base. Ces problèmes ne sont donc pas affectés par les problèmes décrits dans CVE-2021-44228, CVE-2021-45046 et CVE-2021-45105.   
 Dans les cas où une fonction client comprend une version de Log4j2 affectée, nous avons appliqué un changement aux [exécutions gérées](lambda-runtimes.md) par Lambda Java et aux [images de conteneur de base](java-image.md) qui permet d’atténuer les problèmes liés à CVE-2021-44228, CVE-2021-45046 et CVE-2021-45105. À la suite de cette modification, les clients utilisant Log4J2 peuvent voir une entrée de journal supplémentaire, similaire à « `Transforming org/apache/logging/log4j/core/lookup/JndiLookup (java.net.URLClassLoader@...)` ». Toute chaîne de journal qui fait référence au mappeur jndi dans la sortie Log4J2 sera remplacée par « `Patched JndiLookup::lookup()` ».   
 Indépendamment de ce changement, nous encourageons vivement tous les clients dont les fonctions incluent Log4j2 à mettre à jour vers la dernière version. Plus précisément, les clients utilisant la bibliothèque aws-lambda-java-log 4j2 dans leurs fonctions doivent passer à la version 1.5.0 (ou ultérieure) et redéployer leurs fonctions. Cette version met à jour les dépendances sous-jacentes de l’utilitaire Log4j2 vers la version 2.17.0 (ou ultérieure). [Le binaire aws-lambda-java-log 4j2 mis à jour est disponible dans le [dépôt Maven](https://repo1.maven.org/maven2/com/amazonaws/aws-lambda-java-log4j2/) et son code source est disponible sur Github.](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-log4j2)   
 **Enfin, notez que les bibliothèques liées à **aws-lambda-java-log4j (v1.0.0 ou 1.0.1)** **ne** doivent en aucun cas être utilisées.** Ces bibliothèques sont liées à la version 1.x de log4j qui a pris fin en 2015. Les bibliothèques ne sont pas prises en charge, ne sont pas maintenues, ne sont pas corrigées et présentent des failles de sécurité connues. 

Pour personnaliser la sortie du journal, prendre en charge la journalisation pendant les tests unitaires et enregistrer les appels du AWS SDK, utilisez Apache Log4j2 avec SLF4 J. Log4j est une bibliothèque de journalisation pour les programmes Java qui vous permet de configurer les niveaux de journalisation et d'utiliser des bibliothèques d'annexes. SLF4J est une bibliothèque de façade qui vous permet de changer la bibliothèque que vous utilisez sans changer le code de votre fonction.

Pour ajouter l'ID de demande aux journaux de votre fonction, utilisez l'annexe de la bibliothèque [aws-lambda-java-log4j2](java-package.md).

**Example [src/main/resources/log4j2.xml](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/s3-java/src/main/resources/log4j2.xml) — Configuration de l'annexe**  

```
<Configuration>
  <Appenders>
    <Lambda name="Lambda" format="${env:AWS_LAMBDA_LOG_FORMAT:-TEXT}">
       <LambdaTextFormat>
         <PatternLayout>
             <pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n </pattern>
         </PatternLayout>
       </LambdaTextFormat>
       <LambdaJSONFormat>
         <JsonTemplateLayout eventTemplateUri="classpath:LambdaLayout.json" />
       </LambdaJSONFormat>
     </Lambda>
   </Appenders>
   <Loggers>
     <Root level="${env:AWS_LAMBDA_LOG_LEVEL:-INFO}">
       <AppenderRef ref="Lambda"/>
     </Root>
     <Logger name="software.amazon.awssdk" level="WARN" />
     <Logger name="software.amazon.awssdk.request" level="DEBUG" />
   </Loggers>
 </Configuration>
```

Vous pouvez décider comment vos journaux Log4j2 sont configurés pour les sorties en texte brut ou JSON en spécifiant une mise en page sous les balises `<LambdaTextFormat>` et `<LambdaJSONFormat>`.

Dans cet exemple, en mode texte, chaque ligne est précédée de la date, de l’heure, de l’ID de demande, du niveau de journal et du nom de classe. En mode JSON, `<JsonTemplateLayout>` est utilisé avec une configuration fournie avec la bibliothèque `aws-lambda-java-log4j2`.

SLF4J est une bibliothèque de façade permettant de se connecter au code Java. Dans votre code de fonction, vous utilisez la SLF4 J logger factory pour récupérer un enregistreur avec des méthodes pour les niveaux de journalisation telles que `info()` et. `warn()` Dans votre configuration de compilation, vous incluez la bibliothèque de journalisation et l'adaptateur SLF4 J dans le chemin de classe. En modifiant les bibliothèques dans la configuration de construction, vous pouvez modifier le type d'enregistreur sans modifier votre code de fonction. SLF4J est requis pour capturer les journaux à partir du SDK for Java.

Dans l'exemple de code suivant, la classe de gestionnaire utilise SLF4 J pour récupérer un enregistreur.

**Example [src/main/java/example/HandlerS3.java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-events/src/main/java/example/HandlerS3.java) — Journalisation avec SLF4 J**  

```
package example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.S3Event;

import static org.apache.logging.log4j.CloseableThreadContext.put;


public class HandlerS3 implements RequestHandler<S3Event, String>{
    private static final Logger logger = LoggerFactory.getLogger(HandlerS3.class);

    @Override
    public String handleRequest(S3Event event, Context context) {
        for(var record : event.getRecords()) {
            try (var loggingCtx = put("awsRegion", record.getAwsRegion())) {
                loggingCtx.put("eventName", record.getEventName());
                loggingCtx.put("bucket", record.getS3().getBucket().getName());
                loggingCtx.put("key", record.getS3().getObject().getKey());

                logger.info("Handling s3 event");
            }
        }

        return "Ok";
    }
}
```

Ce code produit des sorties de journal similaires à ce qui suit  :

**Example format des journaux**  

```
{
    "timestamp": "2023-11-15T16:56:00.815Z",
    "level": "INFO",
    "message": "Handling s3 event",
    "logger": "example.HandlerS3",
    "AWSRequestId": "0bced576-3936-4e5a-9dcd-db9477b77f97",
    "awsRegion": "eu-south-1",
    "bucket": "java-logging-test-input-bucket",
    "eventName": "ObjectCreated:Put",
    "key": "test-folder/"
}
```

La configuration de construction prend en compte les dépendances d'exécution sur l'appendice Lambda et l'adaptateur SLF4 J, ainsi que les dépendances d'implémentation sur Log4j2.

**Example build.gradle – Dépendances de journalisation**  

```
dependencies {
    ...
    'com.amazonaws:aws-lambda-java-log4j2:[1.6.0,)',
    'com.amazonaws:aws-lambda-java-events:[3.11.3,)',
    'org.apache.logging.log4j:log4j-layout-template-json:[2.17.1,)',
    'org.apache.logging.log4j:log4j-slf4j2-impl:[2.19.0,)',
    ...
}
```

Lorsque vous exécutez votre code localement pour des tests, l’objet contecte avec l’enregistreur Lambda n’est pas disponible, et il n’y a pas d’ID de requête que l’appender Lambda puisse utiliser. Pour des exemples de configurations de test, consultez les exemples d’applications dans la section suivante. 

## Utilisation d’autres outils et bibliothèques de journalisation
<a name="java-tools-libraries"></a>

[Powertools for AWS Lambda (Java)](https://docs.aws.amazon.com/powertools/java/) est une boîte à outils destinée aux développeurs qui permet de mettre en œuvre les meilleures pratiques sans serveur et d'accroître la rapidité des développeurs. L’[utilitaire Logging](https://docs.aws.amazon.com/powertools/java/latest/core/logging/) (français non garanti) fournit un enregistreur optimisé pour Lambda qui inclut des informations supplémentaires sur le contexte de fonction pour toutes vos fonctions avec une sortie structurée en JSON. Utilisez cet utilitaire pour effectuer les opérations suivantes :
+ Capturer les champs clés du contexte Lambda, démarrer à froid et structurer la sortie de la journalisation sous forme de JSON
+ Journaliser les événements d’invocation Lambda lorsque cela est demandé (désactivé par défaut)
+ Imprimer tous les journaux uniquement pour un pourcentage d’invocations via l’échantillonnage des journaux (désactivé par défaut)
+ Ajouter des clés supplémentaires au journal structuré à tout moment
+ Utiliser un formateur de journaux personnalisé (Apportez votre propre formateur) pour produire des journaux dans une structure compatible avec le RFC de journalisation de votre organisation

## Utilisation de Powertools pour AWS Lambda (Java) et AWS SAM pour la journalisation structurée
<a name="java-logging-sam"></a>

Suivez les étapes ci-dessous pour télécharger, créer et déployer un exemple d'application Java Hello World avec des modules [Powertools for AWS Lambda (Java)](https://docs.aws.amazon.com/powertools/java/latest/) intégrés à l'aide du AWS SAM. Cette application met en œuvre un backend API de base et utilise Powertools pour émettre des journaux, des métriques et des traces. Elle se compose d’un point de terminaison Amazon API Gateway et d’une fonction Lambda. Lorsque vous envoyez une requête GET au point de terminaison API Gateway, la fonction Lambda appelle, envoie des journaux et des métriques au format métrique intégré à CloudWatch, et envoie des traces à. AWS X-Ray La fonction renvoie un message `hello world`.

**Conditions préalables**

Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
+ Java 11
+ [AWS CLI version 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS SAM CLI version 1.75 ou ultérieure](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). Si vous disposez d'une ancienne version de la AWS SAM CLI, consultez la section [Mise à niveau de la AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade).

**Déployer un exemple d' AWS SAM application**

1. Initialisez l’application à l’aide du modèle Hello World Java.

   ```
   sam init --app-template hello-world-powertools-java --name sam-app --package-type Zip --runtime java11 --no-tracing
   ```

1. Créez l’application.

   ```
   cd sam-app && sam build
   ```

1. Déployez l’application.

   ```
   sam deploy --guided
   ```

1. Suivez les invites à l’écran. Appuyez sur `Enter` pour accepter les options par défaut fournies dans l’expérience interactive.
**Note**  
Car l'**autorisation n'a HelloWorldFunction peut-être pas été définie, est-ce que ça va ?** , assurez-vous de participer`y`.

1. Obtenez l’URL de l’application déployée :

   ```
   aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
   ```

1. Invoquez le point de terminaison de l’API :

   ```
   curl -X GET <URL_FROM_PREVIOUS_STEP>
   ```

   En cas de succès, vous obtiendrez cette réponse :

   ```
   {"message":"hello world"}
   ```

1. Pour obtenir les journaux de la fonction, exécutez [sam logs](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-logs.html). Pour en savoir plus, consultez [Utilisation des journaux](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-logging.html) dans le *Guide du développeur AWS Serverless Application Model *.

   ```
   sam logs --stack-name sam-app
   ```

   La sortie du journal se présente comme suit :

   ```
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:34.095000 INIT_START Runtime Version: java:11.v15    Runtime Version ARN: arn:aws:lambda:eu-central-1::runtime:0a25e3e7a1cc9ce404bc435eeb2ad358d8fa64338e618d0c224fe509403583ca
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:34.114000 Picked up JAVA_TOOL_OPTIONS: -XX:+TieredCompilation -XX:TieredStopAtLevel=1
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:34.793000 Transforming org/apache/logging/log4j/core/lookup/JndiLookup (lambdainternal.CustomerClassLoader@1a6c5a9e)
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:35.252000 START RequestId: 7fcf1548-d2d4-41cd-a9a8-6ae47c51f765 Version: $LATEST
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:36.531000 {
     "_aws": {
       "Timestamp": 1675416276051,
       "CloudWatchMetrics": [
         {
           "Namespace": "sam-app-powerools-java",
           "Metrics": [
             {
               "Name": "ColdStart",
               "Unit": "Count"
             }
           ],
           "Dimensions": [
             [
               "Service",
               "FunctionName"
             ]
           ]
         }
       ]
     },
     "function_request_id": "7fcf1548-d2d4-41cd-a9a8-6ae47c51f765",
     "traceId": "Root=1-63dcd2d1-25f90b9d1c753a783547f4dd;Parent=e29684c1be352ce4;Sampled=1",
     "FunctionName": "sam-app-HelloWorldFunction-y9Iu1FLJJBGD",
     "functionVersion": "$LATEST",
     "ColdStart": 1.0,
     "Service": "service_undefined",
     "logStreamId": "2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81",
     "executionEnvironment": "AWS_Lambda_java11"
   }
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:36.974000 Feb 03, 2023 9:24:36 AM com.amazonaws.xray.AWSXRayRecorder <init>
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:36.993000 Feb 03, 2023 9:24:36 AM com.amazonaws.xray.config.DaemonConfiguration <init>
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:36.993000 INFO: Environment variable AWS_XRAY_DAEMON_ADDRESS is set. Emitting to daemon on address XXXX.XXXX.XXXX.XXXX:2000.
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:37.331000 09:24:37.294 [main] INFO  helloworld.App - {"version":null,"resource":"/hello","path":"/hello/","httpMethod":"GET","headers":{"Accept":"*/*","CloudFront-Forwarded-Proto":"https","CloudFront-Is-Desktop-Viewer":"true","CloudFront-Is-Mobile-Viewer":"false","CloudFront-Is-SmartTV-Viewer":"false","CloudFront-Is-Tablet-Viewer":"false","CloudFront-Viewer-ASN":"16509","CloudFront-Viewer-Country":"IE","Host":"XXXX.execute-api.eu-central-1.amazonaws.com","User-Agent":"curl/7.86.0","Via":"2.0 f0300a9921a99446a44423d996042050.cloudfront.net (CloudFront)","X-Amz-Cf-Id":"t9W5ByT11HaY33NM8YioKECn_4eMpNsOMPfEVRczD7T1RdhbtiwV1Q==","X-Amzn-Trace-Id":"Root=1-63dcd2d1-25f90b9d1c753a783547f4dd","X-Forwarded-For":"XX.XXX.XXX.XX, XX.XXX.XXX.XX","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},"multiValueHeaders":{"Accept":["*/*"],"CloudFront-Forwarded-Proto":["https"],"CloudFront-Is-Desktop-Viewer":["true"],"CloudFront-Is-Mobile-Viewer":["false"],"CloudFront-Is-SmartTV-Viewer":["false"],"CloudFront-Is-Tablet-Viewer":["false"],"CloudFront-Viewer-ASN":["16509"],"CloudFront-Viewer-Country":["IE"],"Host":["XXXX.execute-api.eu-central-1.amazonaws.com"],"User-Agent":["curl/7.86.0"],"Via":["2.0 f0300a9921a99446a44423d996042050.cloudfront.net (CloudFront)"],"X-Amz-Cf-Id":["t9W5ByT11HaY33NM8YioKECn_4eMpNsOMPfEVRczD7T1RdhbtiwV1Q=="],"X-Amzn-Trace-Id":["Root=1-63dcd2d1-25f90b9d1c753a783547f4dd"],"X-Forwarded-For":["XXX, XXX"],"X-Forwarded-Port":["443"],"X-Forwarded-Proto":["https"]},"queryStringParameters":null,"multiValueQueryStringParameters":null,"pathParameters":null,"stageVariables":null,"requestContext":{"accountId":"XXX","stage":"Prod","resourceId":"at73a1","requestId":"ba09ecd2-acf3-40f6-89af-fad32df67597","operationName":null,"identity":{"cognitoIdentityPoolId":null,"accountId":null,"cognitoIdentityId":null,"caller":null,"apiKey":null,"principalOrgId":null,"sourceIp":"54.240.197.236","cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":null,"userAgent":"curl/7.86.0","user":null,"accessKey":null},"resourcePath":"/hello","httpMethod":"GET","apiId":"XXX","path":"/Prod/hello/","authorizer":null},"body":null,"isBase64Encoded":false}
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:37.351000 09:24:37.351 [main] INFO  helloworld.App - Retrieving https://checkip.amazonaws.com
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:39.313000 {
     "function_request_id": "7fcf1548-d2d4-41cd-a9a8-6ae47c51f765",
     "traceId": "Root=1-63dcd2d1-25f90b9d1c753a783547f4dd;Parent=e29684c1be352ce4;Sampled=1",
     "xray_trace_id": "1-63dcd2d1-25f90b9d1c753a783547f4dd",
     "functionVersion": "$LATEST",
     "Service": "service_undefined",
     "logStreamId": "2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81",
     "executionEnvironment": "AWS_Lambda_java11"
   }
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:39.371000 END RequestId: 7fcf1548-d2d4-41cd-a9a8-6ae47c51f765
   2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:39.371000 REPORT RequestId: 7fcf1548-d2d4-41cd-a9a8-6ae47c51f765    Duration: 4118.98 ms    Billed Duration: 5275 ms    Memory Size: 512 MB    Max Memory Used: 152 MB    Init Duration: 1155.47 ms    
   XRAY TraceId: 1-63dcd2d1-25f90b9d1c753a783547f4dd    SegmentId: 3a028fee19b895cb    Sampled: true
   ```

1. Il s’agit d’un point de terminaison d’API public accessible par Internet. Nous vous recommandons de supprimer le point de terminaison après un test.

   ```
   sam delete
   ```

### Gestion de la conservation des journaux
<a name="java-log-retention"></a>

Les groupes de journaux ne sont pas supprimés automatiquement quand vous supprimez une fonction. Pour éviter de stocker les journaux indéfiniment, supprimez le groupe de journaux ou configurez une période de conservation après laquelle les journaux CloudWatch sont automatiquement supprimés. Pour configurer la conservation des journaux, ajoutez ce qui suit à votre AWS SAM modèle :

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      # Omitting other properties

  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}"
      RetentionInDays: 7
```

## Affichage des journaux dans la console Lambda
<a name="java-logging-console"></a>

Vous pouvez utiliser la console Lambda pour afficher la sortie du journal après avoir invoqué une fonction Lambda.

Si votre code peut être testé à partir de l’éditeur **Code** intégré, vous trouverez les journaux dans les **résultats d’exécution**. Lorsque vous utilisez la fonctionnalité de test de console pour invoquer une fonction, vous trouverez **Sortie du journal** dans la section **Détails**.

## Afficher les journaux dans la CloudWatch console
<a name="java-logging-cwconsole"></a>

Vous pouvez utiliser la CloudWatch console Amazon pour consulter les journaux de toutes les invocations de fonctions Lambda.

**Pour afficher les journaux sur la CloudWatch console**

1. Ouvrez la [page Groupes de journaux](https://console.aws.amazon.com/cloudwatch/home?#logs:) sur la CloudWatch console.

1. Choisissez le groupe de journaux pour votre fonction (***your-function-name*/aws/lambda/**).

1. Choisissez un flux de journaux.

Chaque flux de journal correspond à une [instance de votre fonction](lambda-runtime-environment.md). Un flux de journal apparaît lorsque vous mettez à jour votre fonction Lambda et lorsque des instances supplémentaires sont créées pour gérer les appels simultanés. Pour trouver les journaux d'un appel spécifique, nous vous recommandons d'instrumenter votre fonction avec. AWS X-Ray X-Ray enregistre des détails sur la demande et le flux de journaux dans le suivi.

## Afficher les journaux à l'aide de AWS Command Line Interface (AWS CLI)
<a name="java-logging-cli"></a>

 AWS CLI Il s'agit d'un outil open source qui vous permet d'interagir avec les AWS services à l'aide de commandes dans votre interface de ligne de commande. Pour effectuer les étapes de cette section, vous devez disposer de la [version 2 de l’AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Vous pouvez utiliser [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) pour récupérer les journaux d’une invocation à l’aide de l’option de commande `--log-type`. La réponse inclut un champ `LogResult` qui contient jusqu’à 4 Ko de journaux codés en base64 provenant de l’invocation.

**Example récupérer un ID de journal**  
L’exemple suivant montre comment récupérer un *ID de journal* à partir du champ `LogResult` d’une fonction nommée `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
Vous devriez voir la sortie suivante:  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example décoder les journaux**  
Dans la même invite de commandes, utilisez l’utilitaire `base64` pour décoder les journaux. L’exemple suivant montre comment récupérer les journaux encodés en base64 pour `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
```
L'**cli-binary-format**option est obligatoire si vous utilisez AWS CLI la version 2. Pour faire de ce paramètre le paramètre par défaut, exécutez `aws configure set cli-binary-format raw-in-base64-out`. Pour plus d’informations, consultez les [options de ligne de commande globales AWS CLI prises en charge](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) dans le *Guide de l’utilisateur AWS Command Line Interface version 2*.  
Vous devriez voir la sortie suivante :  

```
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB
```
L’utilitaire `base64` est disponible sous Linux, macOS et [Ubuntu sous Windows](https://docs.microsoft.com/en-us/windows/wsl/install-win10). Les utilisateurs de macOS auront peut-être besoin d’utiliser `base64 -D`.

**Example Script get-logs.sh**  
Dans la même invite de commandes, utilisez le script suivant pour télécharger les cinq derniers événements de journalisation. Le script utilise `sed` pour supprimer les guillemets du fichier de sortie et attend 15 secondes pour permettre la mise à disposition des journaux. La sortie comprend la réponse de Lambda, ainsi que la sortie de la commande `get-log-events`.   
Copiez le contenu de l’exemple de code suivant et enregistrez-le dans votre répertoire de projet Lambda sous `get-logs.sh`.  
L'**cli-binary-format**option est obligatoire si vous utilisez AWS CLI la version 2. Pour faire de ce paramètre le paramètre par défaut, exécutez `aws configure set cli-binary-format raw-in-base64-out`. Pour plus d’informations, consultez les [options de ligne de commande globales AWS CLI prises en charge](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) dans le *Guide de l’utilisateur AWS Command Line Interface version 2*.  

```
#!/bin/bash
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out
sed -i'' -e 's/"//g' out
sleep 15
aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name stream1 --limit 5
```

**Example macOS et Linux (uniquement)**  
Dans la même invite de commandes, les utilisateurs macOS et Linux peuvent avoir besoin d’exécuter la commande suivante pour s’assurer que le script est exécutable.  

```
chmod -R 755 get-logs.sh
```

**Example récupérer les cinq derniers événements de journal**  
Dans la même invite de commande, exécutez le script suivant pour obtenir les cinq derniers événements de journalisation.  

```
./get-logs.sh
```
Vous devriez voir la sortie suivante:  

```
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
{
    "events": [
        {
            "timestamp": 1559763003171,
            "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n",
            "ingestionTime": 1559763003309
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r  \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r  \"key\": \"value\"\r}\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n",
            "ingestionTime": 1559763018353
        }
    ],
    "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795",
    "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080"
}
```

## Suppression de journaux
<a name="java-logging-delete"></a>

Les groupes de journaux ne sont pas supprimés automatiquement quand vous supprimez une fonction. Pour éviter de stocker des journaux indéfiniment, supprimez le groupe de journaux ou [configurez une période de conservation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#SettingLogRetention) à l’issue de laquelle les journaux sont supprimés automatiquement.

## Exemple de code de journalisation
<a name="java-logging-samples"></a>

Le GitHub référentiel de ce guide inclut des exemples d'applications illustrant l'utilisation de différentes configurations de journalisation. Chaque exemple d'application inclut des scripts pour faciliter le déploiement et le nettoyage, un AWS SAM modèle et des ressources de support.

**Exemples d’applications Lambda en Java**
+ [example-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/example-java) : fonction Java qui montre comment utiliser Lambda pour traiter les commandes. Cette fonction montre comment définir et désérialiser un objet d'événement d'entrée personnalisé, utiliser le AWS SDK et enregistrer les sorties.
+ [java-basic](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-basic) – Ensemble de fonctions Java minimales avec des tests unitaires et une configuration de journalisation variable.
+ [java events](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-events) – Ensemble de fonctions Java contenant du code squelette permettant de gérer les événements de divers services tels qu’Amazon API Gateway, Amazon SQS et Amazon Kinesis. Ces fonctions utilisent la dernière version de la [aws-lambda-java-events](java-package.md)bibliothèque (3.0.0 et versions ultérieures). Ces exemples ne nécessitent pas le AWS SDK comme dépendance.
+ [s3-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/s3-java) – Fonction Java qui traite les événements de notification d’Amazon S3 et utilise la bibliothèque de classes Java (JCL) pour créer des miniatures à partir de fichiers d’image chargés.
+ [layer-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/layer-java) : fonction Java qui illustre comment utiliser une couche Lambda pour empaqueter les dépendances séparément du code de votre fonction principale.

L’exemple `java-basic` d’application présente une configuration de journalisation minimale qui prend en charge les tests de journalisation. Le code du gestionnaire utilise l’enregistreur `LambdaLogger` fourni par l’objet de contexte. Pour les tests, l’application utilise une classe `TestLogger` personnalisée qui implémente l’interface `LambdaLogger` avec un logger Log4j2. Il utilise SLF4 J comme façade pour assurer la compatibilité avec le AWS SDK. Les bibliothèques de journalisation sont exclues de la sortie de build pour limiter la taille du package de déploiement.

# Instrumentation du code Java dans AWS Lambda
<a name="java-tracing"></a>

Lambda s'intègre pour vous aider AWS X-Ray à suivre, à déboguer et à optimiser les applications Lambda. Vous pouvez utiliser X-Ray pour suivre une demande lorsque celle-ci parcourt les ressources de votre application, qui peuvent inclure des fonctions Lambda et d'autres services AWS .

Pour envoyer des données de suivi à X-Ray, vous pouvez utiliser l'une des deux bibliothèques SDK suivantes :
+ [AWS Distro for OpenTelemetry (ADOT)](https://aws.amazon.com/otel) — Une distribution sécurisée, prête pour la production et AWS prise en charge du SDK (). OpenTelemetry OTel
+ [Kit SDK AWS X-Ray pour Java](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java.html) – Un kit SDK permettant de générer et d’envoyer des données de suivi à X-Ray.
+ [Powertools for AWS Lambda (Java)](https://docs.aws.amazon.com/powertools/java/latest/) — Une boîte à outils pour les développeurs permettant de mettre en œuvre les meilleures pratiques sans serveur et d'accroître la rapidité des développeurs.

Chacune d'entre elles SDKs propose des moyens d'envoyer vos données de télémétrie au service X-Ray. Vous pouvez ensuite utiliser X-Ray pour afficher, filtrer et avoir un aperçu des métriques de performance de votre application, afin d’identifier les problèmes et les occasions d’optimiser votre application.

**Important**  
Les outils X-Ray et Powertools pour AWS Lambda SDKs font partie d'une solution d'instrumentation étroitement intégrée proposée par AWS. Les couches ADOT Lambda font partie d’une norme industrielle pour l’instrumentation de traçage qui collecte plus de données en général, mais qui peut ne pas convenir à tous les cas d’utilisation. Vous pouvez implémenter le end-to-end traçage dans X-Ray en utilisant l'une ou l'autre des solutions. Pour en savoir plus sur le choix entre les deux, consultez [Choosing between the AWS Distro for Open Telemetry and](https://docs.aws.amazon.com/xray/latest/devguide/xray-instrumenting-your-app.html#xray-instrumenting-choosing) X-Ray. SDKs

**Topics**
+ [Utilisation de Powertools pour AWS Lambda (Java) et AWS SAM pour le traçage](#java-tracing-sam)
+ [Utilisation de Powertools pour AWS Lambda (Java) et AWS CDK pour le traçage](#java-tracing-cdk)
+ [Utilisation d'ADOT pour instrumenter vos fonctions Java](#java-adot)
+ [Utilisation du kit SDK X-Ray pour instrumenter vos fonctions Java](#java-xray-sdk)
+ [Activation du suivi avec la console Lambda](#java-tracing-console)
+ [Activation du suivi avec l’API Lambda](#java-tracing-api)
+ [Activation du traçage avec CloudFormation](#java-tracing-cloudformation)
+ [Interprétation d’un suivi X-Ray](#java-tracing-interpretation)
+ [Stockage des dépendances d’exécution dans une couche (kit SDK X-Ray)](#java-tracing-layers)
+ [Suivi de X-Ray dans des exemples d'applications (kit SDK X-Ray)](#java-tracing-samples)

## Utilisation de Powertools pour AWS Lambda (Java) et AWS SAM pour le traçage
<a name="java-tracing-sam"></a>

Suivez les étapes ci-dessous pour télécharger, créer et déployer un exemple d'application Java Hello World avec des modules [Powertools for AWS Lambda (Java)](https://docs.powertools.aws.dev/lambda-java) intégrés à l'aide du AWS SAM. Cette application met en œuvre un backend API de base et utilise Powertools pour émettre des journaux, des métriques et des traces. Elle se compose d’un point de terminaison Amazon API Gateway et d’une fonction Lambda. Lorsque vous envoyez une requête GET au point de terminaison API Gateway, la fonction Lambda appelle, envoie des journaux et des métriques au format métrique intégré à CloudWatch, et envoie des traces à. AWS X-Ray La fonction renvoie un message `hello world`.

**Conditions préalables**

Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
+ Java 11 ou version ultérieure
+ [AWS CLI version 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS SAM CLI version 1.75 ou ultérieure](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). Si vous disposez d'une ancienne version de la AWS SAM CLI, consultez la section [Mise à niveau de la AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade).

**Déployer un exemple d' AWS SAM application**

1. Initialisez l’application à l’aide du modèle Hello World Java.

   ```
   sam init --app-template hello-world-powertools-java --name sam-app --package-type Zip --runtime java11 --no-tracing
   ```

1. Créez l’application.

   ```
   cd sam-app && sam build
   ```

1. Déployez l’application.

   ```
   sam deploy --guided
   ```

1. Suivez les invites à l’écran. Appuyez sur `Enter` pour accepter les options par défaut fournies dans l’expérience interactive.
**Note**  
Car l'**autorisation n'a HelloWorldFunction peut-être pas été définie, est-ce que ça va ?** , assurez-vous de participer`y`.

1. Obtenez l’URL de l’application déployée :

   ```
   aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
   ```

1. Invoquez le point de terminaison de l’API :

   ```
   curl -X GET <URL_FROM_PREVIOUS_STEP>
   ```

   En cas de succès, vous obtiendrez cette réponse :

   ```
   {"message":"hello world"}
   ```

1. Pour obtenir les traces de la fonction, exécutez [sam traces](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-traces.html).

   ```
   sam traces
   ```

   La sortie de la trace ressemble à ceci :

   ```
   New XRay Service Graph
     Start time: 2025-02-03 14:31:48+01:00
     End time: 2025-02-03 14:31:48+01:00
     Reference Id: 0 - (Root) AWS::Lambda - sam-app-HelloWorldFunction-y9Iu1FLJJBGD - Edges: []
      Summary_statistics:
        - total requests: 1
        - ok count(2XX): 1
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 5.587
     Reference Id: 1 - client - sam-app-HelloWorldFunction-y9Iu1FLJJBGD - Edges: [0]
      Summary_statistics:
        - total requests: 0
        - ok count(2XX): 0
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 0
   
   XRay Event [revision 3] at (2025-02-03T14:31:48.500000) with id (1-63dd0cc4-3c869dec72a586875da39777) and duration (5.603s)
    - 5.587s - sam-app-HelloWorldFunction-y9Iu1FLJJBGD [HTTP: 200]
    - 4.053s - sam-app-HelloWorldFunction-y9Iu1FLJJBGD
      - 1.181s - Initialization
      - 4.037s - Invocation
        - 1.981s - ## handleRequest
          - 1.840s - ## getPageContents
      - 0.000s - Overhead
   ```

1. Il s’agit d’un point de terminaison d’API public accessible par Internet. Nous vous recommandons de supprimer le point de terminaison après un test.

   ```
   sam delete
   ```

## Utilisation de Powertools pour AWS Lambda (Java) et AWS CDK pour le traçage
<a name="java-tracing-cdk"></a>

Suivez les étapes ci-dessous pour télécharger, créer et déployer un exemple d'application Java Hello World avec des modules [Powertools for AWS Lambda (Java)](https://docs.powertools.aws.dev/lambda-java) intégrés à l'aide du AWS CDK. Cette application met en œuvre un backend API de base et utilise Powertools pour émettre des journaux, des métriques et des traces. Elle se compose d’un point de terminaison Amazon API Gateway et d’une fonction Lambda. Lorsque vous envoyez une requête GET au point de terminaison API Gateway, la fonction Lambda appelle, envoie des journaux et des métriques au format métrique intégré à CloudWatch, et envoie des traces à. AWS X-Ray La fonction renvoie un message hello world.

**Conditions préalables**

Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
+ Java 11 ou version ultérieure
+ [AWS CLI version 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS CDK version 2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_prerequisites)
+ [AWS SAM CLI version 1.75 ou ultérieure](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). Si vous disposez d'une ancienne version de la AWS SAM CLI, consultez la section [Mise à niveau de la AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade).

**Déployer un exemple d' AWS CDK application**

1. Créez un répertoire de projets pour votre nouvelle application.

   ```
   mkdir hello-world
   cd hello-world
   ```

1. Initialisez l'application.

   ```
   cdk init app --language java
   ```

1. Créez un projet Maven avec la commande suivante :

   ```
   mkdir app
   cd app
   mvn archetype:generate -DgroupId=helloworld -DartifactId=Function -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
   ```

1. Ouvrez `pom.xml` dans le répertoire `hello-world\app\Function` et remplacez le code existant par le code suivant qui inclut les dépendances et les plugins Maven pour Powertools.

   ```
   <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>helloworld</groupId>
     <artifactId>Function</artifactId>
     <packaging>jar</packaging>
     <version>1.0-SNAPSHOT</version>
     <name>Function</name>
     <url>http://maven.apache.org</url>
   <properties>
       <maven.compiler.source>11</maven.compiler.source>
       <maven.compiler.target>11</maven.compiler.target>
       <log4j.version>2.17.2</log4j.version>
   </properties>
       <dependencies>
           <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
           </dependency>
           <dependency>
               <groupId>software.amazon.lambda</groupId>
               <artifactId>powertools-tracing</artifactId>
               <version>1.3.0</version>
           </dependency>
           <dependency>
               <groupId>software.amazon.lambda</groupId>
               <artifactId>powertools-metrics</artifactId>
               <version>1.3.0</version>
           </dependency>
           <dependency>
               <groupId>software.amazon.lambda</groupId>
               <artifactId>powertools-logging</artifactId>
               <version>1.3.0</version>
           </dependency>
           <dependency>
               <groupId>com.amazonaws</groupId>
               <artifactId>aws-lambda-java-core</artifactId>
               <version>1.2.2</version>
           </dependency>
           <dependency>
               <groupId>com.amazonaws</groupId>
               <artifactId>aws-lambda-java-events</artifactId>
               <version>3.11.1</version>
           </dependency>
     </dependencies>
   <build>
       <plugins>
           <plugin>
               <groupId>org.codehaus.mojo</groupId>
               <artifactId>aspectj-maven-plugin</artifactId>
               <version>1.14.0</version>
               <configuration>
                   <source>${maven.compiler.source}</source>
                   <target>${maven.compiler.target}</target>
                   <complianceLevel>${maven.compiler.target}</complianceLevel>
                   <aspectLibraries>
                       <aspectLibrary>
                           <groupId>software.amazon.lambda</groupId>
                           <artifactId>powertools-tracing</artifactId>
                       </aspectLibrary>
                       <aspectLibrary>
                           <groupId>software.amazon.lambda</groupId>
                           <artifactId>powertools-metrics</artifactId>
                       </aspectLibrary>
                       <aspectLibrary>
                           <groupId>software.amazon.lambda</groupId>
                           <artifactId>powertools-logging</artifactId>
                       </aspectLibrary>
                   </aspectLibraries>
               </configuration>
               <executions>
                   <execution>
                       <goals>
                           <goal>compile</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
           <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-shade-plugin</artifactId>
                   <version>3.4.1</version>
                   <executions>
                       <execution>
                           <phase>package</phase>
                           <goals>
                               <goal>shade</goal>
                           </goals>
                           <configuration>
                               <transformers>
                                   <transformer
                                           implementation="com.github.edwgiz.maven_shade_plugin.log4j2_cache_transformer.PluginsCacheFileTransformer">
                                   </transformer>
                               </transformers>
                               <createDependencyReducedPom>false</createDependencyReducedPom>
                               <finalName>function</finalName>
   
                           </configuration>
                       </execution>
                   </executions>
                   <dependencies>
                       <dependency>
                           <groupId>com.github.edwgiz</groupId>
                           <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
                           <version>2.15</version>
                       </dependency>
                   </dependencies>
           </plugin>
       </plugins>
   </build>
   </project>
   ```

1. Créez le répertoire `hello-world\app\src\main\resource` et créez `log4j.xml` pour la configuration du journal.

   ```
   mkdir -p src/main/resource
   cd src/main/resource
   touch log4j.xml
   ```

1. Ouvrez `log4j.xml` et ajoutez le code suivant.

   ```
   <?xml version="1.0" encoding="UTF-8"?>
   <Configuration>
       <Appenders>
           <Console name="JsonAppender" target="SYSTEM_OUT">
               <JsonTemplateLayout eventTemplateUri="classpath:LambdaJsonLayout.json" />
           </Console>
       </Appenders>
       <Loggers>
           <Logger name="JsonLogger" level="INFO" additivity="false">
               <AppenderRef ref="JsonAppender"/>
           </Logger>
           <Root level="info">
               <AppenderRef ref="JsonAppender"/>
           </Root>
       </Loggers>
   </Configuration>
   ```

1. Ouvrez `App.java` à partir du répertoire `hello-world\app\Function\src\main\java\helloworld` et remplacez le code existant par le code suivant. Il s'agit du code de la fonction Lambda.

   ```
   package helloworld;
   
   import java.io.BufferedReader;
   import java.io.IOException;
   import java.io.InputStreamReader;
   import java.net.URL;
   import java.util.HashMap;
   import java.util.Map;
   import java.util.stream.Collectors;
   
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
   import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
   import org.apache.logging.log4j.LogManager;
   import org.apache.logging.log4j.Logger;
   import software.amazon.lambda.powertools.logging.Logging;
   import software.amazon.lambda.powertools.metrics.Metrics;
   import software.amazon.lambda.powertools.tracing.CaptureMode;
   import software.amazon.lambda.powertools.tracing.Tracing;
   
   import static software.amazon.lambda.powertools.tracing.CaptureMode.*;
   
   /**
    * Handler for requests to Lambda function.
    */
   public class App implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
       Logger log = LogManager.getLogger(App.class);
   
   
       @Logging(logEvent = true)
       @Tracing(captureMode = DISABLED)
       @Metrics(captureColdStart = true)
       public APIGatewayProxyResponseEvent handleRequest(final APIGatewayProxyRequestEvent input, final Context context) {
           Map<String, String> headers = new HashMap<>();
           headers.put("Content-Type", "application/json");
           headers.put("X-Custom-Header", "application/json");
   
           APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent()
                   .withHeaders(headers);
           try {
               final String pageContents = this.getPageContents("https://checkip.amazonaws.com");
               String output = String.format("{ \"message\": \"hello world\", \"location\": \"%s\" }", pageContents);
   
               return response
                       .withStatusCode(200)
                       .withBody(output);
           } catch (IOException e) {
               return response
                       .withBody("{}")
                       .withStatusCode(500);
           }
       }
       @Tracing(namespace = "getPageContents")
       private String getPageContents(String address) throws IOException {
           log.info("Retrieving {}", address);
           URL url = new URL(address);
           try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {
               return br.lines().collect(Collectors.joining(System.lineSeparator()));
           }
       }
   }
   ```

1. Ouvrez `HelloWorldStack.java` à partir du répertoire `hello-world\src\main\java\com\myorg` et remplacez le code existant par le code suivant. Ce code utilise le constructeur [Lambda et le constructeur ApiGatewayv](https://docs.aws.amazon.com/cdk/api/v1/java/aws_cdk.aws_lambda.html) [2](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigatewayv2-readme.html) pour créer une API REST et une fonction Lambda.

   ```
   package com.myorg;
   
   import software.amazon.awscdk.*;
   import software.amazon.awscdk.services.apigatewayv2.alpha.*;
   import software.amazon.awscdk.services.apigatewayv2.integrations.alpha.HttpLambdaIntegration;
   import software.amazon.awscdk.services.apigatewayv2.integrations.alpha.HttpLambdaIntegrationProps;
   import software.amazon.awscdk.services.lambda.Code;
   import software.amazon.awscdk.services.lambda.Function;
   import software.amazon.awscdk.services.lambda.FunctionProps;
   import software.amazon.awscdk.services.lambda.Runtime;
   import software.amazon.awscdk.services.lambda.Tracing;
   import software.amazon.awscdk.services.logs.RetentionDays;
   import software.amazon.awscdk.services.s3.assets.AssetOptions;
   import software.constructs.Construct;
   
   import java.util.Arrays;
   import java.util.List;
   
   import static java.util.Collections.singletonList;
   import static software.amazon.awscdk.BundlingOutput.ARCHIVED;
   
   public class HelloWorldStack extends Stack {
       public HelloWorldStack(final Construct scope, final String id) {
           this(scope, id, null);
       }
   
       public HelloWorldStack(final Construct scope, final String id, final StackProps props) {
           super(scope, id, props);
   
           List<String> functionPackagingInstructions = Arrays.asList(
                   "/bin/sh",
                   "-c",
                   "cd Function " +
                           "&& mvn clean install " +
                           "&& cp /asset-input/Function/target/function.jar /asset-output/"
           );
           BundlingOptions.Builder builderOptions = BundlingOptions.builder()
                   .command(functionPackagingInstructions)
                   .image(Runtime.JAVA_11.getBundlingImage())
                   .volumes(singletonList(
                           // Mount local .m2 repo to avoid download all the dependencies again inside the container
                           DockerVolume.builder()
                                   .hostPath(System.getProperty("user.home") + "/.m2/")
                                   .containerPath("/root/.m2/")
                                   .build()
                   ))
                   .user("root")
                   .outputType(ARCHIVED);
   
           Function function = new Function(this, "Function", FunctionProps.builder()
                   .runtime(Runtime.JAVA_11)
                   .code(Code.fromAsset("app", AssetOptions.builder()
                           .bundling(builderOptions
                                   .command(functionPackagingInstructions)
                                   .build())
                           .build()))
                   .handler("helloworld.App::handleRequest")
                   .memorySize(1024)
                   .tracing(Tracing.ACTIVE)
                   .timeout(Duration.seconds(10))
                   .logRetention(RetentionDays.ONE_WEEK)
                   .build());
   
           HttpApi httpApi = new HttpApi(this, "sample-api", HttpApiProps.builder()
                   .apiName("sample-api")
                   .build());
   
           httpApi.addRoutes(AddRoutesOptions.builder()
                   .path("/")
                   .methods(singletonList(HttpMethod.GET))
                   .integration(new HttpLambdaIntegration("function", function, HttpLambdaIntegrationProps.builder()
                           .payloadFormatVersion(PayloadFormatVersion.VERSION_2_0)
                           .build()))
                   .build());
   
           new CfnOutput(this, "HttpApi", CfnOutputProps.builder()
                   .description("Url for Http Api")
                   .value(httpApi.getApiEndpoint())
                   .build());
       }
   }
   ```

1. Ouvrez `pom.xml` à partir du répertoire `hello-world` et remplacez le code existant par le code suivant.

   ```
   <?xml version="1.0" encoding="UTF-8"?>
   <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
            xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <modelVersion>4.0.0</modelVersion>
   
       <groupId>com.myorg</groupId>
       <artifactId>hello-world</artifactId>
       <version>0.1</version>
   
       <properties>
           <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
           <cdk.version>2.70.0</cdk.version>
           <constructs.version>[10.0.0,11.0.0)</constructs.version>
           <junit.version>5.7.1</junit.version>
       </properties>
   
       <build>
           <plugins>
               <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-compiler-plugin</artifactId>
                   <version>3.8.1</version>
                   <configuration>
                       <source>1.8</source>
                       <target>1.8</target>
                   </configuration>
               </plugin>
   
               <plugin>
                   <groupId>org.codehaus.mojo</groupId>
                   <artifactId>exec-maven-plugin</artifactId>
                   <version>3.0.0</version>
                   <configuration>
                       <mainClass>com.myorg.HelloWorldApp</mainClass>
                   </configuration>
               </plugin>
           </plugins>
       </build>
   
       <dependencies>
           <!-- AWS Cloud Development Kit -->
           <dependency>
               <groupId>software.amazon.awscdk</groupId>
               <artifactId>aws-cdk-lib</artifactId>
               <version>${cdk.version}</version>
           </dependency>
           <dependency>
               <groupId>software.constructs</groupId>
               <artifactId>constructs</artifactId>
               <version>${constructs.version}</version>
           </dependency>
           <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter</artifactId>
             <version>${junit.version}</version>
             <scope>test</scope>
           </dependency>
           <dependency>
               <groupId>software.amazon.awscdk</groupId>
               <artifactId>apigatewayv2-alpha</artifactId>
               <version>${cdk.version}-alpha.0</version>
           </dependency>
           <dependency>
               <groupId>software.amazon.awscdk</groupId>
               <artifactId>apigatewayv2-integrations-alpha</artifactId>
               <version>${cdk.version}-alpha.0</version>
           </dependency>
       </dependencies>
   </project>
   ```

1. Assurez-vous d'être dans le répertoire `hello-world` et déployez votre application.

   ```
   cdk deploy
   ```

1. Obtenez l'URL de l'application déployée :

   ```
   aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?OutputKey==`HttpApi`].OutputValue' --output text
   ```

1. Invoquez le point de terminaison de l’API :

   ```
   curl -X GET <URL_FROM_PREVIOUS_STEP>
   ```

   En cas de succès, vous obtiendrez cette réponse :

   ```
   {"message":"hello world"}
   ```

1. Pour obtenir les traces de la fonction, exécutez [sam traces](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-traces.html).

   ```
   sam traces
   ```

   La sortie de la trace ressemble à ceci :

   ```
   New XRay Service Graph
     Start time: 2025-02-03 14:59:50+00:00
     End time: 2025-02-03 14:59:50+00:00
     Reference Id: 0 - (Root) AWS::Lambda - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [1]
      Summary_statistics:
        - total requests: 1
        - ok count(2XX): 1
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 0.924
     Reference Id: 1 - AWS::Lambda::Function - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: []
      Summary_statistics:
        - total requests: 1
        - ok count(2XX): 1
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 0.016
     Reference Id: 2 - client - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [0]
      Summary_statistics:
        - total requests: 0
        - ok count(2XX): 0
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 0
   
   XRay Event [revision 1] at (2025-02-03T14:59:50.204000) with id (1-63dd2166-434a12c22e1307ff2114f299) and duration (0.924s)
    - 0.924s - sam-app-HelloWorldFunction-YBg8yfYtOc9j [HTTP: 200]
    - 0.016s - sam-app-HelloWorldFunction-YBg8yfYtOc9j
      - 0.739s - Initialization
      - 0.016s - Invocation
        - 0.013s - ## lambda_handler
          - 0.000s - ## app.hello
      - 0.000s - Overhead
   ```

1. Il s’agit d’un point de terminaison d’API public accessible par Internet. Nous vous recommandons de supprimer le point de terminaison après un test.

   ```
   cdk destroy
   ```

## Utilisation d'ADOT pour instrumenter vos fonctions Java
<a name="java-adot"></a>

ADOT fournit des couches [Lambda](chapter-layers.md) entièrement gérées qui regroupent tout ce dont vous avez besoin pour collecter des données de télémétrie à l'aide du SDK. OTel En consommant cette couche, vous pouvez instrumenter vos fonctions Lambda sans avoir à modifier le code de fonction. Vous pouvez également configurer votre couche pour effectuer une initialisation personnalisée de OTel. Pour de plus amples informations, veuillez consulter [Configuration personnalisée pour ADOT Collector sur Lambda](https://aws-otel.github.io/docs/getting-started/lambda#custom-configuration-for-the-adot-collector-on-lambda) dans la documentation ADOT.

Pour les environnements d'exécution Java, vous pouvez choisir entre deux couches à consommer :
+ **AWS couche Lambda gérée pour ADOT Java (agent d'instrumentation automatique)** : cette couche transforme automatiquement le code de votre fonction au démarrage pour collecter des données de suivi. Pour obtenir des instructions détaillées sur la façon d'utiliser cette couche avec l'agent Java ADOT, consultez [AWS Distro for Lambda OpenTelemetry Support for Java (agent d'instrumentation automatique)](https://aws-otel.github.io/docs/getting-started/lambda/lambda-java-auto-instr) dans la documentation ADOT.
+ **AWS couche Lambda gérée pour ADOT Java** — Cette couche fournit également une instrumentation intégrée pour les fonctions Lambda, mais elle nécessite quelques modifications de code manuelles pour initialiser le SDK. OTel Pour obtenir des instructions détaillées sur la façon de consommer cette couche, consultez [AWS Distro for OpenTelemetry Lambda Support](https://aws-otel.github.io/docs/getting-started/lambda/lambda-java) for Java dans la documentation ADOT.

## Utilisation du kit SDK X-Ray pour instrumenter vos fonctions Java
<a name="java-xray-sdk"></a>

Pour enregistrer des données sur les appels effectués par votre fonction à d'autres ressources et services de votre application, vous pouvez ajouter le kit SDK X-Ray pour Java à la configuration de votre création. L'exemple suivant montre une configuration de build Gradle qui inclut les bibliothèques qui activent l'instrumentation automatique des AWS SDK for Java 2.x clients.

**Example [build.gradle](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/s3-java/build.gradle) – Dépendances du suivi**  

```
dependencies {
    implementation platform('software.amazon.awssdk:bom:2.16.1')
    implementation platform('com.amazonaws:aws-xray-recorder-sdk-bom:2.11.0')
    ...
    implementation 'com.amazonaws:aws-xray-recorder-sdk-core'
    implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk'
    implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2-instrumentor'
    ...
}
```

Une fois que vous avez ajouté les bonnes dépendances et effectué les modifications de code nécessaires, activez le suivi dans la configuration de votre fonction via la console Lambda ou l'API.

## Activation du suivi avec la console Lambda
<a name="java-tracing-console"></a>

Pour activer/désactiver le traçage actif sur votre fonction Lambda avec la console, procédez comme suit :

**Pour activer le traçage actif**

1. Ouvrez la [page Functions](https://console.aws.amazon.com/lambda/home#/functions) (Fonctions) de la console Lambda.

1. Choisissez une fonction.

1. Choisissez **Configuration**, puis choisissez **Outils de surveillance et d’opérations**.

1. Dans **Outils de surveillance supplémentaires**, choisissez **Modifier**.

1. Sous **Signaux CloudWatch d'application et AWS X-Ray** sélectionnez **Activer les traces** de **service Lambda**.

1. Choisissez **Enregistrer**.

## Activation du suivi avec l’API Lambda
<a name="java-tracing-api"></a>

Configurez le suivi sur votre fonction Lambda avec le AWS SDK AWS CLI or, utilisez les opérations d'API suivantes :
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)

L'exemple de AWS CLI commande suivant active le suivi actif sur une fonction nommée **my-function**.

```
aws lambda update-function-configuration --function-name my-function \
--tracing-config Mode=Active
```

Le mode de suivi fait partie de la configuration spécifique de la version lorsque vous publiez une version de votre fonction. Vous ne pouvez pas modifier le mode de suivi sur une version publiée.

## Activation du traçage avec CloudFormation
<a name="java-tracing-cloudformation"></a>

Pour activer le suivi d'une `AWS::Lambda::Function` ressource dans un CloudFormation modèle, utilisez la `TracingConfig` propriété.

**Example [function-inline.yml](https://github.com/awsdocs/aws-lambda-developer-guide/blob/master/templates/function-inline.yml) – Configuration du suivi**  

```
Resources:
  function:
    Type: [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)
    Properties:
      TracingConfig:
        Mode: Active
      ...
```

Pour une `AWS::Serverless::Function` ressource AWS Serverless Application Model (AWS SAM), utilisez la `Tracing` propriété.

**Example [template.yml](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs/template.yml) – Configuration du suivi**  

```
Resources:
  function:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      Tracing: Active
      ...
```

## Interprétation d’un suivi X-Ray
<a name="java-tracing-interpretation"></a>

Votre fonction a besoin d’une autorisation pour charger des données de suivi vers X-Ray. Lorsque vous activez le suivi actif dans la console Lambda, Lambda ajoute les autorisations requises au [rôle d’exécution](lambda-intro-execution-role.md) de votre fonction. Dans le cas contraire, ajoutez la [AWSXRayDaemonWriteAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess)politique au rôle d'exécution.

Une fois que vous avez configuré le suivi actif, vous pouvez observer des demandes spécifiques via votre application. Le [ graphique de services X-Ray](https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html#xray-concepts-servicegraph) affiche des informations sur votre application et tous ses composants. L’exemple suivant montre une application dotée de deux fonctions. La fonction principale traite les événements et renvoie parfois des erreurs. La deuxième fonction située en haut traite les erreurs qui apparaissent dans le groupe de journaux de la première et utilise le AWS SDK pour appeler X-Ray, Amazon Simple Storage Service (Amazon S3) et Amazon Logs. CloudWatch 

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/sample-errorprocessor-servicemap.png)


X-Ray ne trace pas toutes les requêtes vers votre application. X-Ray applique un algorithme d’échantillonnage pour s’assurer que le suivi est efficace, tout en fournissant un échantillon représentatif de toutes les demandes. Le taux d’échantillonnage est 1 demande par seconde et 5 % de demandes supplémentaires. Vous ne pouvez pas configurer ce taux d’échantillonnage X-Ray pour vos fonctions.

Dans X-Ray, un *suivi* enregistre des informations sur une demande traitée par un ou plusieurs *services*. Lambda enregistre deux segments par suivi, ce qui a pour effet de créer deux nœuds sur le graphique du service. L’image suivante met en évidence ces deux nœuds :

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/xray-servicemap-function.png)


Le premier nœud sur la gauche représente le service Lambda qui reçoit la demande d’invocation. Le deuxième nœud représente votre fonction Lambda spécifique. L’exemple suivant illustre une trace avec ces deux segments. Les deux sont nommés **my-function**, mais l’un a pour origine `AWS::Lambda` et l’autre a pour origine `AWS::Lambda::Function`. Si le segment `AWS::Lambda` affiche une erreur, cela signifie que le service Lambda a rencontré un problème. Si le segment `AWS::Lambda::Function` affiche une erreur, cela signifie que votre fonction a rencontré un problème.

![\[\]](http://docs.aws.amazon.com/fr_fr/lambda/latest/dg/images/V2_sandbox_images/my-function-2-v1.png)


Cet exemple développe le segment `AWS::Lambda::Function` pour afficher ses trois sous-segments.

**Note**  
AWS met actuellement en œuvre des modifications du service Lambda. En raison de ces modifications, vous pouvez constater des différences mineures entre la structure et le contenu des messages du journal système et des segments de suivi émis par les différentes fonctions Lambda de votre Compte AWS.  
L’exemple de suivi présenté ici illustre le segment de fonction à l’ancienne. Les différences entre les segments à l’ancienne et de style moderne sont décrites dans les paragraphes suivants.  
Ces modifications seront mises en œuvre au cours des prochaines semaines, et toutes les fonctions, Régions AWS sauf en Chine et dans les GovCloud régions, passeront à l'utilisation du nouveau format des messages de journal et des segments de trace.

Le segment de fonction à l’ancienne contient les sous-segments suivants :
+ **Initialization (Initialisation)** : représente le temps passé à charger votre fonction et à exécuter le [code d’initialisation](foundation-progmodel.md). Ce sous-segment apparaît pour le premier événement traité par chaque instance de votre fonction.
+ **Invocation** – Représente le temps passé à exécuter votre code de gestionnaire.
+ **Overhead (Travail supplémentaire)** – Représente le temps que le fichier d’exécution Lambda passe à se préparer à gérer l’événement suivant.

Le segment de fonction de style moderne ne contient pas de sous-segment `Invocation`. À la place, les sous-segments du client sont directement rattachés au segment de fonction. Pour plus d’informations sur la structure des segments de fonction à l’ancienne et de style moderne, consultez [Comprendre les suivis X-Ray](services-xray.md#services-xray-traces).

**Note**  
Les fonctions [Lambda SnapStart](snapstart.md) incluent également un sous-segment `Restore`. Le sous-segment `Restore` indique le temps nécessaire à Lambda pour restaurer un instantané, charger l’exécution et exécuter les éventuels [hooks d’exécution](snapstart-runtime-hooks.md) après restauration. Le processus de restauration des instantanés peut inclure du temps consacré à des activités en dehors de la MicroVM. Cette heure est indiquée dans le sous-segment `Restore`. Le temps passé en dehors de la microVM pour restaurer un instantané ne vous est pas facturé.

Vous pouvez également utiliser des clients HTTP, enregistrer des requêtes SQL et créer des sous-segments personnalisés avec des annotations et des métadonnées. Pour plus d’informations, consultez [Kit SDK AWS X-Ray pour Java](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java.html) dans le *Guide du développeur AWS X-Ray *.

**Tarification**  
Vous pouvez utiliser le traçage X-Ray gratuitement chaque mois jusqu'à une certaine limite dans le cadre du niveau AWS gratuit. Au-delà de ce seuil, X-Ray facture le stockage et la récupération du suivi. Pour en savoir plus, consultez [Pricing AWS X-Ray](https://aws.amazon.com/xray/pricing/) (Tarification).

## Stockage des dépendances d’exécution dans une couche (kit SDK X-Ray)
<a name="java-tracing-layers"></a>

Si vous utilisez le SDK X-Ray pour instrumenter le code de fonction des clients du AWS SDK, votre package de déploiement peut devenir très volumineux. Pour éviter de charger des dépendances d'environnement d'exécution chaque fois que vous mettez à jour votre code de fonction, empaquetez le kit SDK X-Ray dans une [couche Lambda](chapter-layers.md).

L'exemple suivant montre une ressource `AWS::Serverless::LayerVersion` qui stocke AWS SDK pour Java et le kit SDK X-Ray pour Java.

**Example [template.yml](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-java/template.yml) : couche de dépendances**  

```
Resources:
  function:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      CodeUri: build/distributions/blank-java.zip
      Tracing: Active
      Layers:
        - !Ref libs
      ...
  libs:
    Type: [AWS::Serverless::LayerVersion](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-layerversion.html)
    Properties:
      LayerName: blank-java-lib
      Description: Dependencies for the blank-java sample app.
      ContentUri: build/blank-java-lib.zip
      CompatibleRuntimes:
        - java25
```

Avec cette configuration, vous ne mettez à jour les fichiers de couche de bibliothèque que si vous modifiez vos dépendances d’exécution. Étant donné que le package de déploiement de la fonction contient uniquement votre code, cela peut contribuer à réduire les temps de chargement.

La création d'une couche pour les dépendances nécessite des modifications de configuration de création pour créer l'archive des couches avant le déploiement. Pour un exemple pratique, consultez l'exemple d'application [java-basic](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-basic) sur. GitHub

## Suivi de X-Ray dans des exemples d'applications (kit SDK X-Ray)
<a name="java-tracing-samples"></a>

Le GitHub référentiel de ce guide inclut des exemples d'applications illustrant l'utilisation du traçage par rayons X. Chaque exemple d'application inclut des scripts pour faciliter le déploiement et le nettoyage, un AWS SAM modèle et des ressources de support.

**Exemples d’applications Lambda en Java**
+ [example-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/example-java) : fonction Java qui montre comment utiliser Lambda pour traiter les commandes. Cette fonction montre comment définir et désérialiser un objet d'événement d'entrée personnalisé, utiliser le AWS SDK et enregistrer les sorties.
+ [java-basic](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-basic) – Ensemble de fonctions Java minimales avec des tests unitaires et une configuration de journalisation variable.
+ [java events](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-events) – Ensemble de fonctions Java contenant du code squelette permettant de gérer les événements de divers services tels qu’Amazon API Gateway, Amazon SQS et Amazon Kinesis. Ces fonctions utilisent la dernière version de la [aws-lambda-java-events](java-package.md)bibliothèque (3.0.0 et versions ultérieures). Ces exemples ne nécessitent pas le AWS SDK en tant que dépendance.
+ [s3-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/s3-java) – Fonction Java qui traite les événements de notification d’Amazon S3 et utilise la bibliothèque de classes Java (JCL) pour créer des miniatures à partir de fichiers d’image chargés.
+ [layer-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/layer-java) : fonction Java qui illustre comment utiliser une couche Lambda pour empaqueter les dépendances séparément du code de votre fonction principale.

Tous les exemples d'applications ont un suivi actif activé pour les fonctions Lambda. Par exemple, l'`s3-java`application montre l'instrumentation automatique des AWS SDK for Java 2.x clients, la gestion des segments pour les tests, les sous-segments personnalisés et l'utilisation de couches Lambda pour stocker les dépendances d'exécution.

# Exemples d'applications Java pour AWS Lambda
<a name="java-samples"></a>

Le GitHub référentiel de ce guide fournit des exemples d'applications illustrant l'utilisation de Java dans AWS Lambda. Chaque exemple d'application inclut des scripts pour faciliter le déploiement et le nettoyage, un CloudFormation modèle et des ressources de support.

**Exemples d’applications Lambda en Java**
+ [example-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/example-java) : fonction Java qui montre comment utiliser Lambda pour traiter les commandes. Cette fonction montre comment définir et désérialiser un objet d'événement d'entrée personnalisé, utiliser le AWS SDK et enregistrer les sorties.
+ [java-basic](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-basic) – Ensemble de fonctions Java minimales avec des tests unitaires et une configuration de journalisation variable.
+ [java events](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-events) – Ensemble de fonctions Java contenant du code squelette permettant de gérer les événements de divers services tels qu’Amazon API Gateway, Amazon SQS et Amazon Kinesis. Ces fonctions utilisent la dernière version de la [aws-lambda-java-events](java-package.md)bibliothèque (3.0.0 et versions ultérieures). Ces exemples ne nécessitent pas le AWS SDK en tant que dépendance.
+ [s3-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/s3-java) – Fonction Java qui traite les événements de notification d’Amazon S3 et utilise la bibliothèque de classes Java (JCL) pour créer des miniatures à partir de fichiers d’image chargés.
+ [layer-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/layer-java) : fonction Java qui illustre comment utiliser une couche Lambda pour empaqueter les dépendances séparément du code de votre fonction principale.

**Exécution de cadres Java populaires sur Lambda**
+ [spring-cloud-function-samples](https://github.com/spring-cloud/spring-cloud-function/tree/3.2.x/spring-cloud-function-samples/function-sample-aws)— Un exemple tiré de Spring qui montre comment utiliser le framework [Spring Cloud Function](https://spring.io/projects/spring-cloud-function) pour créer des fonctions AWS Lambda. 
+ [Démo de l'application Spring Boot sans serveur](https://github.com/aws-samples/serverless-java-frameworks-samples/tree/main/springboot) : exemple qui montre comment configurer une application Spring Boot typique dans un environnement d'exécution Java géré avec ou sans SnapStart, ou en tant qu'image native de GraalVM avec un environnement d'exécution personnalisé.
+ [Démonstration de l'application Micronaut sans serveur](https://github.com/aws-samples/serverless-java-frameworks-samples/tree/main/micronaut) — Un exemple qui montre comment utiliser Micronaut dans un environnement d'exécution Java géré avec et sans SnapStart, ou en tant qu'image native de GraalVM avec un environnement d'exécution personnalisé. Pour en savoir plus, consultez les [guides Micronaut/Lambda](https://guides.micronaut.io/latest/tag-lambda.html).
+ [Démo de l'application Quarkus sans serveur](https://github.com/aws-samples/serverless-java-frameworks-samples/tree/main/quarkus) — Un exemple qui montre comment utiliser Quarkus dans un environnement d'exécution Java géré avec et sans SnapStart, ou en tant qu'image native de GraalVM avec un environnement d'exécution personnalisé. [Pour en savoir plus, consultez le guide [Quarkus/Lambda et le guide Quarkus/Lambda](https://quarkus.io/guides/aws-lambda). SnapStart ](https://quarkus.io/guides/aws-lambda-snapstart)

Si vous débutez avec les fonctions Lambda dans Java, commencez par les exemples `java-basic`. Pour démarrer avec les sources d’événement Lambda, consultez les exemples `java-events`. Ces deux ensembles d'exemples montrent l'utilisation des bibliothèques Java, des variables d'environnement, du SDK et du AWS SDK de Lambda. AWS X-Ray Ces exemples nécessitent une configuration minimale et peuvent être déployé à partir de la ligne de commande en moins d’une minute.