☁️ 클라우드

VM

Virtual Machine

가상 머신. 물리 서버 위 가상화. 컨테이너보다 무거움.

📖 상세 설명

VM(Virtual Machine, 가상 머신)은 물리적 하드웨어 위에서 하이퍼바이저를 통해 생성되는 완전한 컴퓨터 시스템입니다. 각 VM은 자체 운영체제, 커널, 시스템 라이브러리를 가지며, 물리 서버처럼 독립적으로 동작합니다.

하이퍼바이저는 Type 1(Bare-metal: VMware ESXi, Microsoft Hyper-V, KVM)과 Type 2(Hosted: VirtualBox, VMware Workstation)로 나뉩니다. 클라우드 환경에서는 Type 1이 사용되며, 하드웨어 자원을 직접 관리합니다.

VM은 완전한 하드웨어 격리를 제공하여 멀티테넌트 환경에서 강력한 보안을 보장합니다. 하지만 각 VM마다 OS를 실행하므로 컨테이너 대비 리소스 오버헤드가 크고(수 GB vs 수십 MB), 부팅 시간도 깁니다(수 분 vs 수 초).

클라우드 서비스에서는 EC2(AWS), Compute Engine(GCP), Azure VM 등으로 제공됩니다. 레거시 애플리케이션, 라이선스 제약, 완전한 OS 제어가 필요한 경우에 적합합니다.

💻 코드 예제

# Terraform: AWS EC2 인스턴스 생성
resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"  # Amazon Linux 2
  instance_type = "t3.medium"

  vpc_security_group_ids = [aws_security_group.web.id]
  subnet_id              = aws_subnet.public.id

  root_block_device {
    volume_size = 50
    volume_type = "gp3"
    encrypted   = true
  }

  user_data = <<-EOF
    #!/bin/bash
    yum update -y
    yum install -y docker
    systemctl start docker
    systemctl enable docker
  EOF

  tags = {
    Name        = "web-server"
    Environment = "production"
  }
}

# Auto Scaling Group
resource "aws_autoscaling_group" "web" {
  name                = "web-asg"
  vpc_zone_identifier = aws_subnet.private[*].id
  target_group_arns   = [aws_lb_target_group.web.arn]

  min_size         = 2
  max_size         = 10
  desired_capacity = 3

  launch_template {
    id      = aws_launch_template.web.id
    version = "$Latest"
  }

  health_check_type         = "ELB"
  health_check_grace_period = 300
}

---
# GCP: gcloud CLI로 VM 생성
gcloud compute instances create my-vm \
  --machine-type=e2-medium \
  --zone=asia-northeast3-a \
  --image-family=ubuntu-2204-lts \
  --image-project=ubuntu-os-cloud \
  --boot-disk-size=50GB \
  --boot-disk-type=pd-ssd \
  --tags=http-server,https-server

🗣️ 실무에서 이렇게 말해요

인프라: "레거시 애플리케이션은 VM으로 유지하고, 새 마이크로서비스는 컨테이너로 가겠습니다."

개발: "VM이랑 컨테이너 같이 쓰면 관리가 복잡하지 않나요?"

인프라: "Kubernetes 노드도 결국 VM 위에서 돌아요. 레거시는 점진적으로 컨테이너화하면 됩니다."

면접관: "VM과 컨테이너의 차이를 설명해주세요."

지원자: "VM은 하이퍼바이저 위에서 각각 독립된 OS를 실행하여 완전한 격리를 제공합니다. 컨테이너는 호스트 OS 커널을 공유하고 프로세스 수준 격리를 제공합니다. VM은 보안이 중요한 멀티테넌트에, 컨테이너는 빠른 배포와 효율이 중요한 마이크로서비스에 적합합니다."

이 주제로 모의면접 보기 → WIA SOOM AI 면접 · 무료로 시작

리뷰어: "EC2 인스턴스 타입을 t3.micro로 설정했는데, 프로덕션에서는 부족할 수 있어요."

작성자: "일단 t3.medium으로 올리고, CPU 크레딧 무제한 모드도 활성화하겠습니다."

⚠️ 주의사항

🔥 실제 장애 사례

AWS 2017

S3 장애로 US-EAST-1 리전 전체 다운

원인: S3 운영 중 실수로 의도보다 많은 서버가 제거됨, EC2 인스턴스 API 영향

영향: Slack, Trello, Quora 등 수천 개 서비스 4시간 다운, EC2 콘솔 접근 불가

해결: S3 서브시스템 전체 재시작, 순차적 복구

교훈: 단일 AZ/리전 의존 금지, Multi-AZ 또는 Multi-Region 아키텍처 필수

📎 상세 보기
스타트업 사례 공통

EBS 볼륨 미연결로 데이터 영구 손실

원인: EC2 인스턴스 종료 시 "Delete on Termination" 활성화, 중요 데이터가 담긴 EBS도 함께 삭제

영향: 3개월 치 업로드된 사용자 파일 영구 손실

해결: 백업에서 일부 복구, 나머지는 손실 인정

교훈: EBS 볼륨 종료 보호 설정, 정기적 스냅샷 자동화, S3 별도 백업

📝 이해도 퀴즈

Q1. VM과 컨테이너의 핵심 차이점은?

Q2. Type 1 하이퍼바이저의 특징은?

Q3. Spot/Preemptible 인스턴스 사용 시 주의점은?

📚 더 배우기

💬 질문 & 기여

이 페이지에 오류가 있거나 추가하고 싶은 내용이 있다면 알려주세요!