phonebill/develop/database/plan/db-plan-auth-prod.md
2025-09-09 01:12:14 +09:00

657 lines
19 KiB
Markdown

# Auth 서비스 데이터베이스 설치 계획서 - 운영환경
## 1. 계획 개요
### 1.1 설치 목적
- **서비스**: Auth 서비스 (사용자 인증/인가)
- **데이터베이스**: `phonebill_auth`
- **환경**: 운영환경 (Production)
- **플랫폼**: Azure Database for PostgreSQL Flexible Server
### 1.2 설치 범위
- Azure Database for PostgreSQL Flexible Server 인스턴스 생성
- Auth 서비스 전용 데이터베이스 및 스키마 구성
- 고가용성 및 보안 설정 구성
- 백업 및 모니터링 설정
### 1.3 참조 문서
- **물리아키텍처**: `design/backend/physical/physical-architecture-prod.md`
- **데이터설계서**: `design/backend/database/auth.md`
- **스키마파일**: `design/backend/database/auth-schema.psql`
- **백킹서비스가이드**: `claude/backing-service-method.md`
## 2. 인프라 요구사항
### 2.1 Azure Database for PostgreSQL Flexible Server 구성
#### 2.1.1 기본 설정
| 구성 항목 | 설정 값 | 비고 |
|----------|---------|------|
| **리소스 그룹** | rg-phonebill-prod | 운영환경 전용 |
| **서버 이름** | phonebill-auth-postgresql-prod | DNS: `{서버이름}.postgres.database.azure.com` |
| **지역** | Korea Central | 주 데이터센터 |
| **PostgreSQL 버전** | 15 | 최신 안정 버전 |
| **컴퓨팅 + 스토리지** | GeneralPurpose | 범용 워크로드 |
#### 2.1.2 컴퓨팅 리소스
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| **SKU** | Standard_D4s_v3 | 4 vCPU, 16GB RAM |
| **스토리지 크기** | 256GB | Premium SSD |
| **스토리지 자동 증가** | 활성화 | 최대 2TB까지 자동 확장 |
| **IOPS** | 3000 | Provisioned IOPS |
| **처리량** | 125 MBps | 스토리지 처리량 |
### 2.2 네트워크 구성
#### 2.2.1 네트워크 설정
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| **연결 방법** | Private access (VNet Integration) | VNet 통합 |
| **가상 네트워크** | phonebill-vnet-prod | 운영환경 VNet |
| **서브넷** | database-subnet (10.0.2.0/24) | 데이터베이스 전용 서브넷 |
| **Private DNS Zone** | privatelink.postgres.database.azure.com | 내부 DNS 해석 |
#### 2.2.2 방화벽 및 보안
```yaml
방화벽_규칙:
- 규칙명: "AllowAKSSubnet"
시작IP: "10.0.1.0"
종료IP: "10.0.1.255"
설명: "AKS Application Subnet 접근 허용"
- 규칙명: "DenyAllOthers"
기본정책: "DENY"
설명: "기본적으로 모든 외부 접근 차단"
Private_Endpoint:
활성화: true
서브넷: database-subnet
보안: "VNet 내부 접근만 허용"
```
## 3. 고가용성 구성
### 3.1 Zone Redundant 고가용성
#### 3.1.1 고가용성 설정
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| **고가용성 모드** | Zone Redundant | 가용영역 간 중복화 |
| **Primary Zone** | Zone 1 | 기본 가용영역 |
| **Standby Zone** | Zone 2 | 대기 가용영역 |
| **자동 장애조치** | 활성화 | 60초 이내 자동 전환 |
| **Standby 서버** | 동일 사양 | Primary와 동일한 리소스 |
#### 3.1.2 고가용성 아키텍처
```
┌─────────────────────┐ ┌─────────────────────┐
│ Korea Central │ │ Korea Central │
│ Zone 1 │ │ Zone 2 │
├─────────────────────┤ ├─────────────────────┤
│ Primary Server │◄──►│ Standby Server │
│ - Active/Read │ │ - Standby/Write │
│ - Write Traffic │ │ - Auto Failover │
│ - Read Traffic │ │ - Sync Replication │
└─────────────────────┘ └─────────────────────┘
│ │
└─────────┬─────────────────┘
┌─────────────▼─────────────┐
│ Application Layer │
│ - Automatic Failover │
│ - Connection Retry │
│ - Circuit Breaker │
└───────────────────────────┘
```
### 3.2 읽기 복제본
#### 3.2.1 읽기 전용 복제본 구성
```yaml
읽기_복제본_1:
위치: "Korea South" # 지역적 분산
목적: "재해복구 + 읽기 부하 분산"
사양: "Standard_D2s_v3" # Primary보다 낮은 사양
스토리지: "128GB"
읽기_복제본_2:
위치: "Korea Central" # 동일 리전
목적: "읽기 부하 분산"
사양: "Standard_D2s_v3"
스토리지: "128GB"
복제_설정:
복제_지연: "< 5초"
복제_방식: "비동기 복제"
사용_용도:
- 조회_쿼리_부하_분산
- 리포팅_및_분석
- 백업_작업_오프로드
```
## 4. 보안 설계
### 4.1 인증 및 권한 관리
#### 4.1.1 관리자 계정
| 계정 유형 | 계정명 | 권한 | 용도 |
|----------|--------|------|------|
| **서버 관리자** | `phonebill_admin` | SUPERUSER | 서버 관리, 스키마 생성 |
| **애플리케이션 계정** | `phonebill_auth_user` | DB/TABLE 권한 | Auth 서비스 연결 |
| **모니터링 계정** | `phonebill_monitor` | 읽기 전용 | 모니터링, 백업 |
#### 4.1.2 보안 구성
```yaml
보안_설정:
암호_정책:
최소_길이: 16자
복잡성: "대소문자+숫자+특수문자"
주기적_변경: "90일"
연결_보안:
SSL_필수: true
TLS_버전: "1.2 이상"
암호화_방식: "AES-256"
접근_제어:
Private_Endpoint: "필수"
방화벽_규칙: "최소 권한 원칙"
연결_제한: "최대 100개 동시 연결"
Azure_AD_통합:
활성화: true
관리자_계정: "phonebill-db-admins@company.com"
MFA_필수: true
조건부_접근: "회사 네트워크만"
```
### 4.2 데이터 보호
#### 4.2.1 암호화
```yaml
미사용_데이터_암호화:
방식: "Microsoft 관리 키"
알고리즘: "AES-256"
범위: "전체 데이터베이스"
전송_중_암호화:
SSL/TLS: "필수"
인증서: "Azure 제공"
프로토콜: "TLS 1.2+"
애플리케이션_레벨_암호화:
비밀번호: "BCrypt + Salt"
민감정보: "필요시 컬럼 레벨 암호화"
토큰: "JWT with RSA-256"
```
## 5. 백업 및 복구
### 5.1 자동 백업 설정
#### 5.1.1 백업 구성
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| **백업 보존 기간** | 35일 | 법규 준수 + 운영 요구사항 |
| **백업 주기** | 매일 자동 | 시스템 자동 실행 |
| **백업 시간** | 02:00 KST | 트래픽 최소 시간대 |
| **백업 압축** | 활성화 | 스토리지 비용 절약 |
| **지리적 중복** | 활성화 | Korea South 지역 복제 |
#### 5.1.2 Point-in-Time Recovery (PITR)
```yaml
PITR_설정:
활성화: true
복구_범위: "35일 이내 5분 단위"
로그_백업: "5분 간격"
복구_시간: "일반적으로 15-30분"
백업_전략:
전체_백업: "주간 (일요일)"
차등_백업: "일간"
로그_백업: "5분 간격"
복구_목표:
RTO: "30분" # Recovery Time Objective
RPO: "5분" # Recovery Point Objective
```
### 5.2 재해복구 전략
#### 5.2.1 재해복구 시나리오
```yaml
장애_시나리오:
Primary_Zone_장애:
복구_방법: "자동 Standby Zone 전환"
예상_시간: "60초 이내"
데이터_손실: "없음 (동기 복제)"
전체_리전_장애:
복구_방법: "Korea South 읽기 복제본 승격"
예상_시간: "15-30분"
데이터_손실: "최대 5초 (비동기 복제)"
데이터_손상:
복구_방법: "PITR을 통한 특정 시점 복구"
예상_시간: "15-60분"
데이터_손실: "최대 5분"
복구_절차:
1단계: "장애 감지 및 알림"
2단계: "자동/수동 장애조치 실행"
3단계: "애플리케이션 연결 재설정"
4단계: "서비스 정상화 확인"
5단계: "사후 분석 및 개선"
```
## 6. 성능 최적화
### 6.1 Connection Pool 설정
#### 6.1.1 연결 관리
```yaml
연결_설정:
최대_연결수: 100
예약_연결수: 10 # 관리용
애플리케이션_연결: 90
HikariCP_설정:
maximum_pool_size: 20
minimum_idle: 5
connection_timeout: 30000 # 30초
idle_timeout: 600000 # 10분
max_lifetime: 1800000 # 30분
validation_query: "SELECT 1"
```
### 6.2 성능 모니터링
#### 6.2.1 주요 메트릭
```yaml
모니터링_지표:
성능_메트릭:
- CPU_사용률: "< 80%"
- 메모리_사용률: "< 85%"
- 디스크_IOPS: "< 2500"
- 연결_수: "< 80개"
쿼리_성능:
- 평균_응답시간: "< 100ms"
- 슬로우_쿼리: "< 5개/시간"
- 데드락: "0건"
- 대기_시간: "< 50ms"
가용성_지표:
- 서버_가동률: "> 99.9%"
- 장애조치_시간: "< 60초"
- 백업_성공률: "100%"
```
## 7. 데이터베이스 구성
### 7.1 데이터베이스 및 사용자 생성
#### 7.1.1 데이터베이스 생성
```sql
-- 관리자 계정으로 실행
CREATE DATABASE phonebill_auth
WITH ENCODING 'UTF8'
LC_COLLATE = 'ko_KR.UTF-8'
LC_CTYPE = 'ko_KR.UTF-8'
TIMEZONE = 'Asia/Seoul';
```
#### 7.1.2 애플리케이션 사용자 생성
```sql
-- 애플리케이션 전용 사용자 생성
CREATE USER phonebill_auth_user WITH
PASSWORD 'Auth$ervice2025!Prod'
CONNECTION LIMIT 50;
-- 데이터베이스 접근 권한 부여
GRANT CONNECT ON DATABASE phonebill_auth TO phonebill_auth_user;
GRANT USAGE ON SCHEMA public TO phonebill_auth_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO phonebill_auth_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO phonebill_auth_user;
-- 향후 생성될 테이블에 대한 권한 자동 부여
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO phonebill_auth_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE, SELECT ON SEQUENCES TO phonebill_auth_user;
```
### 7.2 스키마 적용 계획
#### 7.2.1 스키마 파일 실행 순서
```bash
# 1. 데이터베이스 연결 및 확장 설치
psql -h phonebill-auth-postgresql-prod.postgres.database.azure.com \
-U phonebill_admin \
-d phonebill_auth \
-f design/backend/database/auth-schema.psql
# 2. 스키마 생성 확인
psql -h phonebill-auth-postgresql-prod.postgres.database.azure.com \
-U phonebill_admin \
-d phonebill_auth \
-c "\dt"
# 3. 초기 데이터 확인
psql -h phonebill-auth-postgresql-prod.postgres.database.azure.com \
-U phonebill_admin \
-d phonebill_auth \
-c "SELECT COUNT(*) as service_count FROM auth_services;"
```
## 8. 모니터링 및 알림
### 8.1 Azure Monitor 통합
#### 8.1.1 메트릭 수집
```yaml
Azure_Monitor_설정:
메트릭_수집:
- 서버_성능_메트릭
- 데이터베이스_성능_메트릭
- 연결_메트릭
- 스토리지_메트릭
로그_수집:
- PostgreSQL_로그
- 슬로우_쿼리_로그
- 감사_로그
- 오류_로그
진단_설정:
로그_분석_작업영역: "law-phonebill-prod"
메트릭_보존기간: "90일"
로그_보존기간: "30일"
```
### 8.2 알림 설정
#### 8.2.2 Critical 알림
```yaml
Critical_알림:
서버_다운:
메트릭: "서버 가용성"
임계값: "< 100%"
지속시간: "1분"
알림채널: "Teams + Email + SMS"
CPU_과부하:
메트릭: "CPU 사용률"
임계값: "> 90%"
지속시간: "5분"
알림채널: "Teams + Email"
메모리_부족:
메트릭: "메모리 사용률"
임계값: "> 95%"
지속시간: "3분"
알림채널: "Teams + Email"
연결_한계:
메트릭: "활성 연결 수"
임계값: "> 85개"
지속시간: "2분"
알림채널: "Teams"
Warning_알림:
성능_저하:
메트릭: "평균 응답시간"
임계값: "> 200ms"
지속시간: "10분"
알림채널: "Teams"
스토리지_사용량:
메트릭: "스토리지 사용률"
임계값: "> 80%"
지속시간: "30분"
알림채널: "Teams"
```
## 9. 설치 작업 계획
### 9.1 설치 단계
#### 9.1.1 사전 준비 작업
```yaml
사전_준비:
- [ ] Azure 구독 및 리소스 그룹 확인
- [ ] VNet 및 서브넷 구성 확인
- [ ] 네트워크 보안 그룹(NSG) 규칙 확인
- [ ] Private DNS Zone 설정 확인
- [ ] 관리자 계정 권한 확인
필요_권한:
- Contributor (PostgreSQL 인스턴스 생성)
- Network Contributor (VNet 통합)
- DNS Zone Contributor (Private DNS 설정)
```
#### 9.1.2 설치 작업 단계
```yaml
1단계_인프라_구성:
- [ ] Azure Database for PostgreSQL Flexible Server 생성
- [ ] Zone Redundant 고가용성 설정
- [ ] VNet 통합 및 Private Endpoint 구성
- [ ] 방화벽 규칙 설정
- [ ] 예상소요시간: 30분
2단계_보안_설정:
- [ ] 관리자 및 애플리케이션 계정 생성
- [ ] Azure AD 통합 설정
- [ ] SSL/TLS 인증서 구성
- [ ] 접근 권한 설정
- [ ] 예상소요시간: 20분
3단계_고가용성_구성:
- [ ] 읽기 전용 복제본 생성 (Korea South)
- [ ] 읽기 전용 복제본 생성 (Korea Central)
- [ ] 장애조치 테스트 실행
- [ ] 예상소요시간: 45분
4단계_데이터베이스_설정:
- [ ] phonebill_auth 데이터베이스 생성
- [ ] 스키마 파일 (auth-schema.psql) 실행
- [ ] 초기 데이터 생성 확인
- [ ] 애플리케이션 계정 권한 테스트
- [ ] 예상소요시간: 15분
5단계_모니터링_설정:
- [ ] Azure Monitor 진단 설정
- [ ] 메트릭 및 로그 수집 활성화
- [ ] 알림 규칙 생성
- [ ] 대시보드 구성
- [ ] 예상소요시간: 30분
6단계_검증_및_테스트:
- [ ] 애플리케이션 연결 테스트
- [ ] 성능 벤치마크 실행
- [ ] 장애조치 시나리오 테스트
- [ ] 백업/복구 테스트
- [ ] 예상소요시간: 60분
총_예상소요시간: "3시간 20분"
```
### 9.2 롤백 계획
#### 9.2.1 롤백 시나리오
```yaml
롤백_트리거:
- 인스턴스_생성_실패
- 네트워크_연결_불가
- 성능_기준_미달성
- 보안_검증_실패
롤백_절차:
1단계: "진행중인 작업 중단"
2단계: "생성된 Azure 리소스 삭제"
3단계: "VNet/DNS 설정 원복"
4단계: "사용자/권한 정리"
5단계: "문제점_분석_및_재설치_계획_수립"
데이터_보호:
- 기존_데이터_백업_확인
- 스키마_파일_보관
- 설정_정보_문서화
```
## 10. 운영 이관
### 10.1 인수인계 체크리스트
#### 10.1.1 기술 문서 이관
```yaml
문서_이관:
- [ ] 데이터베이스 접속 정보 (암호화하여 전달)
- [ ] 스키마 구조 및 ERD 다이어그램
- [ ] 백업/복구 절차서
- [ ] 성능 튜닝 가이드
- [ ] 장애 대응 매뉴얼
- [ ] 모니터링 대시보드 접근 권한
운영_정보:
- [ ] 정기 점검 일정
- [ ] 패치 적용 정책
- [ ] 용량 관리 계획
- [ ] 비용 모니터링 정보
```
### 10.2 운영 관리 방안
#### 10.2.1 일상 운영 작업
```yaml
일일_점검:
- 서버 상태 확인
- 성능 메트릭 모니터링
- 백업 상태 확인
- 보안 알림 검토
주간_점검:
- 성능 분석 리포트 검토
- 용량 사용량 분석
- 슬로우 쿼리 분석
- 보안 패치 확인
월간_점검:
- 용량 계획 검토
- 비용 분석
- 성능 최적화 검토
- 재해복구 테스트
```
## 11. 비용 분석
### 11.1 운영 비용 추정
#### 11.1.1 월간 비용 분석 (USD)
| 구성요소 | 사양 | 예상 비용 | 비고 |
|----------|------|-----------|------|
| **Primary Server** | Standard_D4s_v3 | $280 | 4 vCPU, 16GB RAM |
| **Standby Server** | Standard_D4s_v3 | $280 | Zone Redundant |
| **스토리지** | 256GB Premium SSD | $40 | IOPS 포함 |
| **읽기 복제본 (Korea South)** | Standard_D2s_v3 | $140 | 2 vCPU, 8GB RAM |
| **읽기 복제본 (Korea Central)** | Standard_D2s_v3 | $140 | 2 vCPU, 8GB RAM |
| **백업 스토리지** | 35일 보존 | $20 | 압축 적용 |
| **네트워크** | VNet 통합 | $15 | Private Link |
| **모니터링** | Azure Monitor | $10 | 로그 및 메트릭 |
| **총합** | | **$925** | |
#### 11.1.2 비용 최적화 방안
```yaml
단기_최적화:
- Reserved_Instance: "1년 약정시 30% 절약"
- 읽기_복제본_스케일링: "사용량 기반 조정"
- 백업_정책_조정: "보존기간 최적화"
중장기_최적화:
- 성능_기반_사이징: "실제 사용량 분석 후 조정"
- 읽기_복제본_지역_최적화: "트래픽 패턴 분석"
- 아카이빙_정책: "오래된 데이터 별도 보관"
```
## 12. 위험 관리
### 12.1 위험 요소 및 대응 방안
#### 12.1.1 기술적 위험
| 위험 요소 | 발생 확률 | 영향도 | 대응 방안 |
|----------|----------|-------|-----------|
| **네트워크 연결 실패** | 중간 | 높음 | Private Link 다중화, 연결 재시도 로직 |
| **성능 저하** | 낮음 | 중간 | 읽기 복제본 활용, 쿼리 최적화 |
| **데이터 손실** | 낮음 | 매우 높음 | Zone Redundant HA, PITR 백업 |
| **보안 침해** | 낮음 | 높음 | Private Endpoint, Azure AD 통합 |
#### 12.1.2 운영적 위험
```yaml
운영_위험:
설치_지연:
원인: "네트워크 설정 복잡성"
대응: "사전 테스트 환경에서 검증"
비용_초과:
원인: "리소스 오버 프로비저닝"
대응: "단계적 확장, 비용 모니터링"
성능_미달:
원인: "부하 패턴 예측 오차"
대응: "성능 테스트, 단계적 최적화"
```
## 13. 성공 기준
### 13.1 설치 완료 기준
#### 13.1.1 기술적 기준
```yaml
완료_기준:
가용성:
- [ ] Zone Redundant 고가용성 정상 작동
- [ ] 자동 장애조치 60초 이내 완료
- [ ] 읽기 복제본 정상 동기화
성능:
- [ ] 평균 응답시간 < 100ms
- [ ] 동시 연결 수 100개 지원
- [ ] TPS 500 이상 처리
보안:
- [ ] Private Endpoint 연결만 허용
- [ ] SSL/TLS 암호화 적용
- [ ] 애플리케이션 계정 최소 권한 적용
백업:
- [ ] 자동 백업 정상 실행
- [ ] PITR 복구 테스트 성공
- [ ] 지리적 복제 정상 작동
```
## 14. 설치 일정
### 14.1 작업 일정표
| 일정 | 작업 내용 | 담당자 | 소요 시간 |
|------|-----------|--------|-----------|
| **D-Day** | 사전 준비 및 인프라 구성 | 데옵스 (최운영) | 1시간 |
| **D-Day** | 보안 설정 및 고가용성 구성 | 백엔더 (이개발) | 1시간 |
| **D-Day** | 데이터베이스 및 스키마 설정 | 백엔더 (이개발) | 30분 |
| **D-Day** | 모니터링 및 알림 설정 | 데옵스 (최운영) | 30분 |
| **D+1** | 애플리케이션 연결 테스트 | 백엔더 (이개발) | 1시간 |
| **D+1** | 성능 및 장애조치 테스트 | QA매니저 (정테스트) | 2시간 |
| **D+2** | 최종 검증 및 운영 이관 | 전체 팀 | 1시간 |
---
**계획서 작성일**: 2025-01-08
**작성자**: 데옵스 (최운영)
**검토자**: 백엔더 (이개발), QA매니저 (정테스트)
**승인자**: 아키텍트 (김기획)
---
> **참고**: 이 계획서는 설치 전 최종 검토가 필요하며, 실제 환경에 따라 일부 설정값이 조정될 수 있습니다.