

# Imágenes de MicroVM
<a name="microvms-images"></a>

En esta sección se explica cómo compilar, configurar, actualizar y administrar imágenes de MicroVM.

Una imagen de MicroVM es un recurso que define el sistema de archivos y el entorno de aplicación de una MicroVM. La imagen de MicroVM incluye el entorno de tiempo de ejecución, el código de la aplicación y programas auxiliares, como procesos en segundo plano y agentes de observabilidad. Para crear una imagen de MicroVM, debe proporcionar un paquete ZIP que contenga un `Dockerfile` y los artefactos de la aplicación, y cargarlo en Amazon S3. El `Dockerfile` define cómo se empaqueta la aplicación. Lambda compila la imagen de contenedor de la aplicación al ejecutar el `Dockerfile` sobre un entorno de sistema operativo proporcionado por una imagen base de MicroVM administrada por Lambda. Las imágenes base de MicroVM se describen a continuación, en la sección titulada [Imágenes base de MicroVM](#microvms-images-base-images).

Puede actualizar las imágenes base de MicroVM para actualizar el código o la configuración de la aplicación de las MicroVM. Cada actualización que desencadena crea una nueva versión de la imagen de MicroVM.

## Cómo Lambda compila una imagen de MicroVM
<a name="microvms-images-creating"></a>

Cuando crea una imagen de MicroVM, Lambda:
+ Recupera de Amazon S3 los artefactos empaquetados.
+ Inicia una MicroVM nueva a partir de la imagen base administrada por Lambda.
+ Ejecuta las instrucciones del `Dockerfile`.
+ Lanza la aplicación mediante la instrucción `ENTRYPOINT` o `CMD`.
+ Espera a que el enlace de ciclo de vida indique que la inicialización ha finalizado.
+ Captura una instantánea del estado del disco y de la memoria.

Una vez que finaliza el proceso de creación de la instantánea, la imagen de MicroVM pasa al estado `CREATED`. Ahora puede utilizar esta imagen de MicroVM para crear una MicroVM. Cada imagen de MicroVM se puede utilizar para crear varias MicroVM independientes. Una MicroVM ejecutada a partir de la imagen de MicroVM se reanuda directamente desde el estado capturado en la instantánea, lo que permite tiempos de inicio rápidos. Cada imagen de MicroVM se puede utilizar para ejecutar varias MicroVM, hasta el límite disponible para la cuenta.

Para obtener instrucciones paso a paso sobre cómo empaquetar el código y crear la primera imagen de MicroVM, consulte [Creación de la primera MicroVM](microvms-getting-started.md).

## Dimensionamiento de las MicroVM
<a name="microvms-images-sizing"></a>

Las MicroVM de Lambda utilizan un modelo de capacidad de referencia y máxima que elimina la necesidad de ajustar el tamaño de cada entorno de computación en función de la actividad máxima. Configure los recursos de computación de referencia de la MicroVM. Durante los períodos de máxima actividad, la MicroVM puede escalar verticalmente de forma automática hasta cuatro veces la capacidad de referencia. Mientras la MicroVM está en ejecución, se cobra la tarifa de referencia y solo se paga por lo que se utilice activamente por encima de la capacidad de referencia, con facturación por segundo.

La capacidad de referencia se establece mediante el parámetro `memory` al crear la imagen de MicroVM. Las vCPU escalan proporcionalmente con la memoria (2 GB = 1 vCPU). La capacidad de referencia predeterminada es de 2 GB/1 vCPU.

En la siguiente tabla se indican los tamaños disponibles:


| Referencia | Peak | Espacio máximo en disco | 
| --- | --- | --- | 
| 0,5 GB de memoria, 0,25 vCPU | 2 GB de memoria, 1 vCPU | 8 GB | 
| 1 GB de memoria, 0,5 vCPU | 4 GB de memoria, 2 vCPU | 8 GB | 
| 2 GB de memoria, 1 vCPU (valor predeterminado) | 8 GB de memoria, 4 vCPU | 8 GB | 
| 4 GB de memoria, 2 vCPU | 16 GB de memoria, 8 vCPU | 16 GB | 
| 8 GB de memoria, 4 vCPU | 32 GB de memoria, 16 vCPU | 32 GB | 

## Imágenes base de MicroVM
<a name="microvms-images-base-images"></a>

Una imagen base de MicroVM sirve como base para las imágenes de MicroVM. Lambda publica una imagen base de MicroVM que proporciona el sistema operativo Amazon Linux 2023 y los componentes del servicio necesarios para ejecutar MicroVM. Cuando crea o actualiza una imagen de MicroVM, Lambda inicia una nueva MicroVM a partir de esta imagen base y ejecuta las instrucciones de `Dockerfile` en este entorno de sistema operativo.

Lambda publica periódicamente nuevas versiones de las imágenes base de MicroVM administradas por el servicio, por ejemplo, cuando aplica parches de seguridad para actualizar el sistema operativo o los componentes del servicio. De forma predeterminada, se aplica la versión más reciente de una imagen base administrada por el servicio al crear o actualizar imágenes de MicroVM propias. Para solucionar problemas o depurar, al crear su propia imagen de MicroVM, puede especificar de forma opcional una versión distinta de las imágenes base administradas por el servicio mediante el parámetro `base-image-version`.

Las versiones de las imágenes base siguen un ciclo de vida de desuso:
+ **`AVAILABLE`**: versión actual, recomendada para su uso.
+ **`DEPRECATED`** (60 días): existe una versión más reciente. Aún puede compilar y ejecutar.
+ **`EXPIRING`** (30 días): no se pueden crear imágenes nuevas. Las imágenes existentes aún se pueden ejecutar.
+ **`EXPIRED`**: no se puede compilar ni ejecutar. Vuelva a compilar su imagen con una versión compatible.
+ **`RECALLED`**: deja de estar disponible de inmediato debido a problemas críticos de seguridad, lo cual ocurre en raras ocasiones.

Para mantenerse al día, supervise las notificaciones de desuso y vuelva a compilar las imágenes de MicroVM cuando se publique una nueva versión de la imagen base.

Tenga en cuenta que la imagen base de MicroVM es distinta de la imagen base de contenedor que se especifica en los archivos Dockerfile. La primera define el entorno del sistema operativo de las MicroVM, mientras que la segunda define qué imagen base de contenedor se debe utilizar para empaquetar la aplicación destinada a MicroVM de Lambda. Consulte la sección en [Imágenes de base de contenedores](#microvms-images-container-base) para obtener más información.

Utilice las siguientes API para consultar las imágenes base de MicroVM administradas disponibles y sus versiones:

```
# List all managed MicroVM base images
aws lambda-microvms list-managed-microvm-images

# List the versions of a specific managed MicroVM base image
aws lambda-microvms list-managed-microvm-image-versions \
  --image-identifier arn:aws:lambda:{{us-east-1}}:aws:microvm-image:al2023-1
```

## Enlaces de compilación de imágenes de MicroVM
<a name="microvms-images-build-hooks"></a>

Lambda proporciona enlaces de compilación de imágenes de MicroVM que permiten comprobar que la aplicación funcione correctamente y optimizar el rendimiento durante la creación de la imagen de MicroVM. Los enlaces se ejecutan antes de que Lambda capture la instantánea que se utiliza para inicializar cada MicroVM. Cada enlace es un punto de conexión HTTP que la aplicación expone y al que Lambda llama durante la compilación. Al responder a estas solicitudes, puede controlar y validar el proceso de compilación de la imagen de MicroVM. Lambda utiliza códigos de estado HTTP para determinar si los enlaces se completaron correctamente.

**importante**  
Si configura algún enlace, debe especificar el puerto en el que la aplicación escucha las solicitudes de los enlaces.


| Enlace | Ruta | Details | HTTP Status Codes | Tiempo de espera | 
| --- | --- | --- | --- | --- | 
| /ready | /aws/lambda-microvms/runtime/v1/ready | Se llama durante la compilación de la imagen de MicroVM, después de que la aplicación se inicia mediante ENTRYPOINT o CMD. Indica que la aplicación está lista para que se capture una instantánea. | HTTP 503: aún no está lista; Lambda vuelve a intentarlo hasta que se agota el tiempo de espera. HTTP 200: inicialización completada; Lambda captura la instantánea. | De 1 a 3600 segundos (readyTimeoutInSeconds) | 
| /validate | /aws/lambda-microvms/runtime/v1/validate | Se llama después de que finaliza la compilación, en una nueva MicroVM que se inicia a partir de la imagen creada. Confirma que la aplicación funciona correctamente cuando se reanuda. | HTTP 503: la validación necesita más tiempo para completarse; Lambda vuelve a intentarlo hasta que se agota el tiempo de espera. HTTP 200: la validación se completó correctamente. | De 1 a 3600 segundos (validateTimeoutInSeconds) | 

**importante**  
Cuando devuelva HTTP 503, hágalo de inmediato en lugar de mantener abierta la solicitud durante la espera. Si el tiempo de espera se agota mientras una solicitud permanece abierta, Lambda finaliza la compilación.

**nota**  
También puede utilizar el enlace /validate para optimizar el tiempo de inicio. Para ello, ejecute cargas útiles simuladas durante la validación. Esto permite que Lambda realice un seguimiento de las regiones de la instantánea a las que se accede y optimice su recuperación durante el inicio de la MicroVM.

## Actualización de una imagen de MicroVM
<a name="microvms-images-updating"></a>

Puede actualizar una imagen de MicroVM existente mediante una llamada a la API `update-microvm-image`. Cada actualización desencadena la compilación de una nueva versión de la imagen de MicroVM. Por lo general, una imagen de MicroVM se actualiza para:
+ **Implementación de código nuevo de la aplicación**: hacer referencia a un nuevo artefacto de código, como un archivo ZIP nuevo cargado en Amazon S3, para publicar una nueva versión de la aplicación.
+ **Migración a una imagen base de MicroVM más reciente**: cambiar el ARN de la imagen base de MicroVM para utilizar versiones más recientes de la imagen base de MicroVM de Lambda. Para obtener más información, consulte [Aplicación de parches a imágenes de MicroVM](#microvms-images-patching) y [Imágenes base de MicroVM](#microvms-images-base-images).
+ **Cambio del rol de compilación**: actualizar el ARN del rol de compilación cuando cambien los permisos que Lambda necesita durante la compilación, por ejemplo, cuando el artefacto de código se traslade a otro bucket de Amazon S3 o cuando se empiece a extraer contenido de un repositorio privado de ECR.
+ **Ajuste de la configuración del tiempo de ejecución**: cambiar los enlaces, las variables de entorno o las capacidades para volver a configurar cómo se compila y ejecuta la imagen de MicroVM de Lambda.
+ **Actualización de la descripción**: cambiar la descripción de la imagen de MicroVM de Lambda para registrar los cambios realizados en esta versión.

El siguiente comando de la CLI muestra cómo actualizar una imagen de MicroVM de Lambda. Los parámetros `--base-image-arn` y `--build-role-arn` son obligatorios en todas las llamadas a`update-microvm-image` que desencadenan una nueva compilación, incluso cuando solo se cambia el artefacto de código. Si se omiten, se genera una `ValidationException`:

```
aws lambda-microvms update-microvm-image \
  --image-identifier {{arn:aws:lambda:us-east-1:123456789012:microvm-image:my-microvm-image}} \
  --code-artifact uri=s3://my-bucket/deployments/app-v2.zip \
  --base-image-arn arn:aws:lambda:{{us-east-1}}:aws:microvm-image:al2023-1 \
  --build-role-arn arn:aws:iam::123456789012:role/MicrovmBuildRole \
  --description "Updated with v2 application code"
```

## Estados de la imagen y estados de compilación
<a name="microvms-images-states"></a>

Cada vez que se crea o actualiza una imagen de MicroVM, Lambda genera una nueva **versión** compilada a partir del artefacto de código y la imagen base. Una imagen de MicroVM puede tener muchas versiones con el tiempo, y las MicroVM se ejecutan a partir de una versión específica.

Tres estados independientes permiten supervisar distintos aspectos del ciclo de vida:
+ **Estado de la imagen**: ciclo de vida general del recurso de imagen de MicroVM, que puede estar en proceso de creación, listo para usarse, en proceso de actualización, con errores o en proceso de eliminación.
+ **Estado de la versión**: progreso de compilación de una versión específica, que puede estar pendiente, en proceso de compilación, completada correctamente o con errores. Consulte `stateReason` o los registros de CloudWatch (`/aws/lambda/microvms/<image-name>`) para obtener información sobre los errores.
+ **Activación de la versión**: indica si una versión compilada correctamente puede ejecutar MicroVM. Lambda establece automáticamente las versiones nuevas en `ACTIVE`. Puede establecer una versión en `INACTIVE` para desactivarla sin eliminarla.


| Estado | Valores posibles | Responsable de la transición | 
| --- | --- | --- | 
| Estado de la imagen | CREATING, CREATED, CREATION\_FAILED, UPDATING, UPDATED, UPDATE\_FAILED, DELETING, DELETED, DELETION\_FAILED | Lambda (automático) | 
| Estado de la versión | PENDING, IN\_PROGRESS, SUCCESSFUL, FAILED | Lambda (automático) | 
| Activación de la versión | ACTIVE, INACTIVE | Usuario (update-microvm-image-version --state) | 

Para ejecutar una MicroVM a partir de una versión, el estado de la imagen debe ser `CREATED` o `UPDATED`, el estado de la versión debe ser `SUCCESSFUL` y la versión debe estar en `ACTIVE`.

**nota**  
Estos estados son independientes. Una imagen cuyo estado sea `CREATED` puede contener una versión cuyo estado sea `FAILED`.

```
# De-activate a version
aws lambda-microvms update-microvm-image-version \
  --image-identifier my-image \
  --image-version 1.0 \
  --state INACTIVE
```

## Variables de entorno
<a name="microvms-images-env-vars"></a>

Las variables de entorno se configuran durante la compilación de la imagen de MicroVM mediante el campo `environmentVariables` (máximo de 50 variables). Estas variables se insertan en el contenedor durante el proceso de compilación de la instantánea. Puede pasar cargas útiles configuradas dinámicamente al ejecutar una MicroVM nueva. Consulte la sección sobre la ejecución de una MicroVM para obtener más información.

## Aplicación de parches a imágenes de MicroVM
<a name="microvms-images-patching"></a>

Cuando haya disponible una nueva imagen base de MicroVM, puede realizar una llamada `update-microvm-image` para desencadenar la compilación de una imagen de MicroVM con los parches más recientes. Para ello, puede omitir el argumento `base-image-version`, con lo cual se utiliza la versión más reciente, o especificar el argumento con dicha versión.

## Imágenes de base de contenedores
<a name="microvms-images-container-base"></a>

Las MicroVM de Lambda ejecutan la aplicación como un contenedor dentro del entorno del sistema operativo de la MicroVM. El contenedor se define mediante `Dockerfile`, y la instrucción `FROM` del `Dockerfile` establece la *imagen base de contenedor* de la aplicación.

Puede comenzar con la imagen base de contenedor de Lambda para Amazon Linux 2023 (`public.ecr.aws/lambda/microvms:al2023-minimal`) y agregar las instrucciones `Dockerfile` correspondientes, o bien utilizar una imagen base de contenedor propia. Cuando utilice imágenes de contenedor propias, compruebe que se cumplan los siguientes requisitos:

### Requisitos
<a name="microvms-images-container-base-requirements"></a>
+ La imagen base de contenedor debe ser compatible con la arquitectura de CPU de destino.
+ Las imágenes base de contenedor de repositorios privados de AWS ECR requieren que el rol de compilación tenga los permisos `ecr:GetAuthorizationToken` y `ecr:BatchGetImage`.
+ La imagen base de contenedor se debe basar en un sistema operativo Linux.
+ Las imágenes base de contenedor deben ser accesibles desde la infraestructura de compilación de Lambda, ya sea a través de Internet público o de un repositorio de ECR de la misma cuenta de AWS.
+ Las imágenes base de contenedor deben ser compatibles con instantáneas. Consulte las instrucciones que aparecen a continuación.

### Imágenes base compatibles con instantáneas
<a name="microvms-images-container-base-snapshot-compat"></a>

Dado que las MicroVM de Lambda inician cada MicroVM a partir de una instantánea preinicializada, las imágenes base deben ser compatibles con instantáneas. Se recomienda consultar la sección sobre [Consideraciones sobre compatibilidad](microvms-images-snapshots.md#microvms-images-snapshots-compatibility) cuando se utilicen imágenes base propias con las MicroVM de Lambda.

### Uso de una imagen privada de ECR
<a name="microvms-images-container-base-private"></a>

Incluya una referencia a la imagen base de contenedor privada de ECR en la instrucción `FROM` del `Dockerfile`:

```
FROM 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-base:latest
WORKDIR /app
COPY . .
CMD ["./my-app"]
```

Agregue los siguientes permisos al rol de compilación:

```
{
  "Effect": "Allow",
  "Action": [
    "ecr:GetAuthorizationToken",
    "ecr:BatchCheckLayerAvailability",
    "ecr:GetDownloadUrlForLayer",
    "ecr:BatchGetImage"
  ],
  "Resource": "*"
}
```

## Capacidades del sistema operativo
<a name="microvms-images-os-capabilities"></a>

De forma predeterminada, las MicroVM de Lambda se ejecutan con un conjunto estándar de capacidades de Linux. Puede conceder capacidades de Linux elevadas mediante el campo `additionalOsCapabilities` al crear o actualizar una imagen de MicroVM. El único valor admitido es `["ALL"]`. Las capacidades elevadas permiten realizar operaciones como montar sistemas de archivos, crear espacios de nombres de red o ejecutar programas eBPF. Las capacidades se aplican dentro del límite de aislamiento de la máquina virtual y no afectan al host ni a otras MicroVM.

```
aws lambda-microvms create-microvm-image \
  --name my-network-tool \
  --code-artifact uri=s3://my-bucket/app.zip \
  --base-image-arn arn:aws:lambda:{{us-east-1}}:aws:microvm-image:al2023-1 \
  --build-role-arn arn:aws:iam::123456789012:role/BuildRole \
  --additional-os-capabilities '["ALL"]'
```