

# MicroVM 이미지
<a name="microvms-images"></a>

이 섹션에서는 MicroVM 이미지를 빌드, 구성, 업데이트 및 관리하는 방법을 설명합니다.

MicroVM 이미지는 MicroVM의 파일 시스템과 애플리케이션 환경을 정의하는 리소스입니다. MicroVM 이미지에는 런타임 환경, 애플리케이션 코드와 백그라운드 프로세스, 관찰성 에이전트 등의 지원 프로그램이 포함되어 있습니다. MicroVM 이미지를 생성하려면 `Dockerfile`과 애플리케이션 아티팩트가 포함된 zip 패키지를 Amazon S3에 업로드하여 제공합니다. `Dockerfile`은 애플리케이션이 패키징되는 방식을 정의합니다. Lambda는 Lambda 관리형 MicroVM 기본 이미지가 제공하는 운영 체제 환경 위에서 `Dockerfile`을 실행하여 애플리케이션 컨테이너 이미지를 빌드합니다. MicroVM 기본 이미지는 아래 [MicroVM 기본 이미지](#microvms-images-base-images) 섹션에 설명되어 있습니다.

MicroVM 기본 이미지를 업데이트하여 MicroVM의 애플리케이션 코드나 구성을 업데이트할 수 있습니다. 트리거하는 각 업데이트마다 새로운 MicroVM 이미지 버전이 생성됩니다.

## Lambda가 MicroVM 이미지를 빌드하는 방법
<a name="microvms-images-creating"></a>

MicroVM 이미지를 생성하면 Lambda는 다음을 수행합니다.
+ Amazon S3에서 패키징된 아티팩트를 검색합니다.
+ Lambda 관리형 기본 이미지에서 새 MicroVM을 시작합니다.
+ `Dockerfile`의 명령어를 실행합니다.
+ `ENTRYPOINT` 또는 `CMD` 명령어를 사용하여 애플리케이션을 시작합니다.
+ 수명 주기 후크의 초기화 완료 신호를 기다립니다.
+ 디스크 및 메모리 상태의 스냅샷을 캡처합니다.

스냅샷 프로세스가 완료되면 MicroVM 이미지가 `CREATED` 상태로 전환됩니다. 이제 이 MicroVM 이미지를 사용하여 MicroVM을 생성할 수 있으며, 각 MicroVM 이미지를 사용하여 여러 개의 독립적인 MicroVM을 생성할 수 있습니다. MicroVM 이미지에서 실행되는 MicroVM은 스냅샷이 생성된 상태에서 직접 재개되므로 시작 시간이 빠릅니다. 각 MicroVM 이미지는 계정의 허용 한도 내에서 여러 개의 MicroVM을 실행하는 데 사용할 수 있습니다.

코드를 패키징하고 첫 번째 MicroVM 이미지를 생성하는 방법에 대한 단계별 안내는 [첫 번째 MicroVM 생성](microvms-getting-started.md) 섹션을 참조하세요.

## MicroVM 크기 조정
<a name="microvms-images-sizing"></a>

Lambda MicroVM 피크 활동을 위해 각 컴퓨팅 환경의 크기를 적절하게 조정할 필요가 없는 기준 피크 모델을 사용합니다. MicroVM의 기준 컴퓨팅 리소스를 구성합니다. 피크 활동 중 MicroVM은 기준의 최대 4배까지 자동으로 수직적 스케일링을 수행할 수 있습니다. MicroVM이 실행되는 동안 기준 요금을 지불하고 기준을 초과하여 실제로 사용한 만큼만 초당 요금을 지불합니다.

MicroVM 이미지를 생성할 때 `memory` 파라미터를 통해 기준을 설정합니다. vCPU는 메모리에 비례하여 규모가 조정됩니다(2GB = 1 vCPU). 기본 기준은 2GB/1vCPU입니다.

다음 표에는 사용 가능한 크기가 나열되어 있습니다.


| 기준 | Peak | 최대 디스크 공간 | 
| --- | --- | --- | 
| 0.5GB 메모리, 0.25 vCPU | 2GB 메모리, 1 vCPU | 8GB | 
| 1GB 메모리, 0.5 vCPU | 4GB 메모리, 2 vCPU | 8GB | 
| 2GB 메모리, 1 vCPU(기본값) | 8GB 메모리, 4 vCPU | 8GB | 
| 4GB 메모리, 2 vCPU | 16GB 메모리, 8 vCPU | 16 GB | 
| 8GB 메모리, 4 vCPU | 32GB 메모리, 16 vCPU | 32GB | 

## MicroVM 기본 이미지
<a name="microvms-images-base-images"></a>

MicroVM 기본 이미지는 MicroVM 이미지의 기반 역할을 합니다. Lambda는 Amazon Linux 2023 운영 체제와 MicroVM 실행에 필요한 서비스 구성 요소를 제공하는 MicroVM을 게시합니다. MicroVM 이미지를 생성하거나 업데이트하면 Lambda는 이 기본 이미지에서 새 MicroVM을 시작하고 이 운영 체제 환경 내에서 `Dockerfile` 명령어를 실행합니다.

Lambda는 보안 패치를 적용할 때와 같이 서비스 관리형 MicroVM 기본 이미지의 새 버전을 정기적으로 릴리스하여 운영 체제 또는 서비스 구성 요소를 업데이트합니다. 기본적으로 서비스 관리형 기본 이미지의 최신 버전은 자체 MicroVM 이미지를 생성/업데이트할 때 적용됩니다. 문제 해결 또는 디버깅을 위해 `base-image-version` 파라미터를 사용하여 자체 MicroVM 이미지를 생성할 때 서비스 관리형 기반 이미지의 버전을 필요에 따라 재정의할 수 있습니다.

기본 이미지 버전은 사용 중단 수명 주기를 따릅니다.
+ **`AVAILABLE`** - 현재 버전이며, 사용을 권장합니다.
+ **`DEPRECATED`**(60일) - 더 새로운 버전이 있습니다. 여전히 빌드하고 실행할 수 있습니다.
+ **`EXPIRING`**(30일) - 새 이미지를 생성할 수 없습니다. 기존 이미지는 여전히 실행 가능합니다.
+ **`EXPIRED`** - 빌드하거나 실행할 수 없습니다. 지원되는 버전에서 이미지를 다시 빌드하세요.
+ **`RECALLED`** - 심각한 보안 문제로 인해 즉시 사용할 수 없습니다(드뭄).

최신 상태를 유지하려면 사용 중단 알림을 모니터링하고 새 기본 이미지 버전이 릴리스될 때 MicroVM 이미지를 다시 빌드합니다.

MicroVM 기본 이미지는 Dockerfile에서 지정하는 컨테이너 기본 이미지와는 별개라는 점에 유의하세요. 전자는 MicroVM의 운영 체제 환경을 정의하지만, 후자는 Lambda MicroVM과 함께 사용할 애플리케이션을 패키징할 때 사용할 기본 컨테이너 이미지를 정의합니다. 자세한 내용은 [컨테이너 기본 이미지](#microvms-images-container-base) 단원을 참조하십시오.

다음 API를 사용하여 사용 가능한 관리형 MicroVM 기본 이미지와 해당 버전을 검색합니다.

```
# 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
```

## MicroVM 이미지 빌드 후크
<a name="microvms-images-build-hooks"></a>

Lambda는 MicroVM 이미지 생성 중 애플리케이션 정확성을 확인하고 성능을 최적화할 수 있는 MicroVM 이미지 빌드 후크를 제공합니다. 후크는 Lambda가 각 MicroVM을 초기화하는 데 사용되는 스냅샷을 생성하기 전에 실행됩니다. 각 후크는 애플리케이션이 노출하고 빌드 중 Lambda가 직접적으로 호출하는 HTTP 엔드포인트입니다. 이러한 요청에 응답하여 MicroVM 이미지 빌드 프로세스를 제어하고 검증할 수 있습니다. Lambda는 HTTP 상태 코드를 사용하여 후크가 성공적으로 완료되었는지 여부를 판단합니다.

**중요**  
후크를 구성하는 경우 애플리케이션이 후크 요청을 수신할 포트를 지정해야 합니다.


| 후크 | 경로 | 세부 정보 | HTTP Status Codes | 제한 시간 | 
| --- | --- | --- | --- | --- | 
| /ready | /aws/lambda-microvms/runtime/v1/ready | 애플리케이션이 ENTRYPOINT 또는 CMD를 통해 시작된 후 MicroVM 이미지 빌드 중 직접적으로 호출됩니다. 애플리케이션 스냅샷을 생성할 준비가 되었음을 알립니다. | HTTP 503: 아직 준비되지 않았습니다. Lambda는 시간이 초과될 때까지 재시도합니다. HTTP 200: 초기화가 완료되었습니다. Lambda가 스냅샷을 생성합니다. | 1\~3,600초(readyTimeoutInSeconds) | 
| /validate | /aws/lambda-microvms/runtime/v1/validate | 빌드가 완료된 후 생성된 이미지에서 시작된 새 MicroVM에서 직접적으로 호출됩니다. 재개 시 애플리케이션이 올바르게 작동하는지 확인합니다. | HTTP 503: 검증을 완료하는 데 더 많은 시간이 필요합니다. Lambda는 시간이 초과될 때까지 재시도합니다. HTTP 200: 검증이 통과되었습니다. | 1\~3,600초(validateTimeoutInSeconds) | 

**중요**  
HTTP 503을 반환할 때는 요청을 열어둔 채로 기다리지 말고 즉시 반환하세요. 요청이 열려 있는 동안 제한 시간이 경과하면 Lambda는 빌드를 종료합니다.

**참고**  
/validate 후크를 사용하여 시작 시간을 최적화할 수도 있습니다. 이렇게 하려면 검증 중 모의 페이로드를 실행합니다. 이를 통해 Lambda는 스냅샷의 액세스된 영역을 추적하고 MicroVM 시작 중 검색을 최적화할 수 있습니다.

## MicroVM 이미지 업데이트
<a name="microvms-images-updating"></a>

`update-microvm-image` API를 직접적으로 호출하여 기존 MicroVM 이미지를 업데이트할 수 있습니다. 각 업데이트는 새로운 MicroVM 이미지 버전 빌드를 트리거합니다. 일반적으로 다음과 같은 목적으로 MicroVM 이미지를 업데이트합니다.
+ **새 애플리케이션 코드 배포** - 새 코드 아티팩트(Amazon S3에 업로드된 새로운 zip)를 지정하여 애플리케이션의 새 버전을 배포합니다.
+ **최신 MicroVM 기본 이미지로 이동** - MicroVM 기본 이미지 ARN을 변경하여 Lambda MicroVM 기본 이미지의 최신 버전으로 업그레이드합니다 자세한 정보는 [MicroVM 이미지 패치 적용](#microvms-images-patching) 및 [MicroVM 기본 이미지](#microvms-images-base-images) 섹션을 참조하세요.
+ **빌드 역할 변경** - 코드 아티팩트가 다른 Amazon S3 버킷으로 이동하거나 프라이빗 ECR 리포지토리에서 풀을 시작하는 경우와 같이 빌드 변경 중 Lambda에 필요한 권한이 변경될 때 빌드 역할 ARN을 업데이트합니다.
+ **런타임 구성 조정** - 후크, 환경 변수 또는 기능을 변경하여 MicroVM 이미지가 빌드되고 실행되는 방법을 재구성합니다.
+ **설명 업데이트** - MicroVM 이미지 설명을 변경하여 이 버전에서 변경된 내용을 기록합니다.

다음 CLI 명령은 MicroVM 이미지를 업데이트하는 방법을 보여줍니다. 코드 아티팩트만 변경할 때도 새로운 빌드를 트리거하는 모든 `update-microvm-image` 직접 호출에서는 `--base-image-arn` 및 `--build-role-arn` 파라미터가 필수입니다. 이들 파라미터를 생략하면 `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"
```

## 이미지 상태 및 빌드 상태
<a name="microvms-images-states"></a>

MicroVM 이미지를 생성하거나 업데이트할 때마다 Lambda는 코드 아티팩트와 기본 이미지에서 빌드된 새 **버전**을 생성합니다. MicroVM 이미지는 시간이 지남에 따라 여러 버전이 있을 수 있으며, 사용자는 특정 버전에서 MicroVM을 실행합니다.

세 가지 독립적인 상태가 수명 주기의 다양한 측면을 추적합니다.
+ **이미지 상태** - MicroVM 이미지 리소스의 전체 수명 주기(생성 중, 사용 준비 완료, 업데이트 중, 실패 또는 삭제 중)입니다.
+ **버전 상태** - 특정 버전의 빌드 진행 상황(보류 중, 빌드, 성공 또는 실패)입니다. 실패 세부 정보는 `stateReason` 또는 CloudWatch 로그(`/aws/lambda/microvms/<image-name>`)에서 확인할 수 있습니다.
+ **버전 활성화** - 성공적으로 빌드된 버전이 MicroVM을 실행할 수 있는지 여부입니다. Lambda는 새 버전을 `ACTIVE`로 자동 설정합니다. 버전을 삭제하지 않고 비활성화하려면 해당 버전을 `INACTIVE`로 설정합니다.


| State | 가능한 값 | 전환 제어자 | 
| --- | --- | --- | 
| 이미지 상태 | CREATING, CREATED, CREATION\_FAILED, UPDATING, UPDATED, UPDATE\_FAILED, DELETING, DELETED, DELETION\_FAILED | Lambda(자동) | 
| 버전 상태 | PENDING, IN\_PROGRESS, SUCCESSFUL, FAILED | Lambda(자동) | 
| 버전 활성화 | ACTIVE, INACTIVE | 사용자(update-microvm-image-version --state) | 

버전에서 MicroVM을 실행하려면 이미지 상태가 `CREATED` 또는 `UPDATED`이고, 버전 상태가 `SUCCESSFUL`이고, 버전이 `ACTIVE`여야 합니다.

**참고**  
이들 상태는 독립적입니다. `CREATED` 상태의 이미지는 상태가 `FAILED`인 버전을 포함할 수 있습니다.

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

## 환경 변수
<a name="microvms-images-env-vars"></a>

환경 변수는 MicroVM 이미지 빌드 시 `environmentVariables` 필드를 통해 설정되며(변수 최대 50개), 스냅샷 빌드 프로세스 중 컨테이너에 주입됩니다. 새 MicroVM을 실행할 때 동적으로 설정된 페이로드를 전달할 수 있습니다. 자세한 내용은 MicroVM 실행 관련 섹션을 참조하세요.

## MicroVM 이미지 패치 적용
<a name="microvms-images-patching"></a>

새로운 MicroVM 기본 이미지가 제공되면 `update-microvm-image` 직접 호출을 실행하여 최신 패치로 MicroVM 이미지 빌드를 트리거할 수 있습니다. 이때 `base-image-version` 인수를 생략하거나(최신 버전 사용) 인수를 최신 버전으로 지정합니다.

## 컨테이너 기본 이미지
<a name="microvms-images-container-base"></a>

Lambda MicroVM은 MicroVM 운영 체제 환경 내에서 애플리케이션을 컨테이너로 실행합니다. `Dockerfile`을 사용하여 해당 컨테이너를 정의하고, `Dockerfile`의 `FROM` 명령어는 애플리케이션의 *컨테이너 기본 이미지*를 설정합니다.

Amazon Linux 2023용 Lambda 기본 컨테이너 이미지(`public.ecr.aws/lambda/microvms:al2023-minimal`)로 시작하고 여기에 `Dockerfile` 명령어를 추가하거나, 자체 기본 컨테이너 이미지를 사용할 수 있습니다. 자체 컨테이너 이미지를 사용하는 경우 다음 요구 사항을 확인하세요.

### 요구 사항
<a name="microvms-images-container-base-requirements"></a>
+ 컨테이너 기본 이미지는 대상 CPU 아키텍처와 호환되어야 합니다.
+ 프라이빗 AWS ECR 리포지토리의 컨테이너 기본 이미지를 사용하려면 빌드 역할에 `ecr:GetAuthorizationToken` 및 `ecr:BatchGetImage` 권한이 있어야 합니다.
+ 컨테이너 기본 이미지는 Linux 운영 체제를 기반으로 해야 합니다.
+ 컨테이너 기본 이미지는 Lambda 빌드 인프라(퍼블릭 인터넷 또는 동일한 AWS 계정의 ECR 리포지토리)에서 액세스할 수 있어야 합니다.
+ 컨테이너 기본 이미지는 스냅샷과 호환되어야 합니다. 아래 지침을 참조하세요.

### 스냅샷 호환 기본 이미지
<a name="microvms-images-container-base-snapshot-compat"></a>

Lambda MicroVM 사전 초기화된 스냅샷에서 각 MicroVM을 시작하므로 기본 이미지는 스냅샷과 호환되어야 합니다. Lambda MicroVM에서 자체 기본 이미지를 사용할 때는 [호환성 고려 사항](microvms-images-snapshots.md#microvms-images-snapshots-compatibility)에 대한 섹션을 검토하는 것이 좋습니다.

### 프라이빗 ECR 이미지 사용
<a name="microvms-images-container-base-private"></a>

`Dockerfile`의 `FROM` 명령어에서 개인 ECR 컨테이너 기본 이미지를 참조합니다.

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

빌드 역할에 다음 권한을 추가합니다.

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

## 운영 체제 기능
<a name="microvms-images-os-capabilities"></a>

기본적으로 Lambda MicroVM은 표준 Linux 기능 세트로 실행됩니다. MicroVM 이미지를 생성하거나 업데이트할 때 `additionalOsCapabilities` 필드를 사용하여 승격된 Linux 기능을 부여할 수 있습니다. 지원되는 유일한 값은 `["ALL"]`입니다. 승격된 기능을 통해 파일 시스템 탑재, 네트워크 네임스페이스 생성, eBPF 프로그램 실행 등의 작업을 수행할 수 있습니다. 기능은 VM 격리 경계 내에 적용되며 호스트나 기타 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"]'
```