

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.

# Gérer l'unicité avec Lambda SnapStart
<a name="snapstart-uniqueness"></a>

Lorsque les invocations augmentent sur une SnapStart fonction, Lambda utilise un seul instantané initialisé pour reprendre plusieurs environnements d'exécution. Si votre code d’initialisation génère un contenu unique qui est inclus dans l’instantané, ce contenu peut ne pas être unique lorsqu’il est réutilisé dans plusieurs environnements d’exécution. Pour conserver l'unicité lors de l'utilisation SnapStart, vous devez générer un contenu unique après l'initialisation. Cela inclut des secrets uniques et uniques IDs, ainsi que l'entropie utilisée pour générer du pseudo-hasard.

Nous vous recommandons les bonnes pratiques suivantes pour vous aider à maintenir l’unicité de votre code. Pour les fonctions Java, Lambda fournit également un [outil d'SnapStart analyse](#snapstart-scanning) open source pour aider à vérifier le code qui suppose un caractère unique. Si vous générez des données uniques pendant la phase d’initialisation, vous pouvez utiliser un [hook d’exécution](snapstart-runtime-hooks.md) pour rétablir l’unicité. Avec les hooks d’exécution, vous pouvez exécuter un code spécifique immédiatement avant que Lambda ne prenne un instantané ou immédiatement après que Lambda ait repris une fonction à partir d’un instantané.

## Évitez de sauvegarder un état qui dépend de l’unicité pendant l’initialisation
<a name="snapstart-caching-unique"></a>

Pendant la [phase d’initialisation](lambda-runtime-environment.md#runtimes-lifecycle-ib) de votre fonction, évitez de mettre en cache des données qui sont censées être uniques, comme la génération d’un ID unique pour la journalisation ou la configuration de seeds pour les fonctions random. Nous vous recommandons plutôt de générer des données uniques ou de configurer des seeds pour des fonctions random dans votre gestionnaire de fonction ou d’utiliser un [hook d’exécution](snapstart-runtime-hooks.md).

Les exemples suivants montrent comment générer un UUID dans le gestionnaire de fonctions.

------
#### [ Java ]

**Example – Génération d’un ID unique dans le gestionnaire de fonctions**  

```
import java.util.UUID;
  public class Handler implements RequestHandler<String, String> {
    private static UUID uniqueSandboxId = null;
    @Override
    public String handleRequest(String event, Context context) {
      if (uniqueSandboxId == null)
        uniqueSandboxId = UUID.randomUUID();
      System.out.println("Unique Sandbox Id: " + uniqueSandboxId);
      return "Hello, World!";
    }
  }
```

------
#### [ Python ]

**Example – Génération d’un ID unique dans le gestionnaire de fonctions**  

```
import json
import random
import time

unique_number = None

def lambda_handler(event, context):
    seed = int(time.time() * 1000) 
    random.seed(seed)
    global unique_number
    if not unique_number:
        unique_number = random.randint(1, 10000)
        
    print("Unique number: ", unique_number)
    
    return "Hello, World!"
```

------
#### [ .NET ]

**Example – Génération d’un ID unique dans le gestionnaire de fonctions**  

```
namespace Example;
public class SnapstartExample
{
    private Guid _myExecutionEnvironmentGuid;
    public SnapstartExample()
    {
        // This GUID is set for non-restore use cases, such as testing or if SnapStart is turned off
        _myExecutionEnvironmentGuid = new Guid();
        // Register the method which will run after each restore. You may need to update Amazon.Lambda.Core to see this
        Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(MyAfterRestore);
    }

    private ValueTask MyAfterRestore()
    {
        // After restoring this snapshot to a new execution environment, update the GUID
        _myExecutionEnvironmentGuid = new Guid();
        return ValueTask.CompletedTask;
    }

    public string Handler()
    {
        return $"Hello World! My Execution Environment GUID is {_myExecutionEnvironmentGuid}";
    }
}
```

------

## Utiliser des générateurs de nombres pseudo-aléatoires sécurisés par cryptographie () CSPRNGs
<a name="snapstart-csprng"></a>

Si votre application repose sur le caractère aléatoire, nous vous recommandons d'utiliser des générateurs de nombres aléatoires sécurisés par cryptographie ()CSPRNGs. Outre OpenSSL 1.0.2, les environnements d'exécution gérés par Lambda incluent également les fonctionnalités intégrées suivantes : CSPRNGs
+ **Java :** `java.security.SecureRandom`
+ **Python :** `random.SystemRandom`
+ **.NET :** `System.Security.Cryptography.RandomNumberGenerator`

Logiciel qui obtient toujours des nombres aléatoires `/dev/random` ou qui `/dev/urandom` maintient le caractère aléatoire avec SnapStart.

AWS les bibliothèques de cryptographie conservent automatiquement le caractère aléatoire en SnapStart commençant par les versions minimales spécifiées dans le tableau suivant. Si vous utilisez ces bibliothèques avec vos fonctions Lambda, assurez-vous d’utiliser les versions minimales ou ultérieures suivantes :


****  

| Bibliothèque | Version minimale prise en charge (x86) | Version minimale prise en charge (ARM) | 
| --- | --- | --- | 
| AWS libcrypto (AWS-LC) |  1.16.0  |  1.30.0  | 
| AWS libcrypto FIPS |  2.0.13  | 2.0.13 | 

Si vous empaquetez les bibliothèques de chiffrement ci-dessus avec vos fonctions Lambda sous forme de dépendances transitives via les bibliothèques suivantes, assurez-vous d’utiliser les versions minimales suivantes ou des versions ultérieures :


****  

| Bibliothèque | Version minimale prise en charge (x86) | Version minimale prise en charge (ARM) | 
| --- | --- | --- | 
| AWS SDK for Java 2.x |  2,23,20  |  2,26,12  | 
| AWS Common Runtime pour Java |  0,29,8  |  0,29,25  | 
| Amazon Corretto Crypto Provider |  2.4.1  | 2.4.1 | 
| Amazon Corretto Crypto Provider FIPS |  2.4.1  | 2.4.1 | 

Les exemples suivants montrent comment garantir des séquences CSPRNGs de numéros uniques même lorsque la fonction est restaurée à partir d'un instantané.

------
#### [ Java ]

**Example — java.security. SecureRandom**  

```
import java.security.SecureRandom;
  public class Handler implements RequestHandler<String, String> {
    private static SecureRandom rng = new SecureRandom();
    @Override
    public String handleRequest(String event, Context context) {
      for (int i = 0; i < 10; i++) {
        System.out.println(rng.next());
      }
      return "Hello, World!";
    }
  }
```

------
#### [ Python ]

**Example — aléatoire. SystemRandom**  

```
import json
import random

secure_rng = random.SystemRandom()

def lambda_handler(event, context):
    random_numbers = [secure_rng.random() for _ in range(10)]
    
    for number in random_numbers:
        print(number)
    
    return "Hello, World!"
```

------
#### [ .NET ]

**Example – RandomNumberGenerator**  

```
using Amazon.Lambda.Core;
using System.Security.Cryptography;
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace DotnetSecureRandom;

public class Function
{
    public string FunctionHandler()
    {
        using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
        {
            byte[] randomUnsignedInteger32Bytes = new byte[4];
            for (int i = 0; i < 10; i++)
            {
                rng.GetBytes(randomUnsignedInteger32Bytes);
                int randomInt32 = BitConverter.ToInt32(randomUnsignedInteger32Bytes, 0);
                Console.WriteLine("{0:G}", randomInt32);
            }
        }
        return "Hello World!";
    }
}
```

------

## SnapStart outil de numérisation (Java uniquement)
<a name="snapstart-scanning"></a>

Lambda fournit un outil d’analyse pour Java pour vous aider à vérifier le code qui suppose l’unicité. L'outil de SnapStart numérisation est un [SpotBugs](https://spotbugs.github.io/)plugin open source qui exécute une analyse statique par rapport à un ensemble de règles. L’outil d’analyse aide à identifier les implémentations de code potentielles qui pourraient enfreindre les suppositions concernant l’unicité. Pour les instructions d'installation et la liste des vérifications effectuées par l'outil d'analyse, consultez le référentiel [aws-lambda-snapstart-java-rules](https://github.com/aws/aws-lambda-snapstart-java-rules) sur GitHub.

Pour en savoir plus sur la gestion de l'unicité avec SnapStart, consultez [Starting up faster with AWS Lambda SnapStart](https://aws.amazon.com/blogs/compute/starting-up-faster-with-aws-lambda-snapstart/) sur le blog AWS Compute.