시리즈: AWS로 웹 서버 + DB 직접 구축하기 (VPC 완전 정복) | 7편 / 15편
지난 편에서 Nginx를 설치하고 브라우저로 웹 서버 접속까지 확인했어요. 이번 편에서는 프라이빗 서브넷에 RDS(MySQL 데이터베이스) 를 만들어볼 거예요.
RDS란?
RDS(Relational Database Service)는 AWS의 관리형 데이터베이스 서비스 예요.
MySQL, PostgreSQL, MariaDB 등 관계형 DB를 직접 EC2에 설치하고 관리하는 대신, AWS가 대신 관리해줘요.
AWS가 자동으로 해주는 것들:
- OS 패치 및 업데이트
- 정기 자동 백업
- 장애 발생 시 자동 복구
- 모니터링 및 알람
우리는 그냥 DB를 사용하는 데만 집중하면 돼요!
💡 EC2에 MySQL을 직접 설치하면 안 되나요? 물론 가능해요. 하지만 RDS를 쓰면 관리 부담이 훨씬 줄어들어요. 백업, 업데이트, 장애 복구 등을 직접 챙기지 않아도 되니까요. 비용이 조금 더 들지만 대부분의 경우 RDS가 더 나아요.
RDS를 프라이빗 서브넷에 두는 이유
DB는 절대로 인터넷에 직접 노출되면 안 돼요.
Public access: Yes 로 설정하면 인터넷에서 DB에 직접 접근할 수 있어요. 이렇게 하면 전 세계의 해커들이 3306 포트로 접속을 시도해요. 정말이에요.
그래서:
- RDS → 프라이빗 서브넷에 위치
Public access: No설정- rds-sg로 EC2에서만 접근 허용
DB 서브넷 그룹 만들기
RDS를 만들기 전에 DB 서브넷 그룹 을 먼저 만들어야 해요.
DB 서브넷 그룹은 “RDS가 위치할 수 있는 서브넷 목록” 이에요. 멀티 AZ를 지원하려면 최소 2개 AZ의 서브넷 이 포함돼야 해요.
상단 검색창에 RDS 입력 → RDS 서비스 클릭
왼쪽 사이드바에서 Subnet groups 클릭.
오른쪽 상단 주황색 Create DB subnet group 클릭!
서브넷 그룹 설정
Name : my-db-subnet-group
Description : Private subnet group for RDS
VPC : my-vpc
아래 Add subnets 섹션에서 서브넷을 추가해요.
가용 영역 선택:
Availability Zones : ap-northeast-2a, ap-northeast-2c
두 개를 선택하면 아래에 해당 AZ의 서브넷 목록이 나와요.
서브넷 선택:
✅ private-subnet-2a (10.0.3.0/24)
✅ private-subnet-2c (10.0.4.0/24)
⚠️ 반드시 private 서브넷만 선택하세요! public 서브넷을 선택하면 RDS가 퍼블릭 서브넷에 올라갈 수 있어요.
Create 클릭!
성공하면 이런 화면이 나와요.
✅ my-db-subnet-group has been created successfully.
Subnet groups 목록에 my-db-subnet-group 이 Active 상태로 나오면 완성이에요.
RDS 인스턴스 만들기
왼쪽 사이드바 상단 Databases 클릭.
오른쪽 상단 주황색 Create database 클릭!
생성 방식 선택
● Standard create ← 이걸 선택 (모든 옵션을 직접 설정)
○ Easy create
Standard create 를 선택해야 세부 설정을 직접 할 수 있어요.
엔진 선택
Engine type : MySQL
여러 DB 중에서 MySQL 을 클릭하세요.
Engine version : MySQL 8.0.x ← 기본으로 선택된 최신 버전 유지
템플릿 선택
○ Production
○ Dev/Test
● Free tier ← 이걸 선택
Free tier 를 선택하세요.
⚠️ Free tier를 선택하면 일부 옵션이 비활성화돼요. (Multi-AZ, 특정 인스턴스 유형 등) 실습용으로는 충분해요.
기본 설정 (Settings)
DB instance identifier : my-database
이게 DB 인스턴스의 이름이에요.
Master username : admin
DB 관리자 계정 이름이에요. 기본값 admin 그대로 써도 되고, 바꿔도 돼요.
Credentials management : Self managed ← 선택
Master password : [직접 입력]
Confirm password : [동일하게 입력]
⚠️ 비밀번호를 꼭 메모해두세요! 나중에 EC2에서 DB에 접속할 때 필요해요. 잊어버리면 비밀번호를 재설정해야 하는데 번거로워요.
비밀번호 규칙: 영문 대소문자, 숫자, 특수문자 포함 8자 이상
인스턴스 구성 (Instance configuration)
DB instance class : db.t3.micro ← 프리 티어
Free tier 템플릿을 선택하면 자동으로 설정돼 있을 거예요.
스토리지 (Storage)
Storage type : gp2
Allocated storage : 20 GiB
Storage autoscaling : 체크 해제 (실습용)
실습용이라 자동 스토리지 확장은 꺼도 돼요.
연결 설정 (Connectivity) — 가장 중요한 부분!
Compute resource : Don't connect to an EC2 compute resource
이 옵션은 EC2와 자동으로 연결해주는 기능인데, 여기서는 선택하지 않아도 돼요. EC2 → RDS 연결은 8편에서 직접 해볼 거거든요.
VPC : my-vpc ← 반드시 my-vpc!
DB subnet group : my-db-subnet-group
Public access : No ← 반드시 No!
⚠️ 이 설정이 제일 중요해요!
Yes로 설정하면 DB가 인터넷에 직접 노출돼요. 반드시No로 설정하세요.
VPC security group (firewall)
○ Create new
● Existing VPC security groups ← 이걸 선택
Existing VPC security groups : rds-sg ← 4편에서 만든 것
기존 보안 그룹 목록에서 rds-sg 를 선택하세요. default 는 선택에서 제거해도 돼요.
Availability Zone : ap-northeast-2a
💡 왜 2a를 선택하나요? 5편에서 만든 EC2(web-server-1)가
ap-northeast-2a에 있어요. RDS도 같은 AZ에 두면 EC2 ↔ RDS 통신이 같은 건물 안에서 이뤄져서 조금 더 빠르고, AZ 간 데이터 전송 요금도 없어요.
추가 구성 (Additional configuration)
이 섹션을 클릭해서 펼치세요.
Initial database name : mydb
💡 이 설정을 안 하면? RDS 서버는 만들어지지만 데이터베이스(스키마)는 없는 상태예요. 나중에 MySQL 접속 후 직접 만들어야 해요. 미리 설정해두면 자동으로 만들어져요.
이 아래 Backup, Monitoring 등의 섹션은 기본값 그대로 유지해요.
최종 확인
오른쪽에 예상 비용(Estimated monthly costs) 패널이 보여요.
Free tier 템플릿을 선택했다면 이렇게 표시될 거예요.
Free Tier
db.t3.micro instance : 0 USD
20 GiB storage : 0 USD
Estimated total : 0.00 USD/month
설정도 한 번 더 확인해요.
Engine : MySQL 8.0.x
Template : Free tier
DB instance identifier : my-database
Master username : admin
Instance type : db.t3.micro
Storage : 20 GiB, gp2
VPC : my-vpc
Subnet group : my-db-subnet-group
Public accessibility : No
Security groups : rds-sg
다 맞으면 주황색 Create database 클릭!
생성 확인
Databases 목록에 방금 만든 DB가 나타나요.
DB identifier : my-database
Status : Creating ← 생성 중 (5~10분 소요)
5~10분 기다리면:
Status : Available ✅
생성에 시간이 꽤 걸려요. 커피 한 잔 마시고 오세요. ☕
엔드포인트 확인하기
생성이 완료되면 my-database 를 클릭해서 상세 정보를 봐요.
Connectivity & security 탭에 이런 정보가 있어요.
Endpoint : my-database.xxxxxxxxxx.ap-northeast-2.rds.amazonaws.com
Port : 3306
이 엔드포인트 주소 가 EC2에서 DB에 접속할 때 사용하는 주소예요. 복사해서 어딘가 메모해두세요!
💡 RDS는 IP 주소가 아닌 도메인 이름(엔드포인트) 으로 접속해요. 내부적으로 IP가 바뀔 수 있어서 항상 엔드포인트를 사용해야 해요.
RDS 생성이 안 될 때 체크리스트
① Status가 Creating에서 10분 이상 안 바뀔 때
RDS 생성은 보통 5~10분이지만 상황에 따라 15분까지 걸릴 수 있어요. 조금 더 기다려보세요. 정말로 오래 걸리는 게 정상이에요.
② Status가 Failed로 바뀌었을 때
RDS 콘솔 → Databases → my-database 클릭 → Logs & events 탭
에러 메시지를 확인할 수 있어요. 대부분 다음 중 하나예요.
- DB 서브넷 그룹에 서브넷이 하나뿐 →
my-db-subnet-group이 2개 AZ를 포함하는지 확인하세요. - 보안 그룹 설정 오류 →
rds-sg가my-vpc에 속하는지 확인하세요.
③ Create database 버튼이 비활성화돼 있을 때
비밀번호 규칙이 맞지 않은 경우가 많아요.
비밀번호 규칙: 영문 대소문자 + 숫자 + 특수문자 포함, 8자 이상
예: MyPass123!
⚠️ 특수문자 중
/,@,", 공백은 사용할 수 없어요.
혹시 잘못 만들었다면?
설정이 잘못됐거나 다시 만들고 싶다면:
RDS 삭제:
Databases → my-database 선택 → Actions → Delete
Create final snapshot : 체크 해제 (실습용이라 백업 필요 없어요)
Retain automated backups : 체크 해제
delete me 를 입력하고 Delete 클릭!
⚠️ RDS 삭제는 몇 분 정도 걸려요. 삭제 중에는 Status가
Deleting으로 표시돼요.
DB 서브넷 그룹 삭제:
RDS 인스턴스가 완전히 삭제된 뒤에 서브넷 그룹을 삭제할 수 있어요.
Subnet groups → my-db-subnet-group 선택 → Delete
현재 아키텍처 상태
인터넷
↓ HTTP(80)
IGW → 퍼블릭 서브넷
└ EC2 (web-server-1) ✅ Nginx 실행 중
↓ MySQL(3306, rds-sg 통해서)
프라이빗 서브넷
└ RDS (my-database) ✅ Available
└ rds-sg 적용 (web-sg에서만 3306 허용)
└ 인터넷 직접 접근 차단 🔒
이번 편 정리
| 개념 | 설명 |
|---|---|
| RDS | AWS 관리형 관계형 데이터베이스 서비스 |
| DB 서브넷 그룹 | RDS가 위치할 서브넷 목록 (최소 2개 AZ) |
| Public access: No | 인터넷에서 DB 직접 접근 차단 |
| 엔드포인트 | EC2에서 DB 접속 시 사용하는 도메인 주소 |
이번 편에서 만든 것:
- ✅ my-db-subnet-group
- ✅ my-database (프라이빗 서브넷, rds-sg 적용, Public access: No)
다음 편 👉 8편. EC2 → RDS 연결 — 웹 서버에서 DB 접속 확인하기