Entorno de Ejecución de Lambda
Cuando Lambda ejecuta una función por nosotros, administra tanto el aprovisionamiento como los recursos necesarios para ejecutar el código. Esto permite a los programadores centrarse en la lógica de negocio y escribir código, no en administrar sistemas.
El servicio Lambda se divide en el control plane y el data plane. Cada plano sirve a un propósito distinto en el servicio. El control plane proporciona las APIs de administración de funciones (CreateFunction, UpdateFunctionCode) y administra las integraciones con todos los servicios de AWS. El data plane controla la invocación al API que ejecuta las funciones de Lambda. Cuando se invoca una función Lambda, el data plane asigna un entorno de ejecución a esa función, o elige un entorno de ejecución existente que ya se ha configurado para esa función, luego ejecuta el código de función en ese entorno.
Cada función se ejecuta en uno o más entornos de ejecución dedicados que se utilizan durante la vida útil de la función y luego se destruyen. Cada entorno de ejecución aloja una invocación concurrente, pero se reutiliza en su lugar en múltiples invocaciones en serie de la misma función. Los entornos de ejecución se ejecutan en máquinas virtuales virtualizadas por hardware (microVM). Un microVM está dedicado a una cuenta de AWS, pero puede ser reutilizado por entornos de ejecución a través de funciones dentro de una cuenta. Los MicroVM se empaquetan en una plataforma de hardware administrada y propiedad de AWS (Lambda Workers). Los entornos de ejecución nunca se comparten entre las funciones, y los microVM nunca se comparten entre las cuentas de AWS.
La siguiente figura representa el Isolation model for AWS Lambda:
Isolation Between Functions and Between MicroVMs:
Cada entorno de ejecución contiene una copia dedicada de los siguientes elementos:
- El código de la función
- Cualquier Lambda layers seleccionada para su función
- El runtime de la función, ya sea built-in (Java 8, NodeJS 8, Python 3.7, etc.) o personalizado
- Un mínimo de Linux userland basado en Amazon Linux
Los entornos de ejecución se aíslan unos de otros utilizando varias tecnologías de contenedor integradas en el kernel de Linux. Estas tecnologías incluyen:
- cgroups: restringe el acceso a los recursos para limitar CPU, la memoria, el rendimiento del disco y el rendimiento de la red, por entorno de ejecución.
- namespaces: ID de proceso de grupo, ID de usuario, interfaces de red y otros recursos administrados por el kernel de Linux. Cada entorno de ejecución se ejecuta en un namespace dedicado.
- seccomp-bpf: limita las llamadas al sistema que se pueden usar desde el entorno de ejecución.
- iptables and routing tables: aísla los entornos de ejecución entre sí.
- chroot: proporciona acceso con alcance al sistema de archivos subyacente.
Junto con las tecnologías de aislamiento patentadas de AWS, estos mecanismos proporcionan un fuerte aislamiento entre entornos de ejecución. Este aislamiento garantiza que los entornos no puedan acceder o modificar datos que pertenecen a otros entornos.
Aunque múltiples entornos de ejecución desde una sola cuenta de AWS pueden ejecutarse en un solo microVM, los microVM nunca se comparten o reutilizan entre las cuentas de AWS. En este momento, AWS Lambda utiliza dos mecanismos diferentes para aislar microVM: instancias EC2 y Firecracker. Las instancias EC2 se han utilizado para el aislamiento de Lambda guest desde 2015. Firecracker es un nuevo hipervisor de código abierto desarrollado por AWS especialmente para cargas de trabajo sin servidor, y se introdujo en 2018. El hardware físico subyacente que ejecuta microVM será compartido por las cargas de trabajo de varias cuentas.
Storage and State:
Aunque los entornos de ejecución de Lambda nunca se reutilizan en todas las funciones, se puede reutilizar un único entorno de ejecución para invocar la misma función, que puede existir durante horas antes de que se destruya. Las funciones pueden aprovechar este comportamiento para mejorar la eficiencia al mantener cachés locales, reutilizar conexiones duraderas (long-lived) entre invocaciones y calcular previamente resultados comunes. Dentro de un entorno de ejecución, estas invocaciones múltiples son manejadas por un solo proceso, por lo que cualquier estado de todo el proceso (como un estado static en Java) podría estar disponible para futuras invocaciones para su reutilización, si la invocación se produce en un entorno de ejecución reutilizado.
Cada entorno de ejecución Lambda también incluye un sistema de archivos de escritura, disponible en / tmp. Este almacenamiento no es accesible para otros entornos de ejecución. Al igual que con el estado del proceso, los archivos escritos en / tmp permanecen durante toda la vida del entorno de ejecución. Esto permite que las costosas operaciones de transferencia, como la descarga de modelos de aprendizaje automático (ML), se amorticen en varias invocaciones. Las funciones que no desean conservar datos entre invocaciones no deberían escribir en / tmp, o eliminar sus archivos de / tmp después de cada invocación. El almacenamiento / tmp se implementa con Amazon Elastic Block Store (Amazon EBS) o el almacenamiento local en la instancia de trabajo de Lambda.
Además, antes de la primera invocación de una función, Lambda limpia la memoria antes de asignarla a un entorno de ejecución, lo que protege eficazmente contra el intercambio de memoria entre funciones que pertenecen a la misma cuenta y diferentes cuentas de clientes. Para facilitar la reutilización del entorno de ejecución, Lambda no elimina la memoria entre invocaciones posteriores en el mismo entorno de ejecución para la misma función. Puede implementar su propio cifrado de memoria y proceso de borrado antes de la finalización de la función.
Referencia: AWS Documentation
ANALISTA EN ADMINISTRACIÓN - TÉCNICO SUPERIOR EN SISTEMAS
5 añosMuy interesante Vladimir Vivar gracias