학습 목표

상황

사내 예약 서비스가 다음과 같이 구성되어 있습니다.

해당 가용 영역에 문제가 생기자 다음 순서로 장애가 확산됐습니다.

  1. 인스턴스 4대가 동시에 응답하지 않게 되고, 로드 밸런서의 상태 확인이 전부 실패했습니다.
  2. Auto Scaling 그룹이 교체 인스턴스를 시작하려 했지만, 지정된 서브넷이 그 가용 영역에만 있어 시작이 실패했습니다.
  3. 로드 밸런서 자체도 그 가용 영역에만 등록되어 있어 요청을 받을 곳이 없었습니다.
  4. 데이터베이스도 같은 가용 영역이라 접속이 끊겼습니다.
  5. NAT 게이트웨이가 그 가용 영역에 있어, 다른 가용 영역에 무언가 띄웠더라도 외부 호출이 불가능했습니다.
  6. 복구 후에도 로컬 디스크에 있던 세션과 첨부 파일을 되살리지 못했습니다.
단일 가용 영역 설계의 전면 중단과 다중 AZ 로 바꾼 구성의 영향 범위 위쪽은 로드 밸런서, EC2 인스턴스 네 대, RDS 단일 인스턴스, NAT 게이트웨이가 모두 한 가용 영역에 들어 있는 구성입니다. 그 가용 영역이 손상되면 네 가지가 순서대로 끊깁니다. 로드 밸런서에 등록된 대상이 전부 빠지고, 인스턴스 네 대가 함께 사라지고, 데이터베이스 접속이 끊기고, 아웃바운드 통신까지 멈춥니다. 결과는 서비스 전면 중단입니다. 인스턴스가 네 대라는 사실은 아무런 보호가 되지 않습니다. 넷이 같은 장애 도메인 안에 있기 때문입니다. 아래쪽은 같은 시스템을 다중 가용 영역 배치와 Auto Scaling 과 상태 비저장 설계로 바꾼 구성입니다. 로드 밸런서는 두 가용 영역의 서브넷에 모두 등록되어 있고, Auto Scaling 그룹은 두 영역에 인스턴스를 나눠 두었으며, 데이터베이스는 다른 영역에 대기 인스턴스를 둡니다. 같은 장애가 나면 영향은 AZ-a 안으로 갇힙니다. 로드 밸런서는 남은 영역으로 트래픽을 돌리고, Auto Scaling 은 남은 영역에서 인스턴스를 보충하며, 데이터베이스는 대기 인스턴스로 장애 조치되고 엔드포인트는 그대로입니다. 단일 가용 영역에 전부 몰린 구성 AZ-a — 손상 로드 밸런서 (한 서브넷에만) EC2 인스턴스 4대 RDS 단일 인스턴스 NAT 게이트웨이 1 등록된 대상이 전부 빠집니다 2 인스턴스 4대가 함께 사라집니다 3 데이터베이스 접속이 끊깁니다 4 아웃바운드 통신도 멈춥니다 서비스 전면 중단 — 인스턴스가 4대여도 같은 장애 도메인 안이라면 고가용성이 아닙니다 다중 가용 영역 · Auto Scaling · 상태 비저장으로 바꾼 구성 로드 밸런서 — 두 AZ 서브넷에 모두 등록 AZ-a — 손상 EC2 (ASG) RDS 프라이머리 AZ-b — 정상 EC2 (ASG) — 보충됩니다 RDS 대기 → 승격 같은 장애의 영향 범위 AZ-a 안으로 갇힙니다 로드 밸런서가 남은 AZ 로 트래픽을 돌립니다 ASG 가 인스턴스를 보충하고 DB 엔드포인트는 그대로입니다 가용성을 만드는 것은 인스턴스 대수가 아니라 장애 도메인을 가로지르는 배치입니다
가용 영역 하나가 손상됐을 때 로드 밸런서 · Auto Scaling · 데이터베이스 · NAT가 순서대로 끊기는 경로와, 다중 가용 영역 배치 · Auto Scaling · 상태 비저장 설계로 바꾼 구성에서 같은 장애가 어디까지만 영향을 주는지의 대비

요구사항과 제약

요구사항과 제약
구분 내용 설계에 주는 함의
요구 1 가용 영역 하나가 손실돼도 서비스가 계속되어야 한다 모든 계층이 최소 두 가용 영역에 있어야 한다
요구 2 사람이 개입하지 않고 자동 복구되어야 한다 상태 확인과 자동 교체가 필요하다
요구 3 인스턴스가 교체되어도 사용자 세션이 끊기지 않아야 한다 세션을 인스턴스 밖으로 옮긴다
요구 4 업로드 파일이 인스턴스와 함께 사라지지 않아야 한다 공유 스토리지나 객체 스토리지로 옮긴다
제약 1 애플리케이션 코드 변경은 최소한으로 한다 파일 경로를 바꾸지 않아도 되는 선택지가 유리하다
제약 2 리전을 넘는 구성은 이번 범위가 아니다 리전 장애 대비는 케이스 8에서 다룬다

배경 개념은 7장 로드 밸런싱과 오토스케일링과 10장 RDS와 관계형 데이터베이스에 있습니다.

후보 설계안 비교

"가용성을 높이자"는 합의는 쉽지만, 무엇을 얼마나 바꿀지에서 갈립니다. 네 가지 수준의 안을 놓고 비교합니다.

후보 설계안 4종 비교 — 가용 영역 하나가 사라졌을 때 어디까지 견디는가
항목 A · 같은 가용 영역에 인스턴스 증설 B · 다른 가용 영역에 대기 인스턴스 상시 가동 C · 다중 가용 영역 Auto Scaling + Multi-AZ 데이터베이스 D · C + 상태 외부화 + 공유 스토리지
가용 영역 손실 시 전면 중단 수동 전환 후 일부 복구 자동으로 남은 가용 영역에서 처리 동일
인스턴스 교체 시 세션 끊긴다 끊긴다 끊긴다 유지된다
업로드 파일 인스턴스와 함께 사라진다 동기화 스크립트가 필요하다 여전히 인스턴스에 묶인다 공유 스토리지 또는 객체 스토리지
자동 복구 같은 가용 영역 안에서만 수동 자동 자동
평상시 자원 필요한 만큼 대기 자원이 놀고 있다 부하에 따라 조절된다 동일
판정 오답 — 문제를 풀지 못한다 부분적 · 비효율 필요 조건이지만 요구 3·4가 남는다 선택

선택과 근거

D안을 고릅니다. C안까지만 하면 요구 1·2는 만족하지만 요구 3·4가 남습니다. 그리고 요구 3·4를 해결하지 않으면 자동 교체가 사용자에게 장애로 보입니다. 인스턴스가 바뀔 때마다 로그인이 풀리고 첨부 파일이 사라지면, 가용성을 높인 대가로 신뢰를 잃습니다.

계층별 처방

계층별로 무엇을 다중화하는가
계층 현재 변경 확인 방법
로드 밸런서 가용 영역 1개 서브넷만 등록 가용 영역 2개 이상의 서브넷 등록 로드 밸런서의 가용 영역 목록 조회
컴퓨팅 단일 서브넷 Auto Scaling 그룹 여러 가용 영역의 서브넷 지정, 최소 용량 조정 VPCZoneIdentifier와 실제 인스턴스 분포
데이터베이스 단일 인스턴스 Multi-AZ 활성화 대기 가용 영역이 채워졌는지
아웃바운드 NAT 게이트웨이 1개 가용 영역마다 NAT, 가용 영역별 라우팅 테이블 각 프라이빗 라우팅 테이블의 대상
세션 인스턴스 로컬 디스크 외부 저장소(캐시 또는 키-값 데이터베이스) 인스턴스를 종료해도 로그인이 유지되는지
업로드 파일 인스턴스 EBS 볼륨 Amazon S3 또는 Amazon EFS 새 인스턴스에서 같은 파일이 보이는지

Auto Scaling 그룹을 여러 가용 영역으로

spread-asg.sh — 서브넷을 여러 가용 영역으로 확장하고 상태 확인을 로드 밸런서 기준으로 (식별자는 예시입니다)
aws autoscaling update-auto-scaling-group \
  --auto-scaling-group-name booking-app \
  --vpc-zone-identifier "subnet-0aaa000000000000a,subnet-0bbb000000000000b" \
  --min-size 4 \
  --max-size 12 \
  --health-check-type ELB \
  --health-check-grace-period 300

# 실제로 여러 가용 영역에 퍼졌는지 확인합니다.
aws autoscaling describe-auto-scaling-groups \
  --auto-scaling-group-names booking-app \
  --query 'AutoScalingGroups[0].Instances[].[InstanceId,AvailabilityZone,LifecycleState,HealthStatus]' \
  --output table

최소 용량을 어떻게 잡는가

가용 영역 두 곳에 인스턴스를 나누기만 하면 되는 것이 아닙니다. 한 가용 영역이 사라졌을 때 남은 쪽이 전체 부하를 감당할 수 있어야 합니다.

교차 영역 로드 밸런싱 기본값 차이

가용 영역마다 대상 수가 다를 때 트래픽 분포가 균등하지 않은 현상은 교차 영역 로드 밸런싱 설정에서 나옵니다.

로드 밸런서별 교차 영역 로드 밸런싱 기본값
로드 밸런서 기본값 변경 가능 여부
Application Load Balancer 켜짐 끌 수 없다
Network Load Balancer 꺼짐 변경 가능
Gateway Load Balancer 꺼짐 변경 가능

시험 관점에서 중요한 것은 "ALB는 기본이 켜짐"보다 "ALB는 끌 수 없다"는 사실입니다. Network Load Balancer를 다중 가용 영역에 두고 가용 영역마다 대상 수가 다르면 기본 설정에서는 트래픽이 고르게 분배되지 않습니다.

상태 비저장으로 만들기

세션을 인스턴스 로컬 디스크에 저장하고, 로드 밸런서의 고정 세션으로 같은 인스턴스에 붙입니다. 인스턴스가 교체되면 그 인스턴스에 붙어 있던 사용자의 세션이 사라집니다. 가용 영역이 사라지면 그 가용 영역 사용자 전체의 세션이 사라집니다.

세션을 외부 저장소에 두고, 어떤 인스턴스가 요청을 받아도 같은 세션을 읽게 합니다. 인스턴스는 언제든 교체할 수 있는 부품이 되고, Auto Scaling의 축소·확대가 사용자에게 보이지 않습니다.

인스턴스에 묶인 상태를 어디로 옮기는가
상태 옮길 곳 고르는 이유
사용자 세션 Amazon ElastiCache 또는 Amazon DynamoDB 짧은 수명, 매우 잦은 읽기·쓰기. 만료(TTL) 처리가 필요하다
업로드 파일 (신규 개발) Amazon S3 내구성이 높고 용량 상한을 신경 쓰지 않는다
업로드 파일 (기존 코드가 파일 경로를 쓴다) Amazon EFS 여러 가용 영역의 여러 인스턴스가 동시에 마운트할 수 있고 코드 변경이 거의 없다
애플리케이션 로그 Amazon CloudWatch Logs 인스턴스가 사라져도 로그가 남아야 원인 분석이 가능하다
캐시된 계산 결과 ElastiCache 인스턴스마다 따로 캐시하면 적중률이 떨어진다

제약 1(코드 변경 최소) 때문에 이 케이스에서는 업로드 파일을 Amazon EFS로 옮깁니다. 기존 코드가 파일 경로로 읽고 쓰는 구조라면 마운트 지점만 바꾸면 되기 때문입니다. 새로 설계한다면 S3가 더 나은 기본값입니다.

비용과 운영에 미치는 영향

다중 가용 영역화가 만드는 비용·운영 항목의 변화
항목 변화 설명
컴퓨팅 여유 용량만큼 늘어난다 한 가용 영역이 빠져도 견디려면 평상시 여유가 필요하다. 이것이 가용성의 값이다
데이터베이스 대기 인스턴스가 추가된다 Multi-AZ는 읽기 처리량을 늘리지 않는다. 사는 것은 가용성이다
NAT 게이트웨이 가용 영역 수만큼 늘어난다 대신 가용 영역을 넘는 전송이 사라져 전송 요금이 줄어드는 상쇄가 있다
가용 영역 간 데이터 전송 늘어난다 계층 사이 통신이 가용 영역을 넘는 경우가 생긴다. 트래픽이 큰 구간은 배치를 고려한다
공유 스토리지 새 항목이 생긴다 EFS 또는 S3 저장·요청 항목이 추가된다
장애 대응 줄어든다 가용 영역 손상이 전면 중단에서 용량 감소로 격하된다

설계 체크리스트

다중 가용 영역 배치

상태 비저장

자동 복구

관련 시험 포인트

문제문의 신호와 정답 방향
문제문의 신호 고르는 것 소거하는 것
가용 영역 장애를 견뎌야 한다 다중 가용 영역 배치 + Auto Scaling + Multi-AZ 데이터베이스 같은 가용 영역에 인스턴스를 늘리는 안
인스턴스가 교체돼도 세션이 유지돼야 한다 세션 외부화(ElastiCache · DynamoDB) 고정 세션(sticky session)으로 해결하는 안
여러 인스턴스가 같은 파일을 공유해야 한다 Amazon EFS(코드 변경 최소) 또는 Amazon S3 EBS 볼륨 공유(가용 영역에 묶인다)
애플리케이션은 살아 있는데 응답만 못 한다 Auto Scaling 상태 확인에 ELB 추가 EC2 상태 확인만 쓰는 안
가용 영역마다 대상 수가 달라 분배가 고르지 않다 교차 영역 로드 밸런싱 활성화(NLB의 경우) ALB에서 이 설정을 바꾸려는 안(끌 수 없다)
새 인스턴스가 뜨자마자 비정상으로 교체된다 상태 확인 유예 기간 확대 상태 확인을 끄는 안

이어서 볼 곳

공식 문서 출처