
RDS (Relational Database Service)
Amazon RDS (Relational Database Service)는 AWS에서 제공하는 완전 관리형(Relational DB 관리형 서비스)다.
직접 서버를 설치, 운영하지 않고도 주요 RDBMS 엔진들을 손쉽게 운영할 수 있도록 도와주는 서비스다.
운영,백업,확장,복구 등과 같은 작업을 AWS가 자동화해주기 때문에 인프라 부담을 크게 줄일 수 있다.
RDS의 주요 특징
| 특징 | 설명 |
| 관리형 서비스 | OS 패치, DB 패치, 백업, 모니터링 등을 AWS가 자동으로 처리 |
| 자동 백업 & 스냅샷 | 매일 자동 백업, 특정 시점(Point-In-Time) 복구 지원 |
| 고가용성 (Multi-AZ) | 다른 AZ에 동기식 복제 -> 장애 시 자동 failover |
| 리드 레플리카 (Read Replica) | 읽기 전용 DB를 여러 개 두어 읽기 부하 분산 |
| 보안 | VPC, 서브넷, 보안 그룹, KMS 암호화 지원 |
| 확장성 | 인스턴스 타입 변경, 스토리지 크기 조정 가능 |
| 모니터링 | CloudWatch, Enhanced Monitoring 등 제공 |
| 권한 | IAM을 통한 데이터베이스 권한 조정 가능 |
RDS에서 지원하는 엔진 유형

RDS에서는 Amazon Aurora, MySQL, PostgreSQL, MariaDB, Oracle, Microsoft SQL Server, IBM Db2 를 지원하고 있다.
RDS 생성시 가상 서버, CPU, 메모리, 스토리지 등은 인스턴스 클래스에 따라 결정되며, VPC 네트워크를 설정해서 특정 서브넷, 보안 그룹을 통해 접근을 제어할 수 있다.
RDS는 프리티어를 12개월 동안 제공해주고 있어 학습에 대한 진입 장벽도 낮다.
RDS의 배포 옵션

RDS 생성
RDS 생성하는 건 워낙 간단하기도하고 설명이 잘되어 있는 레퍼런스도 많다. 그래서 처음 생성하면 만날 수 있는 몇몇 시행착오만 남겨두려고하는데, 먼저 db 특성에 따라 퍼블릭 액세스가 필요하다면 기본적으로 RDS는 퍼블릭 액세스 접근 허용 안함으로 되어있는 것 같으니, 만약 퍼블릭 액세스가 필요하다면 생성 시 확인을 꼭 해봐야한다.
그리고 VPC(Virtual Private Cloud)를 기존에 있는걸 사용했더라도, DB 연결을 위해 Inbound를 추가해줘야한다.

Multi-AZ 와 Read Replica
| Multi-AZ | Read Replica | |
| 목적 | 고가용성 | 확장성/성능 |
| 복제방식 | 동기 (쓰기 작업과 동시에 복제되어 데이터가 항상 일치됨을 보장) |
비동기 (약간의 시간차가 있어 데이터가 완벽히 일치하지 않을 수 있음) |
| 활성화 | Primary DB만 읽기/쓰기 가능 | Read 만 가능 |
| 백업 | 자동 백업 | 기본적으로 백업 X |
| 엔진 업데이트 | Primary 만 업데이트 | DB 별로 다른 업데이트 |
| FailOver | 자동으로 Standby로 복구 | 수동으로 처리 필요 |
Multi-AZ 다중 AZ (Multi Availability Zone)
현재 서비스 중인 RDS 데이터베이스에 문제가 생겼을 때 다른 AZ에 있는 RDB로 빠르게 대체하여 장애 복구를 지원해주는 기능이다.
기본적으로 장애 복구용 백업 목적인 Standby DB에는 접근이 불가능하며, DB의 데이터를 다른 AZ에 백업을 해두고 있다가 메인 DB에 문제가 생길 경우 즉시 DNS를 Standby DB로 연결해 메인 DB로 승격시켜 사용하도록 한다.
DNS를 통해 빠른 속도로 장애복구가 가능하다. 말그대로 백업, 복제본이기 때문에 성능과는 크게 관계가 없고, 안정성을 위한 서비스이다.
Read Replica (읽기 복제본)
DB인스턴스의 복제본을 하나 이상 생성하여 규모가 큰 애플리케이션에서 읽기 요청에 대한 트래픽 처리를 할 수 있게 지원한다.
쓰기 작업은 메인 DB에서하고 읽기 작업은 읽기 복제본에서 하면 그만큼 부하가 분산되기 때문이다. 그리고 읽기 작업이 많은 서비스라면 Read Replica를 더 여러개 만들면 그만큼 더 부하 분산을 기대할 수 있다.이 Read Replica의 복제본은 다른 AZ에 있을수도 있고, 다른 리전에 둘수도 있으며, Read Replica는 총 5개까지 생성이 가능하다. 생성시 replica는 원본보다 성능을 더 좋게 설정할수 있다.
서비스 규모와 트래픽에 따라 읽기 트래픽을 분산하거나, 장애 대비용, 멀티 리전 서비스 등을 위해 여러개 생성할 수 있는 것이다.
그리고 Multi-AZ와 달리 각각의 복제본마다 DNS가 부여되어 접근이 가능하다.
다만 Multi-AZ 처럼 자동 복구가 되진 않으므로 메인 DB가 장애가 발생하면 직접 수동으로 DNS를 복제본에 연결해 복구시켜야 한다.
RDS의 Read Replica 복제는 실시간으로 이루어지지만, 비동기적이므로 완전한 동기화는 아니며, 지연이 있을 수 있는데, 이 지연 시간은 보통 수초에서 수십 초 정도이다.
생성과정
- 복제본 생성시 RDS 원본 DB의 스냅샷을 생성해 복제 시작
- (스냅샷 생성 중 원본에서 짧은 I/O가 발생해서 서비스에 차질이 생길수도 있다고 함, Multi-AZ를 사용중이면 복제본 생성시 원본을 보조 인스턴스로 지정하면 됨)
파라미터 그룹
생성한 RDS의 전반적인 환경 설정(character-set이나 time-zone 등)은 파라미터 그룹을 생성해줘야한다.
AWS에서 관리하는 RDS 인스턴스에 직접 접속해서 환경을 설정할 수 없기에 파라미터 그룹을 통해 환경 설정을 해야한다.
생성된 RDS 데이터베이스의 엔진과 동일하게 생성해주면 된다.

편집에 들어가서 기본적으로 time_zone, collation(utf8mb4_general_ci), character_set_관련(utf8mb4) 로 수정해주었다.
그리고 적용할 RDS의 옵션 중 수정에 들어가 데이터베이스 옵션 -> DB 파라미터 그룹에서 방금 생성한 그룹으로 변경해주면 적용이 된다.
SnapShot
RDS에서 스냅샷(Snapshot) 은 데이터베이스 인스턴스의 현재 상태를 그대로 복제해 보관하는 백업 이미지이다.
- 수동 스냅샷 (Manual Snapshot)
- 사용자가 직접 생성
- 삭제 전까지 계속 보관됨 (자동 삭제 안 됨)
- 장기 보관용, 특정 시점 백업용으로 적합
- 자동 스냅샷 (Automated Backup)
- RDS 백업 설정 시 자동 생성
- 보존 기간(1~35일) 동안만 유지
- 보존 기간이 지나면 자동 삭제
데이터 복구를 위해 해당 시점으로 DB를 복원하기위해 생성해두거나, 환경 복제를 위해 생성하거나, 리전 간 이전 또는 마이그레이션을 위해 생성하는 경우가 많다. 처음 생성된 스냅샷은 S3에 비공개로 저장되고, 이후 스냅샷은 변경된 블록만 저장되는 방식이다.
서비스에서 사용하기
이제 RDS와 읽기 전용인 Replica를 생성했는데, NestJs 기준으로 어떻게 구분해서 사용할지 예제를 통해 알아보자
기본적으로 POST 요청은 메인 DB로, GET 요청은 Replica DB로 연결하도록 구분하는 것이 기본 컨셉이다.
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { MyService } from './my.service';
@Module({
imports: [
TypeOrmModule.forRoot({
name: 'master', // 메인 DB 연결 설정
type: 'mysql',
host: MAIN_RDS_HOST,
port: MAIN_RDS_PORT,
username: MAIN_RDS_USERNAME,
password: MAIN_RDS_PASSWORD,
database: MAIN_RDS_DB,
entities: [YourEntity],
synchronize: true,
}),
TypeOrmModule.forRoot({
name: 'replica', // Read Replica 연결 설정
type: 'mysql',
host: REPLICA_RDS_HOST,
port: REPLICA_RDS_PORT,
username: REPLICA_RDS_USERNAME,
password: REPLICA_RDS_PASSWORD,
database: REPLICA_RDS_DB,
entities: [YourEntity],
synchronize: true,
replication: {
master: {
host: MAIN_RDS_HOST,
port: MAIN_RDS_PORT,
username: MAIN_RDS_USERNAME,
password: 'your-password',
database: 'your-database',
},
slaves: [
{
host: REPLICA_RDS_HOST,
port: REPLICA_RDS_PORT,
username: REPLICA_RDS_USERNAME,
password: 'your-password',
database: 'your-database',
},
],
},
}),
],
providers: [MyService],
})
export class AppModule {}
app.module에서 메인 DB, Replica DB에 대한 연결을 명시해준다.
이때 replication 설정은 주로 읽기/쓰기 분리를 설정할 때 사용되는데, 이 설정은 Master DB와 Replica DB 간의 복제 및 역할을 정의하는 데 사용되며, Replica DB 연결에만 해당 설정을 넣어준다. MasterDB는 쓰기 전용이라 replication 설정이 필요하지 않고, Replica DB는 읽기 전용으로써 읽기/쓰기 분리를 처리할 수 있게 설정을 해준 것이다.
// tests.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { TestService } from './test.service';
@Module({
imports: [
TypeOrmModule.forFeature([User], 'master'),
TypeOrmModule.forFeature([User], 'replica'),
],
providers: [TestService],
exports: [TestService],
})
export class UsersModule {}
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { MyEntity } from './entities/my.entity';
@Injectable()
export class TestService {
constructor(
// Master DB에서 쓰기 작업을 위한 Repository
@InjectRepository(MyEntity, 'master') // 'master'는 DB 연결 이름
private masterRepository: Repository<MyEntity>,
// Read Replica DB에서 읽기 작업을 위한 Repository
@InjectRepository(MyEntity, 'replica') // 'replica'는 DB 연결 이름
private replicaRepository: Repository<MyEntity>,
) {}
// GET 요청: 읽기 작업은 Read Replica DB 사용
async getAllData(): Promise<MyEntity[]> {
return this.replicaRepository.find(); // Read Replica DB에서 데이터 읽기
}
// POST 요청: 쓰기 작업은 Master DB 사용
async createData(data: MyEntity): Promise<MyEntity> {
return this.masterRepository.save(data); // Master DB에 데이터 저장
}
}
이렇게 NestJS에서는 데이터베이스 연결을 AppModule에서 한 번만 설정해두고, 각 기능 모듈에서 필요한 엔티티와 연결 정보만 가져와서 의존성 주입만해주면 바로 사용할수 있다.
AWS EBS (Elastic Block Store)
Amazone EC2 인스턴스에 사용할 영구 블록 스토리지 볼륨이다.
EBS는 네트워크로 별개로 연결되어 EC2 인스턴스가 종료되어도 별개로 작동한다.
'AWS' 카테고리의 다른 글
| [AWS] 네트워크 Cheet Sheet (0) | 2026.03.19 |
|---|