아키텍처 케이스 · 5
단일 AZ 설계가 장애로 전면 중단됐다
인스턴스를 여러 대 띄웠는데도 서비스가 통째로 멈췄습니다. 원인은 대수가 아니라 장애 도메인이었습니다 — 전부 같은 가용 영역(Availability Zone, AZ)에 있었기 때문입니다. 이 케이스는 가용 영역 하나가 손상됐을 때 무엇이 어떤 순서로 끊기는지 추적하고, 다중 가용 영역 · Auto Scaling · 상태 비저장 세 가지로 구성을 바꿉니다.
학습 목표
- 같은 가용 영역에 인스턴스를 늘리는 것이 왜 고가용성이 아닌지 설명할 수 있습니다.
- 가용 영역 장애 시 끊기는 구성 요소를 계층별로 열거하고 각각의 처방을 배정할 수 있습니다.
- 세션 상태를 외부화해야 자동 교체가 성립한다는 점을 설명할 수 있습니다.
- Auto Scaling 그룹의 상태 확인 유형 차이와 교차 영역 로드 밸런싱 기본값을 구분할 수 있습니다.
- 시험 문항에서 "가장 가용성이 높은" 한정어가 붙었을 때 확인 순서를 적용할 수 있습니다.
상황
사내 예약 서비스가 다음과 같이 구성되어 있습니다.
- Application Load Balancer 하나. 등록된 서브넷은 가용 영역 하나뿐입니다.
- 애플리케이션 인스턴스 4대. Auto Scaling 그룹에 들어 있지만
VPCZoneIdentifier에 서브넷이 하나만 지정되어 있습니다. - Amazon RDS 단일 인스턴스. Multi-AZ가 꺼져 있습니다.
- NAT 게이트웨이 하나. 프라이빗 라우팅 테이블 전부가 이 하나를 가리킵니다.
- 세션 정보는 각 인스턴스의 로컬 디스크에 저장됩니다.
- 업로드된 첨부 파일도 인스턴스의 EBS 볼륨에 저장됩니다.
해당 가용 영역에 문제가 생기자 다음 순서로 장애가 확산됐습니다.
- 인스턴스 4대가 동시에 응답하지 않게 되고, 로드 밸런서의 상태 확인이 전부 실패했습니다.
- Auto Scaling 그룹이 교체 인스턴스를 시작하려 했지만, 지정된 서브넷이 그 가용 영역에만 있어 시작이 실패했습니다.
- 로드 밸런서 자체도 그 가용 영역에만 등록되어 있어 요청을 받을 곳이 없었습니다.
- 데이터베이스도 같은 가용 영역이라 접속이 끊겼습니다.
- NAT 게이트웨이가 그 가용 영역에 있어, 다른 가용 영역에 무언가 띄웠더라도 외부 호출이 불가능했습니다.
- 복구 후에도 로컬 디스크에 있던 세션과 첨부 파일을 되살리지 못했습니다.
요구사항과 제약
| 구분 | 내용 | 설계에 주는 함의 |
|---|---|---|
| 요구 1 | 가용 영역 하나가 손실돼도 서비스가 계속되어야 한다 | 모든 계층이 최소 두 가용 영역에 있어야 한다 |
| 요구 2 | 사람이 개입하지 않고 자동 복구되어야 한다 | 상태 확인과 자동 교체가 필요하다 |
| 요구 3 | 인스턴스가 교체되어도 사용자 세션이 끊기지 않아야 한다 | 세션을 인스턴스 밖으로 옮긴다 |
| 요구 4 | 업로드 파일이 인스턴스와 함께 사라지지 않아야 한다 | 공유 스토리지나 객체 스토리지로 옮긴다 |
| 제약 1 | 애플리케이션 코드 변경은 최소한으로 한다 | 파일 경로를 바꾸지 않아도 되는 선택지가 유리하다 |
| 제약 2 | 리전을 넘는 구성은 이번 범위가 아니다 | 리전 장애 대비는 케이스 8에서 다룬다 |
배경 개념은 7장 로드 밸런싱과 오토스케일링과 10장 RDS와 관계형 데이터베이스에 있습니다.
후보 설계안 비교
"가용성을 높이자"는 합의는 쉽지만, 무엇을 얼마나 바꿀지에서 갈립니다. 네 가지 수준의 안을 놓고 비교합니다.
| 항목 | 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 그룹을 여러 가용 영역으로
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
최소 용량을 어떻게 잡는가
가용 영역 두 곳에 인스턴스를 나누기만 하면 되는 것이 아닙니다. 한 가용 영역이 사라졌을 때 남은 쪽이 전체 부하를 감당할 수 있어야 합니다.
- 필요 용량이 4대이고 가용 영역이 2개라면, 각 가용 영역에 4대씩 총 8대를 두는 것이 가장 안전합니다(N+N).
- 가용 영역을 3개로 늘리면 필요 용량의 절반만 여유로 두어도 됩니다(N+1 성격). 가용 영역 수를 늘릴수록 필요한 여유 비율이 줄어듭니다.
- Auto Scaling이 남은 가용 영역에서 즉시 인스턴스를 시작하더라도 기동 시간 동안은 용량이 부족합니다. 이 지연을 감수할 수 있는지가 여유 용량을 정하는 기준입니다.
교차 영역 로드 밸런싱 기본값 차이
가용 영역마다 대상 수가 다를 때 트래픽 분포가 균등하지 않은 현상은 교차 영역 로드 밸런싱 설정에서 나옵니다.
| 로드 밸런서 | 기본값 | 변경 가능 여부 |
|---|---|---|
| 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에서 이 설정을 바꾸려는 안(끌 수 없다) |
| 새 인스턴스가 뜨자마자 비정상으로 교체된다 | 상태 확인 유예 기간 확대 | 상태 확인을 끄는 안 |
이어서 볼 곳
- 7장 · 로드 밸런싱과 오토스케일링 ALB·NLB·GWLB 선택 기준, 대상 그룹과 상태 확인, 스케일링 정책과 수명주기 훅을 다룹니다.
- 9장 · 파일 스토리지와 데이터 전송 EFS와 FSx의 성격, 여러 인스턴스가 공유하는 스토리지의 선택 기준입니다.
- 실습 2 · ALB + ASG 웹 티어 다중 가용 영역 웹 티어를 CLI로 만들고 상태 확인 실패를 관찰합니다.
- 케이스 7 · 트래픽 급증에 스케일아웃이 못 따라갔다 같은 Auto Scaling 구성이 부하 급증에서는 다른 방식으로 실패합니다.
- 케이스 8 · 리전 장애에 대비한 DR을 설계하라 가용 영역이 아니라 리전 단위 장애로 범위를 넓혔을 때의 판단입니다.
- 복원력 있는 아키텍처 설계 (26%) 과제 진술 2개와 출제 포인트, 자주 나오는 함정을 정리했습니다.
공식 문서 출처
- Amazon EC2 Auto Scaling API 레퍼런스 — UpdateAutoScalingGroup
— 상태 확인 유형(
EC2·EBS·ELB·VPC_LATTICE)과EC2가 기본이며 끌 수 없다는 서술,VPCZoneIdentifier와 가용 영역의 관계 - Elastic Load Balancing API 레퍼런스 — ModifyLoadBalancerAttributes
—
load_balancing.cross_zone.enabled의 기본값이 로드 밸런서 유형마다 다르고 Application Load Balancer에서는 변경할 수 없다는 서술 - Amazon RDS 사용 설명서 — 단일 대기 인스턴스를 사용하는 Multi-AZ 배포 — 동기식 복제와 자동 장애 조치의 동작
- Amazon VPC 사용 설명서 — NAT 게이트웨이 — NAT 게이트웨이가 지정한 서브넷에 만들어진다는 점(따라서 가용 영역에 묶인다)
- Amazon EC2 사용 설명서 — 리전과 가용 영역 — 가용 영역이 독립된 장애 격리 단위라는 정의
- Amazon EC2 API 레퍼런스 — CreateVolume — EBS 볼륨이 특정 가용 영역에 생성된다는 제약