DEV Community

Cover image for AWS Lambda MicroVMs: Cómo crear entornos de código aislados por usuario

AWS Lambda MicroVMs: Cómo crear entornos de código aislados por usuario

AWS Lambda MicroVMs

💡 AWS lanzó Lambda MicroVMs: máquinas virtuales aisladas con Firecracker, arranque en milisegundos y sin infraestructura que administrar.

📝 En este artículo comparto mi experiencia creando un laboratorio de codificación donde cada usuario obtiene su propio VS Code en la nube para resolver ejercicios de Python con pruebas automatizadas — todo corriendo sobre Lambda MicroVMs.

"AWS Lambda MicroVMs: Cómo crear entornos de código aislados por usuario"

AWS Lambda MicroVMs es una tecnología utilizada para virtualización ligera, permitiendo la creación de ambientes de forma segura y aislada con duración de hasta 8 horas y se suspenden sin costo de cómputo cuando están inactivas.

En este artículo exploraremos las experiencias y retos que tuve al crear un laboratorio para evaluar el conocimiento sobre funciones en Python, proporcionando a cada usuario una interfaz de code-server (VS Code web), que le permitiera realizar ajustes en su código y pruebas automatizadas.

1. Beneficios

  • Ejecución de código aislada utilizando Firecracker: No son contenedores, cuando inicias a conocer el servicio podrías confundirlo con contenedores, pero no es así, son maquinas virtuales con su propio kernel y aislamiento a nivel de hardware.
  • Serverless: Tendrás disponibles servidores aislados, sin redes o balanceadores para su acceso, solamente definirás el Dokerfile y empiezas a usarlo.
  • Escalado vertical flexible: Hasta 4x los recursos base configurados.
  • Arranque en milisegundos: Se restaura de un snapshot pre construido, en segundos tu app ya está corriendo.
  • No pagas por cómputo mientras se encuentre en estado suspendido: Cuando no existe tráfico la aplicación se suspende preservando disco y memoria.
  • Autenticación JWE: Permite que cada endpoint este protegido por token con una expiración configurable.
  • El modelo básico de construcción: Dockerfile > Código > Snapshot > Lanzar N microVMs desde esa imagen base

2. Casos de aplicación

  • Plataformas de desarrollo aisladas por usuario
  • Aislamiento de pruebas de seguridad y escaneos de seguridad, impidiendo que el código malicioso pueda afectar otros recursos
  • Ambientes aislados con configuraciones específicas para análisis de datos

3. ¿Contenedores corriendo dentro de Lambdas?

La respuesta es no, al utilizar un Dockerfile, podríamos confundirnos pensando que es así, sin embargo acá este archivo cumple con un rol distinto. Lambda lo utiliza únicamente para definir el listado de lo que necesita instalar y como iniciar la aplicación durante la fase de construcción, El resultado no será una imagen de docker, que pueda ser utilizada desde un contenedor, sino un snapshot de Firecracker.

4. ¿Qué sucede detrás del modelo de construcción?

  • El Dockerfile define qué instalar y cómo inicia la aplicación
  • Lambda provisiona una VM, ejecuta las instrucciones del Dockerfile y arranca tu app con CMD
  • Se captura un snapshot del estado completo de la VM (disco, memoria y procesos en ejecución)
  • Al lanzar una MicroVM, Lambda restaura ese snapshot. Tu aplicación reanuda exactamente donde quedó, sin repetir el arranque

5. Estructura de los archivos

  • Proyecto: Puedes utilizar cualquier lenguaje o framework que pueda ser ejecutado en Linux
  • Dockerfile: Las instrucciones que necesito para preparar el entorno de ejecución

6. Manos a la obra

Vamos a definir un entorno adecuado para que se puedan hacer ejercicios con un entorno aislado con la finalidad de que el usuario que ingrese pueda realizar un ejercicio de codificación personalizado sin afectar las pruebas de otros.

Nota: Desactivamos la autenticación propia de code-server (auth: none) porque el acceso a la MicroVM ya está protegido por el token JWE a nivel del endpoint. Nadie puede llegar al puerto 8080 sin un token válido.

Dockerfile

FROM codercom/code-server:latest

USER root

# Instalar Node.js (para hook server) y Python con pytest
RUN apt-get update && apt-get install -y \
    nodejs \
    python3 python3-pip \
    && rm -rf /var/lib/apt/lists/* \
    && pip3 install pytest --break-system-packages

# Instalar extensión de Python para code-server
RUN code-server --install-extension ms-python.python

# Config sin auth
RUN mkdir -p /root/.config/code-server && \
    echo "bind-addr: 0.0.0.0:8080" > /root/.config/code-server/config.yaml && \
    echo "auth: none" >> /root/.config/code-server/config.yaml && \
    echo "cert: false" >> /root/.config/code-server/config.yaml

# Copiar ejercicio al workspace
COPY ejercicio/ /home/coder/workspace/
RUN chown -R coder:coder /home/coder/workspace

COPY hook_server.js /hook_server.js
COPY start.sh /start.sh
RUN chmod +x /start.sh

EXPOSE 8080 8081

CMD ["/start.sh"]
Enter fullscreen mode Exit fullscreen mode

Ejercicio en Python

main.py

def suma(a, b):
    """TODO: Retorna la suma de a y b"""
    pass


def es_palindromo(texto):
    """TODO: Retorna True si el texto es un palíndromo"""
    pass


def fibonacci(n):
    """TODO: Retorna los primeros n números de Fibonacci"""
    pass
Enter fullscreen mode Exit fullscreen mode

tests/test_main.py

from main import suma, es_palindromo, fibonacci


def test_suma():
    assert suma(2, 3) == 5
    assert suma(-1, 1) == 0


def test_palindromo():
    assert es_palindromo("ana") == True
    assert es_palindromo("hola") == False


def test_fibonacci():
    assert fibonacci(5) == [0, 1, 1, 2, 3]
    assert fibonacci(1) == [0]
Enter fullscreen mode Exit fullscreen mode

7. ¿Cómo construir un snapshot?

  1. Creo los archivos base
    • Proyecto
    • Dockerfile
  2. Empaquetar en zip
   zip -r bootcamp-lab.zip Dockerfile start.sh hook_server.js README.md ejercicio/
Enter fullscreen mode Exit fullscreen mode
  1. Subirlo a un bucket de S3
   aws s3 cp bootcamp-lab.zip s3://mi-bucket/bootcamp-lab.zip
Enter fullscreen mode Exit fullscreen mode
  1. Creo el snapshot

Nota: Al crear el snapshot, puedes elegir un rol por defecto que Lambda genera automáticamente. Este rol incluye los permisos necesarios para leer del bucket S3 que especificaste. Para pruebas iniciales, te recomiendo usar esta opción y no complicarte con roles personalizados.

8. Vamos a correr nuestra primera Lambda MicroVM

  • Le daremos al botón "Run MicroVM"

  • Creación de token: a través de este podremos acceder a la URL de la MicroVM

  • Iniciar microVM

Con el endpoint utilizado podremos acceder desde el navegador. Toda petición requiere el header X-aws-proxy-auth con el token que generamos en el paso anterior, el cual deberás agregar al navegador. Para este caso utilicé la extensión de Chrome ModHeader.

Al ingresar al endpoint generado podré ver el ambiente aislado. De esta forma podré crear los ambientes que necesite exactamente con la misma estructura para que los usuarios puedan realizar sus pruebas sin afectar los recursos existentes ni los ambientes de otros usuarios.

9. Probar usando un IDE para base de datos

La estructura utilizada para este caso puede ser adaptada para otros escenarios que puedan llegar a utilizar un IDE, por ejemplo una MicroVM que sea utilizada para ejercicios de base de datos (CloudBeaver, PgAdmin, Workbench, etc). Es la misma estructura, utiliza un Dockerfile para configurar el ambiente , crea el snapshot y lanza la ejecución.

En mi repositorio podrás encontrar el código completo:
https://github.com/lfdeleonramirez/aws-lambda-microvms


Sobre el autor

Luis Fernando de León — AWS Community Builder 🇬🇹

📸 Instagram: instagram.com/luisenlanube
📝 DEV: dev.to/luisferdeleon
👤 Facebook: facebook.com/luisenlanube
💼 LinkedIn: linkedin.com/in/luisfdeleonramirez

Recursos
📖 Documentación oficial — AWS Lambda MicroVMs

Top comments (0)