View a markdown version of this page

Gestire l'unicità con Lambda SnapStart - AWS Lambda

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Gestire l'unicità con Lambda SnapStart

Quando le invocazioni aumentano su una SnapStart funzione, Lambda utilizza una singola istantanea inizializzata per riprendere più ambienti di esecuzione. Se il codice di inizializzazione genera contenuti unici inclusi nello snapshot, il contenuto potrebbe non essere più unico quando viene riutilizzato in più ambienti di esecuzione. Per mantenere l'unicità durante l'utilizzo SnapStart, è necessario generare contenuti univoci dopo l'inizializzazione. Ciò include ID univoci, segreti univoci ed entropia utilizzata per generare pseudocasualità.

Di seguito sono riportate le best practice che consentono di mantenere l'unicità nel codice. Per le funzioni Java, Lambda fornisce anche uno strumento di SnapStart scansione open source per aiutare a verificare la presenza di codice che presuppone l'unicità. Se durante la fase di inizializzazione vengono generati dati univoci, è possibile utilizzare un hook di runtime per ripristinare l'unicità. Con gli hook di runtime, puoi eseguire codice specifico immediatamente prima che Lambda esegua uno snapshot o subito dopo che Lambda riprende una funzione da uno snapshot.

Evitare lo stato di salvataggio che dipende dall'unicità durante l'inizializzazione

Durante la fase di inizializzazione della funzione, evita di memorizzare nella cache dati destinati a essere univoci, ad esempio la generazione di un ID univoco per la registrazione o l'impostazione di seed per funzioni casuali. Ti consigliamo invece di generare dati univoci o impostare seed per le funzioni casuali all'interno dell'handler delle funzioni o di utilizzare un hook di runtime.

I seguenti esempi mostrano come generare un UUID nell'handler delle funzioni.

Java
Esempio: generazione di un ID univoco nel gestore delle funzioni
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
Esempio: generazione di un ID univoco nel gestore delle funzioni
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
Esempio: generazione di un ID univoco nel gestore delle funzioni
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}"; } }

Utilizza generatori di numeri pseudocasuali crittograficamente sicuri (CSPRNG)

Quando SnapStart è abilitato, Lambda scatta un'istantanea dell'ambiente di esecuzione della funzione, inclusa tutta la memoria dell'applicazione e del sistema. Ciò significa che lo stato interno di ogni generatore di numeri casuali (RNG) viene mantenuto esattamente com'era al momento dell'istantanea, insieme a tutti i byte casuali che l'applicazione o le sue dipendenze hanno già generato e archiviati nei buffer di memoria.

Quando Lambda ripristina un ambiente di esecuzione da un'istantanea, risemina il generatore di numeri casuali del kernel da e con una nuova entropia. /dev/random /dev/urandom Il software che legge numeri casuali direttamente da questi dispositivi mantiene la casualità con. SnapStart

Se l'applicazione dipende dalla casualità, si consiglia di utilizzare generatori di numeri casuali crittograficamente sicuri (CSPRNG). Oltre all'OpenSSL fornito da AL, i runtime gestiti da Lambda che supportano SnapStart (Java versione 11+, Python versione 3.12+ e .NET versione 8+) includono i seguenti CSPRNG integrati:

  • Java: java.security.SecureRandom

  • Python: random.SystemRandom

  • .NET: System.Security.Cryptography.RandomNumberGenerator

Nota

Per il runtime di Go Lambda non sono necessarie modifiche se le funzioni utilizzano la libreria standard, che è compatibile con snapstart per impostazione predefinita. crypto/rand

Quando impacchettate la funzione come immagine contenitore, l'immagine di base determina la compatibilità dell'unicità con: SnapStart

  • Un'immagine base Lambda per un runtime gestito (Java versione 11+, Python versione 3.12+ e .NET versione 8+): compatibile con quanto descritto sopra. SnapStart

  • L'immagine di base provided.al2023: compatibile se il runtime del linguaggio di programmazione ottiene entropia da OpenSSL (openssl-snapsafe-libs) o dalla SnapStart-compatible build di OpenSSL (/dev/randomopenssl-snapsafe-libs) /dev/urandom elencata nell'elenco dei pacchetti di Amazon Linux 2023. https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages.html Se il tuo runtime si basa su altre fonti di entropia, segui i passaggi descritti nella sezione «La tua immagine di base» di seguito.

  • Immagine di base personalizzata: controlla le tue librerie crittografiche e utilizza un runtime hook successivo al ripristino per eliminare qualsiasi stato del generatore di numeri casuali (RNG) memorizzato nella cache o i byte casuali bufferizzati, assicurandoti che la libreria legga nuova entropia dal sistema dopo il ripristino. Ad esempio, le funzioni Rust utilizzate devono richiamare dopo il ripristino. rand::rngs::ThreadRng reseed() Ti consigliamo di creare utilizzando un'immagine base Lambda quando possibile. In particolare, se l'immagine di base include una propria versione di OpenSSL o un fork di OpenSSL (come BoringSSL o LibreSSL), passa all'immagine di base provided.al2023, che include una SnapStart-compatible build di OpenSSL (openssl-snapsafe-libs), oppure usa libcrypto (-LC). AWSAWS

Versioni minime della libreria supportate

AWS Le librerie di crittografia mantengono automaticamente la casualità a SnapStart partire dalle versioni minime specificate nella tabella seguente. Se usi queste librerie con le tue funzioni Lambda, assicurati di utilizzare le seguenti versioni minime o versioni successive:

Libreria Versione minima supportata (x86) Versione minima supportata (ARM)
AWS libcrypto (-LC)AWS

1.16.0

1.30.0

AWS libcrypto FIPS

2.0.13

2.0.13

Se impacchetti le librerie di crittografia precedenti con le funzioni Lambda come dipendenze transitive tramite le seguenti librerie, assicurati di utilizzare le seguenti versioni minime o versioni successive:

Libreria Versione minima supportata (x86) Versione minima supportata (ARM)
AWS SDK for Java 2.x

2.23.20

2,26,12

AWS Common Runtime per Java

0.29.8

0,29,25

Fornitore di servizi di crittografia Amazon Corretto

2.4.1

2.4.1
FIPS Fornitore di servizi di crittografia Amazon Corretto

2.4.1

2.4.1

Gli esempi seguenti mostrano come utilizzare i CSPRNG per garantire sequenze numeriche univoche anche quando la funzione viene ripristinata da uno snapshot.

Java
Esempio— 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
Esempio— casuale. 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
Esempio– 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 strumento di scansione (solo Java)

Lambda fornisce uno strumento di scansione che aiuta a verificare la presenza di codice che presuppone l'unicità. Lo strumento SnapStart di scansione è un SpotBugs plug-in open source che esegue un'analisi statica rispetto a una serie di regole. Lo strumento di scansione consente di identificare potenziali implementazioni di codice che potrebbero infrangere i presupposti sull'unicità. Per le istruzioni di installazione e un elenco dei controlli eseguiti dallo strumento di scansione, consulta il repository https://github.com/aws/aws-lambda-snapstart-java-rules aws-lambda-snapstart-java-rules su. GitHub

Per saperne di più sulla gestione dell'unicità con, consulta Starting up faster with sul Compute Blog. SnapStart AWS Lambda SnapStart AWS