학습 목표

Amazon RDS — 무엇까지 AWS가 하는가

Amazon RDS는 관계형 데이터베이스 엔진을 대신 운영해 주는 서비스입니다. 직접 EC2에 데이터베이스를 설치하는 것과 비교하면, 운영체제와 엔진 설치 · 패치 · 백업 · 장애 조치 · 복제 설정이 AWS 쪽으로 넘어갑니다. 반대로 스키마 · 인덱스 · 쿼리 · 데이터베이스 사용자 · 네트워크 배치 · 암호화 선택은 여전히 우리 몫입니다.

시험에서 LEAST operational overhead라는 한정어가 붙으면 이 경계선이 그대로 정답의 근거가 됩니다. "EC2에 직접 데이터베이스를 설치하고 스크립트로 백업한다"는 선택지는 같은 결과를 내더라도 운영 부담이 더 크므로 소거 대상입니다.

지원 엔진

RDS API의 Engine 파라미터가 받는 값이 곧 지원 엔진 목록입니다. 엔진 계열은 크게 세 갈래입니다.

Amazon RDS가 지원하는 데이터베이스 엔진 계열
계열 엔진 시험에서의 성격
오픈소스 MySQL, MariaDB, PostgreSQL 읽기 전용 복제본 · Multi-AZ · Multi-AZ DB 클러스터를 폭넓게 지원합니다. 시나리오 문항의 기본 전제입니다
상용 Oracle, Microsoft SQL Server, IBM Db2 라이선스와 기능 제약이 따라옵니다. 읽기 전용 복제본 개수 상한이 오픈소스 엔진보다 낮습니다
클라우드 네이티브 Amazon Aurora (MySQL 호환 · PostgreSQL 호환) API에서는 aurora-mysql · aurora-postgresql이며, DB 클러스터로 만들고 복제 구조가 다릅니다

Aurora가 목록에 함께 있지만 동작 모델은 별개입니다. RDS API 문서는 읽기 전용 복제본 생성 작업(CreateDBInstanceReadReplica)에 대해 Aurora는 이 작업을 지원하지 않는다고 명시합니다. Aurora에서 읽기 용량을 늘리는 방법은 복제본을 따로 만드는 것이 아니라 클러스터에 DB 인스턴스를 추가하는 것입니다. 자세한 구조는 아래 Aurora 절에서 다룹니다.

책임 경계 — 어디까지가 AWS인가

Amazon RDS에서의 책임 분담
항목 누구의 몫인가 근거와 함의
물리 인프라 · 하이퍼바이저 AWS 모든 관리형 서비스와 동일합니다
운영체제 설치와 패치 AWS 유지 관리 기간에 수행됩니다. 인스턴스에 SSH로 접속하는 경로 자체가 없습니다
데이터베이스 엔진 설치와 마이너 버전 업그레이드 AWS — AutoMinorVersionUpgrade가 기본 활성 API 문서는 "기본적으로 마이너 엔진 업그레이드가 자동 적용된다"고 명시합니다
메이저 버전 업그레이드 시점 고객 호환성 검증이 필요하므로 자동으로 올라가지 않습니다
자동 백업 수행 AWS — 보존 기간 설정은 고객 보존 기간을 0으로 두면 자동 백업 자체가 꺼집니다
Multi-AZ 장애 조치 AWS — Multi-AZ를 켜는 것은 고객 켜지 않으면 대기 인스턴스가 없고 장애 조치도 없습니다
스키마 · 인덱스 · 쿼리 튜닝 고객 관리형이라고 느린 쿼리가 빨라지지 않습니다
데이터베이스 사용자와 권한 고객 IAM과는 별개 계층입니다. IAM 데이터베이스 인증은 선택 기능입니다
네트워크 배치 · 보안 그룹 고객 프라이빗 서브넷 배치는 3장 VPC 네트워킹 기초의 주제입니다
저장 시 암호화 여부 고객 — 생성 시점에만 결정 아래 암호화 절에서 다룹니다

Multi-AZ와 읽기 전용 복제본 SAA 빈출

Multi-AZ는 가용성, 읽기 전용 복제본은 읽기 확장입니다. 이 한 문장이 이 장에서 가장 많은 문항을 가릅니다. 요구가 둘 다면 둘 다 구성하는 선택지가 정답이고, 둘을 바꿔 놓은 선택지는 그 자리에서 소거합니다.

같은 결론을 도메인 2 해설에서 이미 요약해 두었습니다. 여기서는 그 표 아래로 한 층 더 내려가 왜 그렇게 되는지를 복제 방식에서부터 따라갑니다.

RDS Multi-AZ 배포와 읽기 전용 복제본의 구조 대비 왼쪽은 표준 Multi-AZ 인스턴스 배포입니다. 애플리케이션은 엔드포인트 하나만 알고 있고, 프라이머리 인스턴스는 커밋을 다른 가용 영역의 대기 인스턴스에 동기적으로 반영한 뒤에야 응답합니다. 대기 인스턴스는 읽기 트래픽을 전혀 받지 않으며 오직 장애 조치를 위해 존재합니다. 오른쪽은 읽기 전용 복제본입니다. 프라이머리의 변경이 비동기로 전달되므로 약간의 복제 지연이 생길 수 있고, 복제본은 자기 엔드포인트를 따로 가져 읽기 트래픽을 실제로 처리하며, 같은 리전뿐 아니라 다른 리전에도 놓을 수 있습니다. 아래 표가 다섯 항목으로 이 차이를 정리합니다. 복제 방식, 목적, 엔드포인트 개수, 두 번째 인스턴스가 읽기를 받는지, 배치 가능한 범위입니다. 맨 아래 주의 문구는 읽기 가능한 대기 인스턴스 두 개를 갖는 Multi-AZ DB 클러스터 배포가 여기 그려진 표준 Multi-AZ 인스턴스 배포와 다른 아키텍처라는 점을 지적합니다. Multi-AZ 배포 (인스턴스 배포) 가용성 문제를 푸는 구성 애플리케이션 엔드포인트 하나뿐 동기 복제 프라이머리 읽기 · 쓰기 대기 인스턴스 읽기 트래픽 없음 AZ-a AZ-b 읽기 전용 복제본 (Read Replica) 읽기 확장 문제를 푸는 구성 애플리케이션 쓰기 엔드포인트 읽기 엔드포인트 비동기 복제 프라이머리 읽기 · 쓰기 읽기 전용 복제본 읽기 트래픽 처리 AZ-a 다른 AZ 또는 다른 리전 항목 Multi-AZ 배포 읽기 전용 복제본 복제 방식 동기 — 커밋이 양쪽에 반영된 뒤 응답 비동기 — 복제 지연이 생길 수 있음 푸는 문제 고가용성 · 재해 복구 읽기 성능 확장 엔드포인트 하나 — 장애 조치 후에도 그대로 읽기용 엔드포인트가 따로 생김 배치 범위 같은 리전의 다른 AZ 같은 리전 또는 교차 리전 여기 그린 것은 표준 Multi-AZ 인스턴스 배포입니다 Multi-AZ DB 클러스터 배포는 읽기 가능한 대기 인스턴스 두 개를 갖는 별개 아키텍처이므로 섞지 않습니다
Multi-AZ 배포와 읽기 전용 복제본의 구조 대비 — 왼쪽은 동기 복제로 다른 가용 영역에 대기 인스턴스를 두지만 그 인스턴스는 읽기를 받지 않고 엔드포인트도 하나뿐이며, 오른쪽은 비동기 복제로 읽기 트래픽을 처리하는 별도 엔드포인트를 갖고 다른 리전에도 놓을 수 있습니다

Multi-AZ 배포 — 동기 복제로 가용성을 산다

Multi-AZ DB 인스턴스 배포는 다른 가용 영역에 동기식(synchronous) 대기 복제본을 두고 유지합니다. RDS 사용 설명서는 프라이머리가 "가용 영역을 가로질러 대기 복제본으로 동기적으로 복제된다"고 서술합니다. 커밋은 대기 쪽 스토리지에 기록이 반영된 뒤에 완료되므로, 장애 조치가 일어나도 커밋된 트랜잭션이 유실되지 않습니다.

대가는 지연 시간입니다. 같은 문서가 "동기 복제 때문에 단일 가용 영역 배포보다 쓰기와 커밋 지연이 늘어날 수 있다"고 명시합니다. Multi-AZ는 쓰기 지연을 조금 내주고 가용성을 사는 거래입니다.

결정적인 제약은 이것입니다. RDS 사용 설명서는 Multi-AZ에 대해 "고가용성 옵션은 읽기 전용 시나리오를 위한 확장 솔루션이 아니며, 대기 복제본으로 읽기 트래픽을 처리할 수 없다"고 못 박습니다. 대기 인스턴스는 평소에 놀고 있는 것처럼 보이지만, 애플리케이션이 접근할 수 있는 엔드포인트가 없습니다.

읽기 전용 복제본 — 비동기 복제로 읽기를 늘린다

읽기 전용 복제본은 소스 인스턴스의 변경을 비동기(asynchronous)로 따라갑니다. 비동기이므로 소스의 쓰기 성능이 복제본 수에 크게 좌우되지 않지만, 대신 복제 지연(replica lag)이 존재합니다. 방금 쓴 값을 곧바로 복제본에서 읽으면 이전 값이 보일 수 있습니다.

복제본은 자기 엔드포인트를 갖습니다. 그래서 읽기 부하를 나누려면 애플리케이션이 읽기 쿼리를 그 엔드포인트로 보내도록 수정해야 합니다. 문제문에 without changing application code가 붙어 있으면 읽기 전용 복제본만으로는 요구를 만족시키지 못한다는 뜻이 됩니다.

복제본에는 몇 가지 조건이 따라붙습니다. RDS API 문서 기준으로 정리하면 다음과 같습니다.

네 가지 축으로 가르기

Amazon RDS Multi-AZ 배포와 읽기 전용 복제본 비교
항목 Multi-AZ 배포 읽기 전용 복제본
복제 방식 동기(synchronous) 비동기(asynchronous)
목적 고가용성과 재해 복구 읽기 성능 확장
엔드포인트 동일 엔드포인트 유지. 장애 조치 시 DNS가 대기 인스턴스를 가리킵니다 별도의 읽기 엔드포인트
읽기 처리 대기 인스턴스는 읽기 트래픽을 받지 않습니다 읽기 트래픽을 처리합니다
배치 범위 같은 리전의 다른 가용 영역 같은 리전 또는 다른 리전
애플리케이션 수정 필요 없음 읽기를 읽기 엔드포인트로 보내도록 수정 필요
데이터 유실 가능성 커밋된 트랜잭션은 유실되지 않습니다 복제 지연만큼 최신 쓰기가 빠질 수 있습니다
승격 AWS가 자동으로 장애 조치 수동 승격 — 자동으로 일어나지 않습니다
가용 영역 지정 불가 — AvailabilityZone 파라미터를 함께 쓸 수 없습니다 지정 가능
rds-availability-vs-read-scale.sh — 가용성과 읽기 확장은 서로 다른 호출로 만들어집니다 (리전 코드와 식별자는 예시입니다)
# (1) 가용성 — 기존 인스턴스를 Multi-AZ 배포로 전환합니다.
#     엔드포인트는 그대로이고 애플리케이션은 손대지 않습니다.
aws rds modify-db-instance \
  --db-instance-identifier app-prod \
  --multi-az \
  --apply-immediately

# (2) 읽기 확장 — 별도의 읽기 엔드포인트를 갖는 복제본을 만듭니다.
#     소스는 자동 백업이 켜져 있어야 합니다.
aws rds create-db-instance-read-replica \
  --db-instance-identifier app-prod-reader-1 \
  --source-db-instance-identifier app-prod

# (3) 두 엔드포인트가 다르다는 것을 확인합니다.
aws rds describe-db-instances \
  --query 'DBInstances[].[DBInstanceIdentifier,MultiAZ,Endpoint.Address,ReadReplicaSourceDBInstanceIdentifier]' \
  --output table

장애 조치는 어떻게 일어나는가

Multi-AZ 장애 조치의 핵심 기제는 DNS 레코드 전환입니다. RDS 사용 설명서는 "장애 조치 메커니즘이 DB 인스턴스의 DNS 레코드를 대기 인스턴스를 가리키도록 자동으로 바꾼다"고 설명하며, 그 결과 기존 연결은 다시 맺어야 한다고 덧붙입니다. 엔드포인트 문자열이 바뀌지 않으므로 애플리케이션 설정은 그대로 두어도 됩니다.

소요 시간은 같은 문서 기준 대체로 60~120초이며, 큰 트랜잭션이나 긴 복구 과정이 있으면 더 걸릴 수 있습니다. 장애 조치를 유발하는 사유도 문서에 표로 정리되어 있습니다.

Multi-AZ DB 인스턴스 배포에서 장애 조치가 발생하는 사유
사유 설명
운영체제 패치 유지 관리 기간에 운영체제 패치나 보안 업데이트가 오프라인 작업으로 수행될 때
프라이머리 호스트 이상 프라이머리 인스턴스가 손상된 것으로 감지될 때
네트워크 도달 불가 모니터링이 프라이머리로의 네트워크 도달 실패를 감지할 때
스토리지 볼륨 장애 프라이머리의 스토리지 볼륨에 문제가 감지될 때
고객의 인스턴스 수정 인스턴스 클래스 변경 같은 수정 작업이 장애 조치를 유발할 때
사용자 요청 장애 조치를 동반한 재부팅을 선택했을 때 — 정기적으로 시험해 볼 수 있는 유일한 방법입니다

위 목록에서 읽어야 할 것은 유지 관리도 장애 조치의 사유라는 점입니다. Multi-AZ는 계획된 유지 관리 중의 중단 시간을 줄이는 장치이기도 합니다. 이 관계는 유지 관리 기간 절에서 다시 다룹니다.

같은 프라이머리 장애를 Multi-AZ와 읽기 전용 복제본에 각각 넣었을 때 위아래 두 구성에 똑같이 프라이머리 인스턴스 장애를 주입한 뒤의 상태입니다. 위쪽 Multi-AZ 구성에서는 RDS 가 자동으로 장애 조치를 수행해 대기 인스턴스를 새 프라이머리로 승격하고 엔드포인트 DNS 이름이 가리키는 대상만 바뀝니다. 애플리케이션이 쓰는 엔드포인트 문자열은 그대로이므로 연결을 다시 맺기만 하면 쓰기가 재개됩니다. 아래쪽 읽기 전용 복제본 구성에서는 자동 승격이 일어나지 않습니다. 복제본은 읽기 요청을 계속 처리하지만 쓰기 엔드포인트는 죽은 프라이머리를 계속 가리키고 있어 쓰기가 계속 실패합니다. 복구하려면 운영자가 복제본을 수동으로 승격해야 하고 승격된 인스턴스는 새 엔드포인트를 갖기 때문에 애플리케이션 설정도 함께 바꿔야 합니다. 가용성 문제와 읽기 확장 문제는 서로 다른 문제이며 읽기 전용 복제본은 가용성 대책이 아닙니다. 같은 장애를 두 구성에 넣습니다 프라이머리 장애 주입됨 Multi-AZ 배포 애플리 케이션 엔드포인트 문자열 그대로입니다 DNS 전환 프라이머리 (AZ-a) 장애 동기 복제로 이미 최신 대기 인스턴스 (AZ-b) 승격 — 새 프라이머리 쓰기 재개 애플리케이션 설정 변경 없음 읽기 전용 복제본 구성 애플리 케이션 쓰기 엔드포인트 읽기 엔드포인트 프라이머리 장애 복제 중단 읽기 전용 복제본 자동 승격 없음 쓰기는 계속 실패합니다 읽기만 복제본에서 처리됩니다 수동 승격이 필요하고 엔드포인트도 바뀝니다 가용성과 읽기 확장은 다른 문제입니다 읽기 전용 복제본을 아무리 늘려도 프라이머리가 죽으면 쓰기는 돌아오지 않습니다
같은 장애를 두 구성에 넣었을 때의 차이 — Multi-AZ는 DNS가 대기 인스턴스로 전환되어 같은 엔드포인트로 쓰기가 재개되지만, 읽기 전용 복제본 구성에서는 자동 승격이 일어나지 않아 쓰기가 계속 실패합니다

Multi-AZ DB 클러스터 — 이름이 비슷한 별개 아키텍처

여기가 이 장에서 가장 조심할 지점입니다. Multi-AZ DB 인스턴스 배포와 Multi-AZ DB 클러스터 배포는 이름이 두 글자 차이지만 구조가 다릅니다. RDS 사용 설명서는 Multi-AZ DB 클러스터를 이렇게 정의합니다.

그리고 RDS 사용 설명서는 별도의 경고 상자로 "Multi-AZ DB 클러스터는 Aurora DB 클러스터와 같은 것이 아니다"라고 적어 둡니다. 이름에 모두 "클러스터"가 들어가지만 세 가지는 전부 다른 것입니다.

이름이 비슷한 세 가지 배포 형태 구분
항목 Multi-AZ DB 인스턴스 배포 Multi-AZ DB 클러스터 배포 Aurora DB 클러스터
대기 인스턴스 1개 2개 Aurora 복제본(읽기 인스턴스)
대기 인스턴스로 읽기 불가 가능 가능
복제 방식 동기 반동기 — 읽기 인스턴스 중 최소 하나의 확인 공유 클러스터 볼륨 — 인스턴스 간 데이터 복제가 아님
스토리지 인스턴스마다 자기 볼륨 인스턴스마다 자기 볼륨 (프로비저닝된 IOPS 전용) 모든 인스턴스가 하나의 클러스터 볼륨을 공유
가용 영역 수 2 3 클러스터 볼륨이 3개 가용 영역에 복제됨

Amazon Aurora — 스토리지를 컴퓨트에서 떼어 냈다

Aurora는 MySQL과 PostgreSQL 호환 엔진이지만, 스토리지 계층을 다시 설계한 것이 본질입니다. RDS에서는 인스턴스마다 자기 볼륨이 있고 복제란 곧 데이터를 한 번 더 쓰는 일이었지만, Aurora에서는 모든 인스턴스가 하나의 클러스터 볼륨을 함께 봅니다.

Aurora 클러스터 — 컴퓨트와 분리된 공유 스토리지 볼륨 Amazon Aurora 클러스터는 컴퓨트 계층과 스토리지 계층이 분리되어 있습니다. 위쪽 컴퓨트 계층에는 쓰기를 담당하는 라이터 인스턴스 하나와 읽기를 담당하는 리더 인스턴스들이 있고, 클러스터 엔드포인트는 항상 현재 라이터를 가리키며 리더 엔드포인트는 리더들에게 연결을 분산합니다. 아래쪽 스토리지 계층은 세 개의 가용 영역에 걸쳐 여섯 벌의 복사본을 유지하는 하나의 클러스터 볼륨이고 모든 인스턴스가 이 볼륨을 공유합니다. 그래서 리더를 라이터로 승격할 때 데이터를 옮길 필요가 없고, 리더를 추가해도 데이터가 복사되지 않으며, 스토리지는 사용량에 따라 자동으로 늘어납니다. 이것이 인스턴스마다 자기 EBS 볼륨을 갖고 복제로 데이터를 따라 보내는 표준 RDS 모델과 근본적으로 다른 점입니다. 애플리케이션 클러스터 엔드포인트 항상 현재 라이터 리더 엔드포인트 리더들에게 연결 분산 라이터 읽기 · 쓰기 리더 1 읽기 전용 리더 2 읽기 전용 컴퓨트 계층 리더는 승격되면 그대로 라이터가 됩니다 — 볼륨이 이미 같으므로 데이터 복사가 없습니다 하나의 클러스터 볼륨 — 세 가용 영역에 여섯 벌 AZ-a 복사본 복사본 AZ-b 복사본 복사본 AZ-c 복사본 복사본 RDS 는 인스턴스마다 자기 스토리지 — Aurora 는 전원이 같은 볼륨을 봅니다 그래서 리더 추가도 승격도 데이터 복제를 기다리지 않고, 스토리지는 사용량만큼 자동으로 늘어납니다
Aurora 클러스터의 구조 — 라이터 인스턴스와 리더 인스턴스들이 세 가용 영역에 복제된 하나의 클러스터 볼륨을 공유하고, 클러스터 엔드포인트는 항상 현재 라이터를, 리더 엔드포인트는 리더들을 부하 분산해 가리킵니다

클러스터 볼륨 — 데이터가 인스턴스와 독립이다

Aurora 사용 설명서는 클러스터 볼륨을 "한 AWS 리전 안의 세 가용 영역에 걸쳐 데이터 사본을 두는 단일 가상 볼륨"이라고 정의합니다. 중요한 문장은 그다음입니다 — "복제의 양은 클러스터 안의 DB 인스턴스 개수와 무관하다." 인스턴스를 몇 개 두든 데이터의 내구성은 스토리지 계층이 알아서 확보합니다.

이 구조에서 따라오는 결과가 실무와 시험 양쪽에서 자주 나옵니다.

Aurora 복제본과 엔드포인트

클러스터에 두 번째 이후의 인스턴스를 만들면 그것이 Aurora 복제본(Aurora Replica) 또는 리더 인스턴스입니다. Aurora 사용 설명서는 복제본의 목적이 두 가지라고 명시합니다 — 읽기 확장과 가용성입니다. 라이터가 사용 불가 상태가 되면 Aurora가 리더 중 하나를 새 라이터로 자동 승격합니다.

여기가 RDS 읽기 전용 복제본과 갈리는 지점입니다. RDS 복제본은 자동 승격이 없고, Aurora 복제본은 장애 조치 대상입니다. Aurora에서는 "읽기 확장을 위한 인스턴스"와 "장애 조치 대상"이 같은 것입니다.

접속은 엔드포인트를 통해 이루어지고, 종류가 나뉩니다.

Amazon Aurora 엔드포인트의 종류와 용도
엔드포인트 가리키는 대상 언제 쓰는가
클러스터 엔드포인트 (라이터) 현재 프라이머리 인스턴스 하나 모든 쓰기와 DDL. 장애 조치가 일어나면 새 프라이머리로 자동으로 따라갑니다
리더 엔드포인트 Aurora 복제본들 — 연결 단위로 부하 분산 읽기 전용 쿼리. 복제본을 추가하면 별도 설정 없이 분산 대상에 들어갑니다
사용자 지정 엔드포인트 우리가 고른 인스턴스 부분집합 분석용으로 큰 인스턴스만 따로 묶는 것처럼, 용도별로 나눌 때
인스턴스 엔드포인트 특정 인스턴스 하나 진단과 튜닝. 애플리케이션이 상시로 쓰기에는 적합하지 않습니다

리더 엔드포인트가 있다는 사실이 판단을 바꿉니다. RDS 읽기 전용 복제본은 복제본마다 엔드포인트가 따로라서 복제본을 늘릴 때 애플리케이션 쪽 분산 로직이 필요하지만, Aurora는 리더 엔드포인트 하나만 바라보면 됩니다. "읽기 확장이 필요한데 운영 부담은 늘리기 싫다"는 요구가 Aurora로 수렴하는 이유입니다.

다만 클러스터에 복제본이 하나도 없으면 리더 엔드포인트는 프라이머리에 연결됩니다. 복제본을 만들지 않으면 읽기 확장도 장애 조치 대상도 없습니다.

Aurora 글로벌 데이터베이스 — 리전을 넘는다

Aurora 글로벌 데이터베이스는 쓰기를 받는 주 리전의 클러스터 하나와 읽기 전용 보조 리전 클러스터들로 구성됩니다. 복제는 애플리케이션이나 엔진이 아니라 Aurora 스토리지 하위 시스템의 전용 인프라가 수행합니다.

용도는 둘입니다. 전 세계 사용자에게 낮은 지연의 읽기를 제공하는 것과, 리전 전체 장애로부터 빠르게 복구하는 것입니다. 시험에서 "여러 대륙의 사용자가 읽기를 하고, 쓰기는 한 곳에서만 일어난다"는 문장이 나오면 이 기능이 후보에 들어옵니다.

보조 리전은 기본적으로 읽기 전용이지만, 쓰기 전달(write forwarding)을 켜면 보조 클러스터가 받은 쓰기를 주 클러스터로 넘기고 그 결과가 다시 복제되어 돌아옵니다. API 파라미터 이름은 EnableGlobalWriteForwarding입니다.

Aurora Serverless v2 — 용량을 자동으로 조절한다

Aurora Serverless v2는 온디맨드 자동 확장 구성입니다. 인스턴스 클래스를 고르는 대신 Aurora 용량 단위(Aurora Capacity Unit, ACU)의 최소값과 최대값을 정해 두면, 워크로드에 맞춰 그 범위 안에서 용량이 오르내립니다.

v2의 특징은 조절 단위가 작다는 점입니다. Aurora 사용 설명서는 프로비저닝된 클러스터에서 확장하려면 인스턴스를 통째로 추가해야 하는 반면 v2는 0.5 ACU 단위로 더하고 뺄 수 있다고 설명합니다. API의 MinCapacity·MaxCapacity도 0.5 단위 값을 받습니다.

고르는 기준은 부하의 예측 가능성입니다.

Aurora 프로비저닝 구성과 Aurora Serverless v2의 선택 기준
상황 더 나은 선택 근거
부하가 일정하고 예측 가능 프로비저닝된 인스턴스 용량을 고정해 두는 편이 단순하고, 약정 할인 대상이 됩니다
급증이 갑작스럽고 예측 불가 Aurora Serverless v2 최대 용량만 정해 두면 되고, 쓰지 않는 용량에는 과금되지 않습니다
개발 · 테스트처럼 유휴 시간이 김 Aurora Serverless v2 유휴 구간에서 용량이 내려갑니다. 지원 버전에서는 자동 일시 중지도 가능합니다
필요한 인스턴스 크기를 아직 모름 Aurora Serverless v2 실제 확장 폭을 관찰해 적정 용량을 찾을 수 있습니다
테넌트가 많고 각자 사용 시간대가 다름 Aurora Serverless v2 테넌트별로 클러스터를 두고도 유휴 클러스터의 비용이 낮게 유지됩니다

백업 — 자동 백업, 특정 시점 복구, 스냅샷

RDS의 백업은 두 갈래입니다. 자동 백업은 보존 기간 안에서 임의의 시점으로 되돌리기 위한 것이고, 수동 스냅샷은 특정 순간을 기한 없이 보관하기 위한 것입니다. 둘은 대체재가 아니라 역할이 다릅니다.

자동 백업 보존 기간 · 트랜잭션 로그 · 수동 스냅샷의 관계 가로축은 30일 전부터 지금까지의 시간입니다. 강조된 구간은 자동 백업 보존 기간이며 이 예에서는 7일입니다. 이 구간 안에서는 하루 한 번 뜨는 자동 백업 스냅샷과 5분 단위로 쌓이는 트랜잭션 로그가 결합되어 구간 안의 임의의 시점으로 복구할 수 있습니다. 이것이 특정 시점 복구, 즉 PITR 입니다. 보존 기간을 벗어난 자동 백업은 자동으로 삭제되므로 왼쪽 구간에서는 PITR 이 불가능합니다. 반면 사람이 직접 만든 수동 스냅샷은 보존 기간과 무관하게 삭제하기 전까지 남아 있으므로, 30일 전이든 1년 전이든 그 스냅샷 시점으로는 복원할 수 있습니다. 다만 그 사이 임의 시점으로는 갈 수 없습니다. 아래쪽에 적힌 대로 복원은 기존 인스턴스를 되돌리는 작업이 아니라 새 DB 인스턴스를 만드는 작업이며, 새 인스턴스는 새 엔드포인트를 갖기 때문에 애플리케이션 연결 정보를 바꿔야 합니다. PITR 가능 구간 보존 기간 안에서만 임의 시점으로 갈 수 있습니다 수동 스냅샷 스냅샷 A 스냅샷 B 삭제하기 전까지 남습니다 — 보존 기간과 무관합니다 자동 백업 보존 기간이 지난 자동 백업은 삭제됩니다 트랜잭션 로그 5분 단위로 쌓입니다 30일 전 20일 전 10일 전 지금 보존 기간 시작 (여기서는 7일) 복구 지점을 고릅니다 구간 안의 시점 또는 스냅샷 하나 새 DB 인스턴스가 생깁니다 엔드포인트도 새로 만들어집니다 기존 인스턴스는 그대로 남아 있습니다 자동 백업은 구간 안 임의 시점 · 수동 스냅샷은 그 시점 하나 복원은 되돌리기가 아니라 새 인스턴스 만들기이며 애플리케이션 연결 정보를 바꿔야 합니다
자동 백업 보존 기간과 트랜잭션 로그가 겹쳐 만들어지는 특정 시점 복구 가능 구간, 그리고 보존 기간 밖에서도 남아 있는 수동 스냅샷의 관계 — 복구는 언제나 기존 인스턴스를 되돌리는 것이 아니라 새 인스턴스를 만드는 일입니다

자동 백업과 특정 시점 복구

자동 백업은 매일 백업 기간에 스토리지 볼륨 스냅샷을 만들고, 여기에 트랜잭션 로그를 더해 특정 시점 복구(Point-In-Time Recovery, PITR)를 가능하게 합니다. RDS 사용 설명서는 트랜잭션 로그가 5분마다 Amazon S3로 업로드된다고 명시합니다. 복구 가능한 가장 최근 시각은 LatestRestorableTime으로 확인합니다.

자동 백업의 보존 기간과 기본값
항목 값 주의
DB 인스턴스 보존 기간 0 ~ 35일 0으로 두면 자동 백업이 꺼집니다. 읽기 전용 복제본의 소스로는 0을 쓸 수 없습니다
Multi-AZ DB 클러스터 보존 기간 1 ~ 35일 클러스터에서는 0을 지정할 수 없습니다
기본 보존 기간 API·CLI로 만들면 1일, 콘솔로 만들면 7일 같은 서비스인데 만든 경로에 따라 기본값이 다릅니다
백업 기간(backup window) 지정하지 않으면 30분 창이 자동 배정 유지 관리 기간과 겹칠 수 없습니다
보존 기간 0 ↔ 0이 아닌 값 전환 중단이 발생합니다 운영 중에 무심코 바꾸면 짧은 다운타임이 생깁니다

Multi-AZ 배포에서는 백업이 대기 인스턴스 쪽에서 수행됩니다. RDS 사용 설명서는 MariaDB · MySQL · Oracle · PostgreSQL의 Multi-AZ 배포에서 프라이머리의 I/O가 백업 중에 중단되지 않는다고 서술합니다. SQL Server는 예외로, 단일 가용 영역이든 Multi-AZ든 프라이머리에서 백업을 받기 때문에 I/O가 잠시 멈춥니다. Multi-AZ는 가용성만이 아니라 백업 영향도 줄입니다.

수동 스냅샷 — 보존 기간과 무관하게 남는다

수동 스냅샷은 우리가 명시적으로 만드는 것이고, 데이터베이스를 삭제해도 남습니다. 자동 백업은 인스턴스를 지우면서 함께 사라지지만(보존 옵션을 고르지 않은 경우), 수동 스냅샷은 우리가 지우기 전까지 유지됩니다. 규정 준수 요구로 특정 시점의 데이터를 오래 보관해야 한다면 이쪽입니다.

스냅샷은 증분입니다. RDS 사용 설명서는 첫 스냅샷이 전체 데이터를 담고 이후 스냅샷은 마지막 스냅샷 이후 변경된 데이터만 저장한다고 설명합니다. 수동 스냅샷은 리전당 100개까지 보관할 수 있으며, 이 상한은 자동 백업에는 적용되지 않습니다.

복구에서 반드시 기억할 사실이 하나 있습니다. 스냅샷 복원도 PITR도 기존 인스턴스를 되돌리는 것이 아니라 새 DB 인스턴스를 만드는 작업입니다. 엔드포인트가 새로 생기므로 애플리케이션이 가리키는 주소를 바꾸거나 원래 인스턴스의 이름을 바꿔 자리를 넘겨주어야 합니다. 게다가 새 인스턴스는 기본 보안 그룹 · 기본 파라미터 그룹 · 단일 가용 영역으로 만들어지므로, 복원 후 설정을 다시 맞춰야 합니다.

스냅샷 복사와 공유

스냅샷은 다른 리전으로 복사할 수 있고 다른 계정과 공유할 수 있습니다. 두 동작의 규칙이 다릅니다.

스냅샷 복사와 공유의 규칙
동작 규칙
리전 간 복사 복사 API를 호출한 리전이 대상 리전이 됩니다. 암호화된 스냅샷을 다른 리전으로 복사하려면 대상 리전의 KMS 키를 반드시 지정해야 합니다. KMS 키는 리전에 묶여 있기 때문입니다
공유 대상 수동 스냅샷만 공유할 수 있습니다. 자동 백업은 공유 대상이 아니므로, 공유하려면 먼저 스냅샷으로 복사합니다
공유 방법 restore 속성에 허용할 계정 ID 목록을 더합니다
퍼블릭 공유 값으로 all을 주면 모든 계정이 복사·복원할 수 있게 됩니다. 개인 정보가 든 스냅샷에는 절대 쓰지 않습니다
암호화된 스냅샷의 공유 공유는 가능하지만 계정 ID를 명시하는 방식만 허용됩니다. all을 쓸 수 없습니다. 대상 계정에는 KMS 키 사용 권한도 함께 주어야 합니다
자동 백업 자체를 리전 간 복제 별도 기능이 있습니다. 스냅샷을 일일이 복사하지 않고 자동 백업을 다른 리전으로 계속 복제해 그 리전에서 PITR을 가능하게 합니다
snapshot-copy-share.sh — 스냅샷을 다른 리전으로 복사하고 다른 계정에 공유합니다 (계정 ID와 리전 코드는 예시입니다)
# 수동 스냅샷을 만듭니다.
aws rds create-db-snapshot \
  --db-instance-identifier app-prod \
  --db-snapshot-identifier app-prod-2026-07-29

# 다른 리전으로 복사합니다. 복사는 대상 리전에서 호출하고,
# 암호화된 스냅샷이면 대상 리전의 KMS 키를 반드시 지정합니다.
aws rds copy-db-snapshot \
  --region us-west-2 \
  --source-db-snapshot-identifier arn:aws:rds:ap-northeast-2:123456789012:snapshot:app-prod-2026-07-29 \
  --target-db-snapshot-identifier app-prod-2026-07-29-dr \
  --kms-key-id arn:aws:kms:us-west-2:123456789012:key/EXAMPLE-KEY-ID

# 특정 계정에만 복원 권한을 줍니다. all 은 퍼블릭 공개이므로 쓰지 않습니다.
aws rds modify-db-snapshot-attribute \
  --db-snapshot-identifier app-prod-2026-07-29 \
  --attribute-name restore \
  --values-to-add 210987654321

RDS Proxy — 연결이 폭주할 때

관계형 데이터베이스는 연결 하나마다 메모리와 CPU를 씁니다. 그런데 AWS Lambda나 컨테이너 기반 애플리케이션은 순간적으로 수백 개의 실행 환경이 동시에 살아납니다. 각자 연결을 열면 데이터베이스가 연결 수 상한에 부딪히거나 연결 생성 비용만으로 무너집니다.

RDS Proxy가 연결 폭주를 흡수하는 방식 위쪽은 프록시 없이 AWS Lambda 함수가 데이터베이스에 직접 붙는 경우입니다. Lambda 는 요청량에 따라 동시 실행 환경을 수백 개까지 늘리고 실행 환경마다 자기 연결을 엽니다. 연결 수가 DB 인스턴스의 max_connections 를 넘는 순간 새 연결이 거부되고, 한 번 거부되기 시작하면 재시도가 다시 연결을 요구하면서 상황이 더 나빠집니다. 아래쪽은 같은 Lambda 앞에 RDS Proxy 를 둔 경우입니다. 함수들은 프록시에 붙고 프록시는 미리 만들어 둔 소수의 데이터베이스 연결을 풀에 유지하며 재사용합니다. 애플리케이션 쪽 연결 수가 아무리 급증해도 데이터베이스가 실제로 보는 연결 수는 통제된 범위에 머무릅니다. 부수 효과로 장애 조치가 일어날 때 프록시가 새 인스턴스로 연결을 다시 맺어 주므로 애플리케이션이 DNS 갱신을 기다리는 시간이 줄어 전환이 빨라집니다. 같은 트래픽, 프록시가 있고 없고의 차이 프록시 없음 — 실행 환경마다 자기 연결을 엽니다 Lambda 실행 환경 Lambda 실행 환경 Lambda 실행 환경 Lambda 실행 환경 동시 실행 수백 개 연결도 수백 개 DB 인스턴스 max_connections 새 연결이 거부됩니다 RDS Proxy — 소수의 연결을 풀에 두고 돌려 씁니다 Lambda 실행 환경 Lambda 실행 환경 Lambda 실행 환경 Lambda 실행 환경 동시 실행 수백 개 RDS Proxy 연결 풀 유지 연결 재사용 연결 소수 DB 인스턴스 연결 수가 통제됩니다 부수 효과 장애 조치 시 연결 전환이 빨라집니다 "서버리스인데 DB 연결이 터진다"의 해법은 인스턴스 확대가 아닙니다 연결 수를 줄이는 계층을 사이에 넣는 것이 답이며 그것이 RDS Proxy 입니다
연결 폭주 경로와 RDS Proxy가 흡수하는 경로의 대비 — 프록시가 데이터베이스 연결 풀을 유지하며 재사용하므로 애플리케이션 연결 수가 급증해도 데이터베이스 쪽 연결 수는 통제된 범위에 머무릅니다

RDS Proxy는 데이터베이스 연결 풀을 만들어 두고 재사용합니다. RDS 사용 설명서가 정리하는 효과는 네 가지입니다.

RDS Proxy가 해결하는 문제
효과 내용
연결 풀링 연결을 매번 새로 여는 메모리·CPU 비용을 없애고, 데이터베이스가 받을 연결 수를 통제합니다
과부하 완충 즉시 처리할 수 없는 연결 요청을 대기시키거나 조절합니다. 지연은 늘 수 있지만 데이터베이스가 갑자기 쓰러지지 않습니다
장애 조치 시 복원력 대기 인스턴스로 자동으로 다시 연결하면서 애플리케이션 연결은 유지합니다. 장애 조치 체감 시간이 줄어듭니다
자격 증명 관리 자격 증명을 AWS Secrets Manager에 두고 프록시가 IAM 역할로 가져다 씁니다. IAM 데이터베이스 인증도 강제할 수 있습니다

시험에서 결정적인 문장은 이것입니다 — "대부분의 애플리케이션에서 코드 변경 없이 RDS Proxy를 활성화할 수 있다." without changing application code라는 한정어와 연결 고갈이 함께 나오면 RDS Proxy가 곧바로 유력 후보가 됩니다.

프록시는 VPC 안의 서브넷에 놓이고, 엔진 계열(MYSQL · POSTGRESQL · SQLSERVER)을 지정해 만듭니다. RequireTLS로 프록시 연결에 전송 중 암호화를 강제할 수도 있습니다.

암호화 — 생성 시점에 결정된다

RDS의 저장 시 암호화는 AWS KMS 키로 이루어지며, 켜 두면 기반 스토리지 · 자동 백업 · 읽기 전용 복제본 · 스냅샷이 모두 암호화됩니다. 복호화는 투명하게 처리되므로 클라이언트 애플리케이션을 고칠 필요가 없습니다.

가장 중요한 제약

RDS 사용 설명서는 암호화된 DB 인스턴스의 제약을 목록으로 정리해 두었고, 그 첫 줄이 시험이 노리는 지점입니다.

Amazon RDS 저장 시 암호화의 제약
제약 함의
DB 인스턴스는 생성할 때만 암호화할 수 있습니다 이미 운영 중인 평문 데이터베이스를 설정 변경만으로 암호화할 수 없습니다
암호화를 끌 수 없습니다 한 번 켜면 되돌리는 설정이 없습니다. 평문으로 되돌리려면 데이터를 내보내 새 인스턴스로 옮겨야 합니다
KMS 키를 바꿀 수 없습니다 생성 후에는 그 인스턴스가 쓰는 키가 고정됩니다. 키 정책을 미리 정해야 합니다
평문 인스턴스의 암호화된 스냅샷을 만들 수 없습니다 스냅샷은 원본의 암호화 상태를 따라갑니다
평문 백업·스냅샷을 암호화된 인스턴스로 복원할 수 없습니다 복원 경로로 암호화를 끼워 넣을 수 없습니다
암호화 상태가 다른 복제본을 만들 수 없습니다 평문 소스에 암호화된 복제본, 암호화된 소스에 평문 복제본 모두 불가입니다

그렇다면 이미 운영 중인 평문 데이터베이스는 어떻게 암호화할까요. 같은 문서가 우회 경로를 함께 알려 줍니다 — 스냅샷을 만들고, 그 스냅샷의 암호화된 사본을 만든 뒤, 그 사본으로 복원합니다. 평문 스냅샷의 복사본에는 암호화를 걸 수 있기 때문입니다.

encrypt-existing-db.sh — 평문 데이터베이스를 암호화된 데이터베이스로 옮기는 절차 (식별자와 키 ARN은 예시입니다)
# 1) 평문 인스턴스의 스냅샷을 만듭니다.
aws rds create-db-snapshot \
  --db-instance-identifier app-prod \
  --db-snapshot-identifier app-prod-plaintext

# 2) 그 스냅샷을 "암호화된 사본"으로 복사합니다. 여기서 암호화가 들어갑니다.
aws rds copy-db-snapshot \
  --source-db-snapshot-identifier app-prod-plaintext \
  --target-db-snapshot-identifier app-prod-encrypted \
  --kms-key-id arn:aws:kms:ap-northeast-2:123456789012:key/EXAMPLE-KEY-ID

# 3) 암호화된 스냅샷에서 새 인스턴스를 만듭니다. 새 엔드포인트가 생기므로
#    전환 계획(이름 교체 또는 애플리케이션 설정 변경)이 필요합니다.
aws rds restore-db-instance-from-db-snapshot \
  --db-instance-identifier app-prod-enc \
  --db-snapshot-identifier app-prod-encrypted

전송 중 암호화는 별개 계층입니다. RDS 사용 설명서는 암호화 여부와 무관하게 소스와 읽기 전용 복제본 사이의 전송 데이터는 암호화되며, 리전을 넘어 복제할 때도 그렇다고 명시합니다. 클라이언트와 데이터베이스 사이의 TLS는 엔진 설정으로 강제하거나 RDS Proxy의 RequireTLS로 강제합니다. KMS 키의 종류와 키 정책은 16장 보안·암호화·거버넌스에서 다룹니다.

유지 관리 기간과 패치 책임

RDS는 운영체제와 데이터베이스 엔진 패치를 유지 관리 기간(maintenance window)에 수행합니다. 지정하지 않으면 AWS가 리전마다 정해진 8시간 블록 안에서 임의의 요일 · 임의의 30분 창을 골라 배정합니다. 형식은 ddd:hh24:mi-ddd:hh24:mi이고 협정 세계시(UTC) 기준이며 최소 30분이어야 합니다.

규칙이 하나 더 있습니다. 유지 관리 기간과 백업 기간은 겹칠 수 없습니다. 두 창을 같은 시간대로 잡으려 하면 API가 거부합니다.

유지 관리 관련 설정과 기본 동작
설정 기본 동작 판단 기준
PreferredMaintenanceWindow 지정하지 않으면 무작위 30분 창이 배정 트래픽이 가장 적은 시간대로 UTC 기준으로 지정합니다
AutoMinorVersionUpgrade 기본 활성 — 마이너 버전은 자동 적용 보안 패치를 자동으로 받되, 예상치 못한 재시작을 피하려면 창을 잘 잡습니다
메이저 버전 업그레이드 자동으로 일어나지 않음 호환성 검증 후 우리가 시점을 정합니다
Multi-AZ에서의 패치 대기 인스턴스를 먼저 패치하고 장애 조치한 뒤 옛 프라이머리를 패치 중단 시간이 장애 조치 시간 수준으로 줄어듭니다
단일 가용 영역에서의 패치 패치 동안 데이터베이스를 사용할 수 없습니다 "패치 중에도 서비스가 이어져야 한다"는 요구는 Multi-AZ를 부릅니다

흔한 오해

시험 포인트 정리

이 장의 주제는 복원력 있는 아키텍처 설계(26%)와 고성능 아키텍처 설계(24%)에 걸쳐 있습니다.

확인 문제

이 장의 핵심을 확인하는 10문항입니다. 키보드만으로 완주할 수 있습니다 — 숫자키 1~5로 선택지를 고르고 Enter로 제출합니다.

학습용 유형 연결형과 순서 배열 문항이 섞여 있을 수 있습니다. 두 유형은 암기 확인에 효율이 좋아서 기본개념 확인 문제에만 넣었으며, 실제 SAA-C03 시험에는 출제되지 않습니다.

이어서 볼 곳

공식 문서 출처

이 장의 개념 서술과 API 동작은 모두 아래 문서에서 확인했습니다.