Amazon Web Services 한국 블로그

AWS Lambda에서 MicroVM 도입: 전체 수명 주기 제어 기능을 갖춘 격리된 샌드박스 실행

오늘 AWS Lambda 내 새로운 서버리스 컴퓨팅 프리미티브인 AWS Lambda MicroVM을 발표했습니다. 이를 통해 사용자나 AI가 생성한 코드를 격리된 상태 저장 실행 환경에서 실행할 수 있습니다. 인프라를 관리하거나 복잡한 가상화 기술에 대한 전문 지식을 쌓지 않고도 가상 시스템 수준의 격리, 거의 즉각적인 시작 및 재개, 환경 수명주기 및 상태에 대한 직접 제어가 가능해집니다. Lambda MicroVM은 동일한 경량 가상화 기술인 Firecracker에 기반하며, 월간 15조 건이 넘는 Lambda 함수 간접 호출을 지원합니다.

고객에게 이 기능이 필요한 이유
지난 몇 년 동안 애플리케이션 개발자가 작성하지 않은 코드를 안전하게 실행할 수 있는 전용 실행 환경을 각 최종 사용자에게 전달해야 하는 새로운 종류의 멀티 테넌트 애플리케이션이 등장했습니다. AI 코딩 어시스턴트, 대화형 코드 환경, 데이터 분석 플랫폼, 취약성 스캐너, 사용자 제공 스크립트를 실행하는 게임 서버 등이 모두 이 패턴에 적합합니다. 오늘날 이러한 역량을 구축하려면 쉽지 않은 선택을 해야 합니다. 가상 시스템은 강력한 격리 기능을 제공하지만 시작하려면 몇 분 정도 걸립니다. 컨테이너는 몇 초 만에 시작되지만 공유 커널 아키텍처에는 신뢰할 수 없는 코드를 안전하게 포함하기 위해 상당한 사용자 지정 하드닝 작업이 필요합니다. 서비스형 기능은 이벤트 중심의 요청과 응답 워크로드에 최적화되어 있지만 사용자 상호 작용 전반에서 환경 상태를 유지해야 하는 장기 실행 대화형 세션에는 적합하지 않습니다. 따라서 개발자는 성능과 격리 사이에서 절충안을 수용하거나, 최종 사용자에게 지연 시간이 짧은 환경을 제공하면서 격리된 실행을 달성하기 위해 사용자 지정 가상화 인프라를 빌드 및 운영하는 데 상당한 엔지니어링 리소스를 투자해야 합니다. 이를 위해서는 심층적인 전문 지식이 필요하고 실제로 빌드하려는 제품에 소요되는 엔지니어링 시간을 단축하려는 노력이 필요합니다.

Lambda MicroVM은 정확히 이러한 간극을 염두에 두고 특별히 제작되었습니다. 각 MicroVM은 단일 최종 사용자 또는 세션에 격리된 자체 환경을 제공합니다. 이 환경은 빠르게 시작되고 세션 기간에 메모리 및 디스크 상태를 유지하며 사용자가 자리를 비울 때 일시 중지되며 이때 낮은 유휴 비용이 적용됩니다. 또한 동일한 Firecracker 기술이 이미 AWS Lambda 함수를 지원하고 있기 때문에 이 스택을 대규모로 실행하는 서비스의 운영 성숙도를 상속할 수 있습니다.

직접 사용해 보기
시작하기 위해 AWS Lambda 콘솔로 이동합니다. 이제 왼쪽 탐색 메뉴에 Lambda MicroVM이 표시됩니다. 먼저 MicroVM 이미지를 생성해야 합니다.

Flask 웹 앱과 해당 Dockerfile을 zip 파일로 압축하여 Amazon Simple Storage Service(Amazon S3) 버킷에 업로드합니다.

My Flask API – app.py

import logging

from flask import Flask, jsonify

app = Flask(__name__)
logging.basicConfig(level=logging.INFO)


@app.route("/")
def hello():
    app.logger.info("Received request to hello world endpoint")
    return jsonify(message="Hello, World!")


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

My Dockerfile


FROM public.ecr.aws/lambda/microvms:al2023-minimal
RUN dnf install -y python3 python3-pip && dnf clean all

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

EXPOSE 5000

CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

다음 명령을 사용하여 MicroVM 이미지를 생성합니다.

aws lambda-microvms create-microvm-image \
--code-artifact uri=<path/to/s3/artifact.zip> --name <VM_image_name> \
--base-image-arn arn:aws:lambda:us-east-1:aws:microvm-image:al2023-1 \
--build-role-arn <IAM role ARN>

위 이미지와 같이 AWS Console에서 MicroVM 이미지를 생성할 수도 있습니다. 명령을 실행한 후 Lambda는 zip을 검색하고 Dockerfile을 실행하며 애플리케이션을 초기화하고 실행 중인 디스크 및 메모리 상태에 대한 Firecracker 스냅샷을 생성합니다. 빌드 로그는 Amazon CloudWatch(/aws/lambda/microvms/<image-name> 아래)에 실시간으로 스트리밍되고, 이미지가 준비되면 해당 콘솔에 Amazon 리소스 이름(ARN) 및 버전 번호와 함께 표시됩니다.

aws lambda-microvms run-microvm \
--image-identifier arn:aws:lambda:<region>:<acct>:microvm-image:my-image \
--execution-role-arn arn:aws:iam::<acct>:role/MicroVMExecutionRole \
--idle-policy '{"maxIdleDurationSeconds":900,"suspendedDurationSeconds":300,"autoResumeEnabled":true}'

AWS Console 또는 CLI를 통해서도 시작할 수 있습니다. 15분 동안 비활동 상태이면 자동 일시 중단되고 다음 요청이 수신되면 시 자동으로 재개되도록 구성된 유휴 정책과 이미지 ARN을 전달합니다. 네트워킹 설정은 필요하지 않습니다. Lambda는 MicroVM에 고유 ID를 할당하고, 전용 엔드포인트 URL을 반환하며, 스냅샷에서 재개되었으므로 Flask 앱이 이미 실행 중인 상태에서 새 MicroVM을 시작합니다. 시작이 완료된 시점에 Flask 앱은 이미 실행 중 상태입니다. 한 번의 API 직접 호출로 컴퓨팅 환경을 완전히 초기화하고 부트스트래핑할 수 있습니다.

트래픽을 전송하기 위해 CLI를 사용하여 수명이 짧은 인증 토큰을 생성하고 X-aws-proxy-auth 헤더를 사용하여 일반 HTTPS 요청에 연결합니다. 요청은 Flask 앱에 즉시 도달합니다. 그리고 일시 중지 임계치를 초과하여 MicroVM을 유휴 상태로 설정합니다. 그러면 MicroVM은 일시 중단되고 메모리 및 디스크 상태가 스냅샷되어 저장됩니다. 그런 다음, 다른 요청을 보냅니다. 그러면 애플리케이션 상태는 완전히 그대로 유지된 상태로 재개됩니다. 클라이언트 측에서는 일시 중지가 발생하지 않습니다.

작동 방식
Lambda MicroVM은 지금까지 단일 AWS 컴퓨팅 서비스가 함께 제공하지 않았던 세 가지 기능을 전달합니다. 첫 번째는 Firecracker에서 제공하는 가상 시스템 수준 격리 기능입니다. 각 세션은 공유 커널 및 사용자 간 공유 리소스 없이도 자체 전용 MicroVM에서 실행되므로 한 사용자가 제공한 신뢰할 수 없는 코드가 다른 환경이나 기본 시스템에 액세스하지 않고 자체 실행 환경으로 격리됩니다. 두 번째는 빠른 시작과 재개 기능입니다. 모델은 이미지 생성 후 실행 방식에 기반합니다. 사용자가 Amazon S3에서 zip 아티팩트로 압축된 Dockerfile 및 코드를 제공하여 MicroVM 이미지를 생성하면, Lambda에서 Dockerfile을 실행하고 애플리케이션을 초기화하며 실행 환경의 메모리 및 디스크 상태에 대한 Firecracker 스냅샷을 생성합니다. 해당 이미지에서 실행되는 모든 후속 MicroVM은 콜드 부팅이 아닌 사전 초기화된 스냅샷에서 재개됩니다. 즉, 시작 및 유휴 재개 모두에서 시작 지연 시간은 매우 짧아 거의 즉각적으로 시작됩니다. 기가바이트 단위의 대화형 세션도 최종 사용자의 반응성을 느낄 수 있을 만큼 빠르게 온라인 상태로 돌아옵니다. 세 번째는 상태 저장 실행 기능입니다. 실행 중인 MicroVM은 전체 사용자 세션에서 메모리, 디스크 및 실행 중인 프로세스를 유지합니다. 유휴 기간에 메모리 및 디스크 상태를 그대로 유지하면서MicroVM을 일시 중단하고 트래픽이 도착하면 재개할 수 있습니다. 사용자가 세션을 재개하면 설치된 패키지, 로드된 모델 및 작업 중인 파일 세트를 즉시 사용할 수 있습니다. MicroVM은 최대 총 8시간의 런타임을 지원하며 구성 가능한 유휴 기간이 경과하면 자동으로 일시 중단될 수 있습니다. 따라서 몇 분 만에 완료되는 소프트웨어 취약성 스캔, 몇 시간 동안 실행되는 데이터 분석 애플리케이션, 유휴 기간이 더 긴 대화형 코딩 세션 등 다양한 제품을 간단하게 빌드할 수 있습니다. Lambda MicroVM은 사전 초기화된 스냅샷에서 시작되므로 고유 콘텐츠를 생성하거나 네트워크 연결을 설정하거나 초기화 중에 임시 데이터를 로드하는 애플리케이션의 경우 호환성을 위해 서비스 제공 후크와 통합해야 할 수도 있습니다.

Lambda MicroVM은 AWS Lambda,의 새로운 리소스로, 고유한 API 영역을 지원합니다. Lambda 함수는 여전히 이벤트 중심의 요청 및 응답 워크로드에 적합한 선택지이며, Lambda MicroVM은 사용자나 AI가 생성한 코드를 실행하기 위해 각 최종 사용자 또는 세션에 자체 격리된 환경을 전달해야 하는 멀티 테넌트 애플리케이션을 위해 특별히 빌드되었습니다. 이 두 제품은 서로를 보완합니다. 이벤트 중심 백본에 Lambda 함수를 사용하는 애플리케이션은 신뢰할 수 없는 코드를 격리된 상태로 실행해야 하는 단계를 위해 Lambda MicroVM으로 직접 호출할 수 있습니다. 애플리케이션을 가져오면 서비스가 실행 환경을 제공합니다.

정식 출시
AWS Lambda MicroVM은 현재 미국 동부(버지니아 북부), 미국 서부(오리건), 유럽(아일랜드), 아시아 태평양(도쿄) 리전에서 사용 가능하며, MicroVM당 최대 16개 vCPU, 32GB 메모리, 32GB 디스크를 사용하는 ARM64 아키텍처에서 지원됩니다. 유휴 상태의 MicroVM은 API 직접 호출을 통해 명시적으로 일시 중단되거나 수명 주기 정책을 통해 자동으로 일시 중단될 수 있습니다. 이를 통해 운영 비용을 절감하는 동시에 빠른 재개를 위해 전체 상태를 보존할 수 있습니다. 요금 세부 정보는 AWS Lambda 요금 페이지에서 확인할 수 있습니다.

시작하려면 AWS Lambda 콘솔을 방문하거나 Lambda MicroVMS 제품 페이지에서 자세히 알아보세요. 관련 설명서는 Lambda MicroVMS 개발자 안내서를 참조하세요.