Instance
인스턴스
클라우드 가상 서버. EC2 인스턴스, Compute Engine 인스턴스.
인스턴스
클라우드 가상 서버. EC2 인스턴스, Compute Engine 인스턴스.
Instance(인스턴스)는 클라우드 환경에서 실행되는 가상 서버입니다. AWS에서는 EC2 인스턴스, GCP에서는 Compute Engine 인스턴스, Azure에서는 Virtual Machine이라고 부릅니다. 물리 서버의 자원을 가상화하여 필요한 만큼의 CPU, 메모리, 스토리지를 할당받아 사용합니다.
인스턴스 타입은 워크로드 특성에 따라 다양합니다. 범용(General Purpose)은 균형 잡힌 컴퓨팅으로 웹서버에 적합하고, 컴퓨팅 최적화(Compute Optimized)는 높은 CPU 성능이 필요한 배치 처리에 사용됩니다. 메모리 최적화(Memory Optimized)는 인메모리 데이터베이스, GPU 인스턴스는 AI/ML 학습에 적합합니다.
요금 모델도 중요합니다. 온디맨드는 사용한 만큼만 지불하며 유연성이 높습니다. 예약 인스턴스(Reserved)는 1-3년 약정으로 최대 72% 할인을 받을 수 있습니다. 스팟 인스턴스는 여유 용량을 최대 90% 할인된 가격에 사용하지만, 언제든 회수될 수 있습니다. Savings Plans는 시간당 일정 사용량을 약정하여 할인을 받는 유연한 모델입니다.
실제 운영에서는 Auto Scaling과 함께 사용하여 트래픽에 따라 인스턴스 수를 자동 조절합니다. 또한 인스턴스 메타데이터 서비스(IMDS)를 통해 실행 중인 인스턴스의 정보를 조회할 수 있으며, 이를 활용해 자동화 스크립트를 구성합니다.
# EC2 인스턴스 생성 - 웹 서버용 t3.medium
aws ec2 run-instances \
--image-id ami-0c55b159cbfafe1f0 \
--instance-type t3.medium \
--key-name my-key-pair \
--security-group-ids sg-0123456789abcdef0 \
--subnet-id subnet-0123456789abcdef0 \
--iam-instance-profile Name=WebServerRole \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=web-server-01},{Key=Environment,Value=production}]' \
--user-data file://setup-web.sh \
--count 1
# 인스턴스 상태 확인
aws ec2 describe-instances \
--instance-ids i-0123456789abcdef0 \
--query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name,Type:InstanceType,IP:PublicIpAddress}'
# 스팟 인스턴스 요청 (최대 90% 비용 절감)
aws ec2 request-spot-instances \
--instance-count 2 \
--type "one-time" \
--launch-specification '{
"ImageId": "ami-0c55b159cbfafe1f0",
"InstanceType": "c5.xlarge",
"KeyName": "my-key-pair",
"SecurityGroupIds": ["sg-0123456789abcdef0"]
}' \
--spot-price "0.05"
# 인스턴스 타입 변경 (먼저 중지 필요)
aws ec2 stop-instances --instance-ids i-0123456789abcdef0
aws ec2 modify-instance-attribute \
--instance-id i-0123456789abcdef0 \
--instance-type "{\"Value\": \"t3.large\"}"
aws ec2 start-instances --instance-ids i-0123456789abcdef0
# Compute Engine 인스턴스 생성
gcloud compute instances create web-server-01 \
--project=my-project \
--zone=asia-northeast3-a \
--machine-type=e2-medium \
--network-interface=network-tier=PREMIUM,subnet=default \
--maintenance-policy=MIGRATE \
--service-account=123456789-compute@developer.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--tags=http-server,https-server \
--create-disk=auto-delete=yes,boot=yes,device-name=web-server-01,image=projects/debian-cloud/global/images/debian-11-bullseye-v20240213,mode=rw,size=50,type=projects/my-project/zones/asia-northeast3-a/diskTypes/pd-balanced \
--labels=env=production,team=backend \
--metadata-from-file=startup-script=setup-web.sh
# 프리엠터블 인스턴스 (최대 80% 할인, 24시간 제한)
gcloud compute instances create batch-worker \
--zone=asia-northeast3-a \
--machine-type=n2-standard-4 \
--preemptible \
--no-restart-on-failure \
--maintenance-policy=TERMINATE
# 인스턴스 목록 및 상태 확인
gcloud compute instances list \
--filter="zone:asia-northeast3-a" \
--format="table(name,zone,machineType,status,networkInterfaces[0].accessConfigs[0].natIP)"
# 머신 타입 변경
gcloud compute instances stop web-server-01 --zone=asia-northeast3-a
gcloud compute instances set-machine-type web-server-01 \
--zone=asia-northeast3-a \
--machine-type=e2-standard-4
gcloud compute instances start web-server-01 --zone=asia-northeast3-a
# 스냅샷 생성 (백업)
gcloud compute disks snapshot web-server-01 \
--zone=asia-northeast3-a \
--snapshot-names=web-server-backup-$(date +%Y%m%d)
# AWS EC2 인스턴스 + Auto Scaling 구성
# variables.tf
variable "environment" {
default = "production"
}
variable "instance_type" {
default = "t3.medium"
}
# main.tf - Launch Template
resource "aws_launch_template" "web" {
name_prefix = "web-server-"
image_id = data.aws_ami.amazon_linux.id
instance_type = var.instance_type
iam_instance_profile {
name = aws_iam_instance_profile.web.name
}
network_interfaces {
associate_public_ip_address = true
security_groups = [aws_security_group.web.id]
}
monitoring {
enabled = true
}
user_data = base64encode(templatefile("${path.module}/user-data.sh", {
environment = var.environment
}))
tag_specifications {
resource_type = "instance"
tags = {
Name = "web-server"
Environment = var.environment
}
}
# 스팟 인스턴스 옵션 (비용 최적화)
instance_market_options {
market_type = "spot"
spot_options {
max_price = "0.05"
spot_instance_type = "one-time"
instance_interruption_behavior = "terminate"
}
}
}
# Auto Scaling Group
resource "aws_autoscaling_group" "web" {
name = "web-asg"
vpc_zone_identifier = data.aws_subnets.private.ids
target_group_arns = [aws_lb_target_group.web.arn]
health_check_type = "ELB"
min_size = 2
max_size = 10
desired_capacity = 3
mixed_instances_policy {
launch_template {
launch_template_specification {
launch_template_id = aws_launch_template.web.id
version = "$Latest"
}
# 온디맨드 + 스팟 혼합 (비용 70% 절감)
override {
instance_type = "t3.medium"
weighted_capacity = "1"
}
override {
instance_type = "t3.large"
weighted_capacity = "2"
}
}
instances_distribution {
on_demand_base_capacity = 1
on_demand_percentage_above_base_capacity = 25
spot_allocation_strategy = "capacity-optimized"
}
}
instance_refresh {
strategy = "Rolling"
preferences {
min_healthy_percentage = 75
}
}
}
팀장: "이번 달 EC2 비용이 예산 대비 40% 초과됐어요. 어떻게 줄일 수 있을까요?"
DevOps: "현재 모든 인스턴스가 온디맨드로 운영 중인데요, 분석 결과 70%가 안정적으로 24/7 가동되고 있습니다. 이 부분을 Savings Plans로 전환하면 30% 절감 가능하고, 배치 처리 워크로드는 스팟 인스턴스로 전환하면 추가 20% 절감됩니다. ASG mixed instance policy로 온디맨드:스팟을 25:75 비율로 구성하면 가용성 유지하면서도 비용을 크게 줄일 수 있습니다."
면접관: "EC2 인스턴스 타입을 선택할 때 어떤 기준으로 결정하시나요?"
지원자: "워크로드 특성을 먼저 분석합니다. 웹 서버처럼 균형 잡힌 리소스가 필요하면 M 시리즈 범용 인스턴스를, 배치 처리나 영상 인코딩은 C 시리즈 컴퓨팅 최적화를 선택합니다. ML 추론은 G 시리즈 GPU 인스턴스, Redis 같은 인메모리 DB는 R 시리즈 메모리 최적화를 사용합니다. 실제로는 CloudWatch 메트릭으로 CPU/메모리 사용률을 모니터링한 후, Right Sizing 권장사항을 참고해 인스턴스 타입을 조정합니다."
개발자: "스팟 인스턴스가 갑자기 종료됐는데 작업 중이던 데이터가 사라졌어요."
SRE: "스팟은 2분 전 종료 알림을 받을 수 있어요. EC2 메타데이터 서비스에서 instance-action을 폴링하거나 EventBridge 규칙으로 SNS 알림을 받도록 설정하세요. 그리고 작업 상태는 S3나 DynamoDB에 체크포인트로 저장하고, 새 인스턴스가 시작되면 이어서 처리하는 패턴을 적용해야 합니다. SQS 가시성 타임아웃도 작업 시간보다 여유 있게 설정하세요."
인스턴스 스토어(ephemeral storage)는 인스턴스 중지/종료 시 데이터가 삭제됩니다. 로그나 업로드 파일을 여기 저장하면 인스턴스 장애 시 복구 불가능합니다. EBS 볼륨이나 S3를 사용하세요.
IMDSv1은 SSRF 공격에 취약합니다. 반드시 IMDSv2만 허용하고(HttpTokens=required), 홉 제한을 1로 설정하세요. 컨테이너 환경에서는 iptables로 169.254.169.254 접근을 차단하는 것도 고려하세요.
인스턴스에 직접 AWS 액세스 키를 저장하지 마세요. 대신 IAM 역할을 인스턴스 프로필에 연결하면 자동으로 임시 자격 증명이 발급됩니다. SDK가 자동으로 메타데이터에서 자격 증명을 가져와 사용합니다.