View a markdown version of this page

Gérer l'unicité avec Lambda SnapStart - AWS Lambda

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

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 les identifiants uniques, les secrets uniques et l’entropie utilisée pour générer un pseudo aléatoire.

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

Pendant la phase d'initialisation de votre fonction d'événement, évitez de mettre en cache des données censées être uniques, par exemple en générant un identifiant unique pour la journalisation ou en définissant des valeurs de départ pour des fonctions aléatoires. 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.

Les exemples suivants montrent comment générer un UUID dans le gestionnaire Event Function.

Java
Exemple— Génération d'un identifiant unique dans le gestionnaire de fonctions d'événement
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
Exemple— Génération d'un identifiant unique dans le gestionnaire de fonctions d'événement
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
Exemple— Génération d'un identifiant unique dans le gestionnaire de fonctions d'événement
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}"; } }

Utilisation de générateurs de nombres pseudo aléatoires cryptographiquement sécurisés (CSPRNG)

Lorsqu'il SnapStart est activé, Lambda prend un instantané de l'environnement d'exécution de votre fonction, y compris de toute la mémoire de l'application et du système. Cela signifie que l'état interne de chaque générateur de nombres aléatoires (RNG) est préservé exactement tel qu'il était au moment de la capture d'écran, ainsi que tous les octets aléatoires que votre application ou ses dépendances ont déjà générés et stockés dans des mémoires tampons.

Lorsque Lambda restaure un environnement d'exécution à partir d'un instantané, il réinitialise le générateur de nombres aléatoires du noyau à partir /dev/random et /dev/urandom avec une nouvelle entropie. Un logiciel qui lit des nombres aléatoires directement à partir de ces appareils maintient le caractère aléatoire avec SnapStart.

Si votre application dépend du caractère aléatoire, nous vous recommandons d’utiliser des générateurs de nombres aléatoires cryptographiquement sécurisés (CSPRNG). Outre l'OpenSSL fourni par AL, les environnements d'exécution gérés par Lambda compatibles SnapStart (Java version 11+, Python version 3.12+ et .NET version 8+) incluent les CSPRNG intégrés suivants :

  • Java : java.security.SecureRandom

  • Python : random.SystemRandom

  • .NET : System.Security.Cryptography.RandomNumberGenerator

Note

Pour l'exécution de Go Lambda, aucune modification n'est requise si vos fonctions utilisent la bibliothèque standardcrypto/rand, qui est compatible avec Snapstart par défaut.

Lorsque vous empaquetez votre fonction sous forme d'image de conteneur, votre image de base détermine l'unicité de la compatibilité avec SnapStart :

Versions de bibliothèque minimales prises en charge

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 d'événement 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 cryptographiques précédentes avec vos fonctions d'événement 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 utiliser de CSPRNG pour garantir des séquences de nombres uniques même lorsque la fonction est restaurée à partir d’un instantané.

Java
Exemple— 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
Exemple— 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
Exemple– 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)

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 SpotBugsplugin 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 sur. GitHub

Pour en savoir plus sur la gestion de l'unicité avec SnapStart, consultez Starting up faster with AWS Lambda SnapStart sur le blog AWS Compute.