Skip to content

feat: S3 기반 MySQL 백업 및 모니터링 파이프라인 구성 #66

Description

@Hexeong

목표

Prod DB의 전체 dump와 binlog를 S3에 보관하여 목표 RPO 5분을 만족하는 백업 파이프라인을 구성합니다.

권한 관리 원칙

  • 백업에 필요한 IAM Role, IAM Policy, IAM User와 권한 연결은 AWS에서 수동으로 구성합니다.
  • Terraform 코드에는 IAM 권한 정의와 연결 정보를 선언하지 않습니다.
  • Terraform에서는 수동으로 생성된 Instance Profile이나 역할의 이름 등 필요한 식별자만 변수로 전달해 참조합니다.
  • 구체적인 권한 내용은 저장소 이슈와 코드에 노출하지 않고 별도 운영 문서에서 관리합니다.

백업 구성 배포 구조

백업 스크립트와 systemd 설정은 DB EC2에 SSM Endpoint를 추가하지 않고 다음 경로로 배포합니다.

GitHub Actions
├─ 일회용 SSH 키 생성
├─ EC2 Instance Connect로 공개 키를 DB 메타데이터에 등록
├─ API EC2를 대상으로 SSM 포트 포워딩 시작
└─ SSH 터널을 통해 DB EC2에서 설치 스크립트 실행

API EC2
└─ TCP 터널 역할만 수행

DB EC2
├─ 공개 키는 60초 후 자동 만료
└─ systemd가 mysqldump/binlog 백업을 독립 실행
  • GitHub Actions Runner에만 일회용 SSH 개인 키를 생성하고 작업 종료 시 삭제합니다.
  • API EC2에는 SSH 개인 키와 AWS CLI를 추가하지 않으며 DB EC2까지의 TCP 터널만 제공합니다.
  • DB EC2의 SSH Host Key를 고정하여 접속 대상을 검증합니다.
  • DB EC2의 22번 포트는 API EC2 Security Group에서만 접근할 수 있도록 제한합니다.

작업 내용

  • GitHub Actions에서 일회용 SSH 키, EC2 Instance Connect, API EC2 SSM 포트 포워딩을 이용해 DB EC2에 백업 구성을 배포합니다.
  • 백업 전용 S3 버킷 또는 prefix를 Terraform으로 구성합니다.
  • S3 접근에 필요한 최소 권한 IAM Role·Policy와 EC2 권한 연결을 AWS에서 수동으로 구성합니다.
  • S3 암호화, Versioning, Object Lock 적용 여부와 2주 보관 Lifecycle을 구성합니다.
  • MySQL binlog 설정과 전체 dump 기준점(position 또는 GTID) 기록 방식을 구성합니다.
  • 일 1회 mysqldump, 압축, 체크섬, manifest 생성 및 S3 업로드 스크립트를 작성합니다.
  • binlog 생성부터 S3 업로드 완료까지 5분 이내가 되도록 아카이빙 스크립트와 systemd service/timer를 구성합니다.
  • 실패 재시도와 중복 실행에 대한 멱등성을 보장합니다.
  • mysqldump 실패, binlog 누락, 마지막 업로드 지연 시 Discord Webhook 알림을 전송합니다.
  • EC2 자체 장애처럼 내부 알림을 보낼 수 없는 경우를 감지할 외부 freshness 모니터링을 구성합니다.

완료 조건

  • 전체 dump와 binlog가 자동으로 S3에 저장됩니다.
  • dump와 binlog의 복구 기준점 및 체크섬을 확인할 수 있습니다.
  • 마지막 성공 binlog 업로드가 5분을 넘기거나 파일이 누락되면 알림이 발생합니다.
  • 백업 파일 보관 및 삭제가 S3 Lifecycle에 의해 관리됩니다.
  • IAM 역할·정책·사용자 권한이 Terraform 코드에 포함되지 않고 수동으로 관리됩니다.
  • DB EC2에 SSM Endpoint나 장기 SSH 개인 키를 두지 않고 백업 구성을 배포할 수 있습니다.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions