☁️ 클라우드

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은 보안이 중요한 멀티테넌트에, 컨테이너는 빠른 배포와 효율이 중요한 마이크로서비스에 적합합니다."

리뷰어: "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 인스턴스 사용 시 주의점은?

📚 더 배우기

💬 질문 & 기여

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