Control de la exclusividad con Lambda SnapStart
Cuando las invocaciones escalar verticalmente en una función de SnapStart, Lambda utiliza una instantánea exclusiva inicializada para reanudar varios entornos de ejecución. Si el código de inicialización genera contenido único que se incluye en la instantánea, es posible que el contenido no lo sea cuando se reutilice en los entornos de ejecución. Para mantener la exclusividad al utilizar SnapStart, debe generar contenido único después de la inicialización. Esto incluye ID y secretos únicos y entropía que se utiliza para generar pseudoaleatoriedad.
Sugerimos las siguientes prácticas recomendadas para ayudarlo a mantener la exclusividad en su código: Para las funciones de Java, Lambda también proporciona una herramienta de escaneo de SnapStart de código abierto para ayudar a comprobar si el código asume que es exclusivo. Si genera datos exclusivos durante la fase de inicialización, puede utilizar un enlace de tiempo de ejecución para restaurar la exclusividad. Con los enlaces de tiempo de ejecución, puede ejecutar un código específico inmediatamente antes de que Lambda tome una instantánea o inmediatamente después de que Lambda reanude una función a partir de una instantánea.
Evite guardar el estado que depende de la exclusividad durante la inicialización.
Durante la fase de inicialización de la función, evite almacenar en caché datos destinados a ser exclusivos, por ejemplo, generar un ID exclusivo para el registro o configurar valores de inicialización para funciones de asignación al azar. En su lugar, recomendamos que genere datos exclusivos o establezca valores de inicialización para funciones de asignación al azar dentro de su controlador de funciones, o que utilice un enlace de tiempo de ejecución.
En el ejemplo siguiente, se muestra cómo generar un UUID en el controlador de funciones.
Utilice generadores de números pseudoaleatorios criptográficamente seguros (CSPRNG)
Cuando SnapStart está activado, Lambda toma una instantánea del entorno de ejecución de la función, incluida toda la memoria del sistema y de las aplicaciones. Esto significa que el estado interno de cada generador de números asignados al azar (RNG) se conserva exactamente como estaba en el momento de la instantánea, junto con los bytes asignados al azar que la aplicación o sus dependencias ya hayan generado y almacenado en los búferes de memoria.
Cuando Lambda restaura un entorno de ejecución a partir de una instantánea, reinicia el generador de números asignados al azar del kernel desde /dev/random y /dev/urandom con una nueva entropía. El software que lee números asignados al azar directamente desde estos dispositivos mantiene la asignación al azar con SnapStart.
Si su aplicación depende de la aleatoriedad, le recomendamos que utilice generadores de números pseudoaleatorios criptográficamente seguros. Además del OpenSSL proporcionado por AL, los tiempos de ejecución administrados por Lambda que admiten SnapStart (Java versión 11+, Python versión 3.12+ y .NET versión 8+) incluyen los siguientes CSPRNG integrados:
-
Java:
java.security.SecureRandom -
Python:
random.SystemRandom -
.NET:
System.Security.Cryptography.RandomNumberGenerator
nota
Para el tiempo de ejecución de Go Lambda, no es necesario realizar cambios si las funciones utilizan la biblioteca estándar crypto/rand, que es compatible con SnapStart de forma predeterminada.
Al empaquetar la función como una imagen de contenedor, la imagen base determina la unicidad y la compatibilidad con SnapStart:
-
Imagen base de Lambda para un tiempo de ejecución administrado (Java versión 11+, Python versión 3.12+ y .NET versión 8+): compatible con SnapStart tal y como se ha descrito anteriormente.
-
La imagen base provided.al2023: compatible si el tiempo de ejecución del lenguaje de programación obtiene entropía de
/dev/random,/dev/urandomo la versión de OpenSSL compatible con SnapStart (openssl-snapsafe-libs) que aparece en la lista de paquetes de Amazon Linux 2023. Si su tiempo de ejecución se basa en otros orígenes de entropía, siga los pasos que se describen en la sección «Su propia imagen base», que aparece a continuación. -
Su propia imagen base: audite sus bibliotecas criptográficas y utilice un enlace de tiempo de ejecución posterior a la restauración para descartar cualquier estado del generador de números asignados al azar (RNG) almacenado en caché o los bytes asignados al azar almacenados en búfer, asegurándose de que la biblioteca lea la entropía nueva del sistema tras la restauración. Por ejemplo, las funciones de Rust que utilizan
rand::rngs::ThreadRngdeben llamar areseed()después de la restauración. Se recomienda crear con una imagen base de Lambda siempre que sea posible. En concreto, si la imagen base incluye su propia versión de OpenSSL o una bifurcación de OpenSSL (como BoringSSL o LibreSSL), cambie a la imagen base provided.al2023, que incluye una versión de OpenSSL compatible con SnapStart (openssl-snapsafe-libs), o utilice AWS libcrypto (AWS-LC).
Versiones mínimas compatibles de la biblioteca
AWSLas bibliotecas de criptografía de mantienen automáticamente la aleatoriedad con SnapStart a partir de las versiones mínimas especificadas en la siguiente tabla. Si utiliza estas bibliotecas con las funciones de Lambda, asegúrese de usar las siguientes versiones mínimas o posteriores:
| Library | Versión mínima compatible (x86) | Versión mínima compatible (ARM) |
|---|---|---|
| AWS libcrypto (AWS-LC) |
1.16.0 |
1.30.0 |
| AWS libcrypto FIPS |
2.0.13 |
2.0.13 |
Si empaqueta las bibliotecas criptográficas anteriores con sus funciones de Lambda como dependencias transitivas a través de las siguientes bibliotecas, asegúrese de utilizar las siguientes versiones mínimas o posteriores:
| Library | Versión mínima compatible (x86) | Versión mínima compatible (ARM) |
|---|---|---|
| AWS SDK for Java 2.x |
2.23.20 |
2.26.12 |
| AWS Common Runtime for 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 |
En los siguientes ejemplos, se demuestra cómo utilizar los CSPRNG para garantizar secuencias numéricas exclusivas incluso cuando la función se restaura a partir de una instantánea.
Herramienta de escaneo de SnapStart (solo Java)
Lambda proporciona una herramienta de escaneo para Java que lo ayuda a verificar el código que asume exclusividad. La herramienta de escaneo SnapStart es un complemento de SpotBugs
Para obtener más información sobre cómo gestionar la exclusividad con SnapStart, consulte Inicio más rápido con AWS Lambda SnapStart