첫 Lambda MicroVM 만들기

첫 Lambda MicroVM 만들기

이 튜토리얼은 AWS Lambda MicroVM 이미지를 만들고 그 이미지에서 MicroVM을 실행하는 과정을 안내해요. 마치면 HTTPS로 접근할 수 있는 실행 중인 애플리케이션을 갖게 됩니다.

출처: AWS Lambda 개발자 안내서

본문

사전 조건

시작하기 전에 두 가지가 필요해요:

  • 애플리케이션 아티팩트(2단계에서 만들 zip 파일)를 저장할 선호하는 AWS 리전의 Amazon S3 버킷
  • 이미지 생성 중에 Lambda가 수임(assume)할 IAM 빌드 역할. Lambda는 이 역할을 사용해 Amazon S3에서 코드 아티팩트를 다운로드하고 빌드 로그를 CloudWatch에 씁니다.

다음 신뢰 정책(trust policy)으로 IAM 역할을 만드세요. 이렇게 하면 Lambda 서비스가 역할을 수임할 수 있어요:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": { "Service": "lambda.amazonaws.com" },
    "Action": ["sts:AssumeRole", "sts:TagSession"]
  }]
}

역할에 다음 권한 정책을 연결하세요. <your-bucket-name>을 Amazon S3 버킷 이름으로 교체합니다:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::<your-bucket-name>/*"
    },
    {
      "Effect": "Allow",
      "Action": ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}

참고

Dockerfile이 프라이빗 AWS ECR 저장소에서 가져온다면 권한 정책에 ecr:GetAuthorizationToken과 ecr:BatchGetImage도 추가하세요.

첫 MicroVM 이미지 만들기

MicroVM 이미지는 완전히 초기화된 상태로 애플리케이션을 캡처합니다. 이 이미지에서 MicroVM을 실행하면 애플리케이션이 즉시 시작됩니다 — 부팅이나 초기화 지연이 없어요.

1단계: 애플리케이션과 Dockerfile 작성하기

MicroVM 안에서 실행되는 간단한 HTTP 서버를 만드세요. 이 예시는 외부 의존성이 없는 Node.js를 사용합니다:

app.js

// Minimal HTTP server — listens on port 8080
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({ status: 'ok', path: req.url }));
});

server.listen(8080, () => {
  console.log('Listening on port 8080');
});

다음으로 애플리케이션을 패키징하고 시작하는 Dockerfile을 만드세요:

Dockerfile

# Use a lightweight Node.js runtime for your application layers
FROM node:24-alpine

# Set the working directory inside the container
WORKDIR /app

# Copy your application code
COPY app.js .

# Declare the port your app listens on
EXPOSE 8080

# Start the application — Lambda snapshots the running state
CMD ["node", "app.js"]

참고

FROM 명령은 애플리케이션 레이어의 컨테이너 이미지를 설정합니다. 호환되는 어떤 컨테이너 이미지든 사용할 수 있어요. MicroVM 운영 체제와 서비스 구성 요소를 제공하는 Lambda 관리형 베이스 이미지는 3단계에서 --base-image-arn으로 별도로 지정합니다.

애플리케이션이 고유한 값(ID, 시크릿, 암호화 자재)을 생성한다면, 언어의 표준 암호학적으로 안전한 의사 난수 생성기(CSPRNG) 라이브러리를 사용해 MicroVM 간 고유성을 보장하세요. 애플리케이션이 OpenSSL을 사용한다면 스냅샷 호환 버전이 포함된 Lambda 베이스 컨테이너 이미지를 사용하세요. 자세한 내용은 MicroVM 이미지의 스냅샷 호환성 섹션을 참고하세요.

2단계: 패키징하고 Amazon S3에 업로드하기

app.js와 Dockerfile을 zip 아카이브로 패키징한 다음 Amazon S3 버킷에 업로드하세요. 터미널에서 다음 명령을 실행합니다:

zip app.zip app.js Dockerfile
aws s3 cp app.zip s3://your-bucket-name/app.zip

3단계: MicroVM 이미지 만들기

create-microvm-image를 호출해 빌드를 시작합니다. Lambda는 Amazon S3에서 zip을 다운로드하고 Dockerfile을 실행하며 애플리케이션을 시작한 뒤, 완전히 초기화된 상태의 Firecracker 스냅샷을 캡처합니다:

aws lambda-microvms create-microvm-image \
  --name my-first-microvm-image \
  --code-artifact uri=s3://your-bucket-name/app.zip \
  --base-image-arn arn:aws:lambda:us-east-1:aws:microvm-image:al2023-1 \
  --build-role-arn arn:aws:iam::123456789012:role/MicrovmBuildRole

이미지는 CREATING 상태로 시작합니다. 빌드 상태를 다음으로 확인하세요:

aws lambda-microvms get-microvm-image \
  --image-identifier my-first-microvm-image

빌드가 완료되면 state 필드가 CREATED로 바뀝니다:

{
  "imageName": "my-first-microvm-image",
  "imageArn": "arn:aws:lambda:us-east-1:123456789012:microvm-image:my-first-microvm-image",
  "state": "CREATED",
  "imageVersion": "1.0",
  ...
}

상태가 CREATE_FAILED라면 CloudWatch의 /aws/lambda-microvms/my-first-microvm-image에서 빌드 로그를 확인하세요.

첫 MicroVM 실행하기

MicroVM 이미지가 CREATED 상태에 도달하면 그 이미지에서 MicroVM을 실행할 수 있어요. 각 이미지는 많은 MicroVM을 실행할 수 있습니다 — 테넌트, 사용자 세션, 또는 작업마다 하나씩이에요.

다음 명령으로 MicroVM을 실행합니다:

aws lambda-microvms run-microvm \
  --image-identifier my-first-microvm-image \
  --ingress-network-connectors "arn:aws:lambda:us-east-1:aws:network-connector:aws-network-connector:ALL_INGRESS" \
  --egress-network-connectors "arn:aws:lambda:us-east-1:aws:network-connector:aws-network-connector:INTERNET_EGRESS" \
  --idle-policy '{"autoResumeEnabled":true,"maxIdleDurationSeconds":900,"suspendedDurationSeconds":300}'

파라미터 설명:

  • --ingress-network-connectors — 모든 포트에서 MicroVM으로 들어오는 인바운드 HTTPS 트래픽을 활성화합니다. Lambda 관리형 커넥터입니다.
  • --egress-network-connectors — MicroVM에서 나가는 아웃바운드 인터넷 접근을 활성화합니다. Lambda 관리형 커넥터입니다.
  • --idle-policy — 자동 일시 중지-재개 동작을 구성합니다. 이 정책은 15분 동안 비활성 상태이면 MicroVM을 일시 중지하고, 최대 5분 동안 일시 중지 상태를 유지하며, 트래픽이 도착하면 자동으로 재개합니다.

응답에는 MicroVM ID와 엔드포인트 URL이 포함됩니다:

{
  "microvmId": "mvm-01234567-abcd-ef01-2345-6789abcdef01",
  "state": "PENDING",
  "endpoint": "mvm-01234567-abcd-ef01-2345-6789abcdef01.lambda-microvm.us-east-1.on.aws",
  ...
}

상태가 RUNNING에 도달할 때까지 기다리세요:

aws lambda-microvms get-microvm \
  --microvm-identifier mvm-01234567-abcd-ef01-2345-6789abcdef01

MicroVM에 연결하기

MicroVM 엔드포인트에 대한 모든 요청에는 인증 토큰이 필요합니다. 다음으로 생성하세요:

aws lambda-microvms create-microvm-auth-token \
  --microvm-identifier mvm-01234567-abcd-ef01-2345-6789abcdef01 \
  --expiration-in-minutes 30 \
  --allowed-ports '[{"allPorts":{}}]'

응답에는 authToken 필드에 토큰이 포함됩니다. 이를 사용해 실행 중인 애플리케이션에 요청을 보내세요:

curl https://mvm-01234567-abcd-ef01-2345-6789abcdef01.lambda-microvm.us-east-1.on.aws/ \
  -H "X-aws-proxy-auth: <token-value>"

애플리케이션의 응답이 보일 거예요:

{"status":"ok","path":"/"}

MicroVM이 실행 중이며 트래픽을 처리하고 있습니다. 1단계에서 작성한 애플리케이션이 엔드포인트 URL에서 실행 중입니다.

정리하기

지속적인 요금을 피하려면 사용이 끝나면 MicroVM을 종료하세요:

aws lambda-microvms terminate-microvm \
  --microvm-identifier mvm-01234567-abcd-ef01-2345-6789abcdef01

다음 단계

  • 핵심 개념을 배워 스냅샷 프로세스, 수명 주기 상태, 베이스 이미지를 이해하세요.
  • MicroVM 이미지를 살펴봐 이미지 빌드 훅, 버전 관리, 스냅샷 호환성을 배우세요.
  • MicroVM 실행에서 SDK 예시, 수명 주기 훅, 스케일링 전략을 확인하세요.
  • 통합에서 지원되는 서비스 통합을 확인하세요.

더 알아보기 (Learn more)