62장. RDS — 관리형 관계형 DB의 구조
이 장에서 말하고자 하는 것
관계형 DB는 직접 설치해 운영할 수도 있다.
하지만 다음 일들이 따라온다.
- OS · DB 엔진 패치
- 백업 스크립트
- 장애 복구
- 디스크 확장
- 모니터링
이 부담을 AWS가 가져가는 게
Amazon RDS (Relational Database Service)
다.
이 장은 RDS의 구조와 핵심 옵션을 본다.
1. RDS가 해주는 일
- 엔진 설치 · 패치
- 자동 백업 · 스냅샷
- 장애 발생 시 자동 복구
- Multi-AZ 동기 복제
- Read Replica
- 모니터링 (CloudWatch / Performance Insights)
사용자는 “엔진 + 사양 + 설정” 만 선언한다.
2. 지원하는 엔진
PostgreSQL
MySQL
MariaDB
Oracle
SQL Server
그리고 별도로
Aurora (MySQL 호환 · PostgreSQL 호환)
가 있다. Aurora는 65장에서 따로 다룬다.
새 프로젝트라면 PostgreSQL이 사실상 기본 선택지
(확장성 · 기능 · 커뮤니티 측면에서)
3. RDS의 핵심 구성 요소
DB Instance
├─ 엔진 · 버전
├─ Instance Class (db.m6g.large 등)
├─ Storage (gp3, io2, …)
├─ Multi-AZ 여부
├─ Subnet Group (어떤 서브넷에 둘 것인가)
├─ Parameter Group (DB 설정)
├─ Option Group (엔진별 부가 기능)
└─ Security Group
4. Subnet Group — DB를 어디에 둘 것인가
RDS는 VPC 안의 프라이빗 서브넷 에 둔다.
[VPC]
├─ Public Subnet (ALB)
└─ Private Subnet (ECS, RDS)
DB Subnet Group은 “DB가 살 수 있는 서브넷 묶음” 이다.
Multi-AZ를 쓰려면 여러 AZ의 서브넷 이 들어 있어야 한다.
5. 보안 그룹 — 누가 DB에 들어올 수 있는가
DB 보안 그룹은 보통
인바운드: ECS Task의 SG에서 오는 5432(PG) 또는 3306(MySQL)
아웃바운드: (필요 시) 외부 호출
DB는 절대 인터넷에 직접 노출하지 않는다
publicly_accessible = false
6. Parameter Group — DB 설정 묶음
max_connections, shared_buffers, work_mem 같은 엔진 파라미터를 묶어 관리.
- 기본 그룹은 수정 불가
- 운영 시에는 본인 그룹을 만들어 적용
- 일부 파라미터는 재시작이 필요
7. 백업 — 두 가지가 함께 돈다
자동 백업
- 매일 한 번
backup_retention_period일수만큼 보관 (최대 35일)- 그 기간 안 어떤 시점으로도 복구 가능 (Point-in-time recovery)
수동 스냅샷
- 사람이 명시적으로 만든다
- 삭제할 때까지 보관
운영 DB는 자동 백업을 켜고, 큰 변경 직전에는 수동 스냅샷도 따로 찍는다
8. 우리 서비스에서
[VPC]
├─ Public Subnet → ALB
└─ Private Subnet
├─ ECS Service "orders"
└─ RDS PostgreSQL
- Multi-AZ
- 자동 백업 7일
- 보안 그룹: orders Task SG만 허용
서비스마다 자기 DB를 가진다.
9. 직접 확인해보기 — CLI
aws rds create-db-instance \
--db-instance-identifier orders \
--engine postgres \
--engine-version 16 \
--db-instance-class db.t4g.small \
--allocated-storage 50 \
--storage-type gp3 \
--master-username appadmin \
--manage-master-user-password \
--db-subnet-group-name private-subnets \
--vpc-security-group-ids sg-xxx \
--multi-az \
--backup-retention-period 7
aws rds describe-db-instances --db-instance-identifier orders
10. 코드로는 이렇게 생겼다 — Terraform
resource "aws_db_subnet_group" "main" {
name = "private-db"
subnet_ids = [aws_subnet.private_a.id, aws_subnet.private_b.id]
}
resource "aws_security_group" "db" {
name = "db"
vpc_id = aws_vpc.main.id
ingress {
from_port = 5432
to_port = 5432
protocol = "tcp"
security_groups = [aws_security_group.task.id]
}
}
resource "aws_db_instance" "orders" {
identifier = "orders"
engine = "postgres"
engine_version = "16"
instance_class = "db.t4g.small"
allocated_storage = 50
storage_type = "gp3"
username = "appadmin"
manage_master_user_password = true
db_subnet_group_name = aws_db_subnet_group.main.name
vpc_security_group_ids = [aws_security_group.db.id]
multi_az = true
backup_retention_period = 7
deletion_protection = true
skip_final_snapshot = false
publicly_accessible = false
}
11. 이렇게 쓰면 망한다 — 안티패턴
안티패턴 1. publicly_accessible = true
DB가 인터넷에 노출된다. 거의 항상 사고로 이어진다.
무조건 false. 접근은 Session Manager 또는 Bastion으로
안티패턴 2. deletion_protection 안 켠다
실수로 운영 DB가 한 번에 사라질 수 있다.
안티패턴 3. master 비밀번호를 평문으로 박는다
Terraform state · 저장소에 평문이 남는다.
manage_master_user_password = true → AWS Secrets Manager로 자동 관리
안티패턴 4. 백업 보관 0일
복구 자체가 불가능. 운영은 최소 7일.
12. 한 줄로 정리
RDS는 관리형 관계형 DB이며, 사양 + 네트워크 + 백업 + Multi-AZ 가 운영의 4축이다
13. 이 장의 핵심 정리
- RDS는 엔진 설치 · 패치 · 백업 · 복구를 AWS가 가져간다.
- PostgreSQL이 새 프로젝트의 기본 선택지로 무난하다.
- RDS는 프라이빗 서브넷, publicly_accessible = false.
- Multi-AZ는 다음 장에서, Read Replica는 그다음 장에서 다룬다.
- 자동 백업 + deletion_protection + 비밀번호 Secrets Manager 관리가 출발선.