첫 Lambda MicroVM 만들기
첫 Lambda MicroVM 만들기
이 튜토리얼은 AWS Lambda MicroVM 이미지를 만들고 그 이미지에서 MicroVM을 실행하는 과정을 안내해요. 마치면 HTTPS로 접근할 수 있는 실행 중인 애플리케이션을 갖게 됩니다.
본문
사전 조건
시작하기 전에 두 가지가 필요해요:
- 애플리케이션 아티팩트(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 예시, 수명 주기 훅, 스케일링 전략을 확인하세요.
- 통합에서 지원되는 서비스 통합을 확인하세요.