Multi-Region Infrastructure Architecture
개요
DTA-WI 프로젝트는 글로벌 사용자를 위한 Multi-Region Multi-Project 아키텍처를 사용합니다. 이 구조는 지역별 성능 최적화, 규제 준수, 그리고 데이터 주권을 고려하여 설계되었습니다.
아키텍처 구조
핵심 설계 원칙
- Region별 독립성: 각 지역이 독립적으로 운영 가능
- Project 분리: 지역별 다른 GCP 프로젝트 사용
- 중앙화된 설정: 공통 설정의 중앙 관리
- 확장성: 새로운 지역 추가 용이성
전체 아키텍처 다이어그램
🗂️ Terragrunt 디렉토리 구조
infrastructure/terragrunt/
├── shared/ # 🔗 공통 설정
│ ├── common.hcl # 조직 정보, APIs, 라벨
│ └── regions.hcl # 지역별 기본 설정
├── [environment]/ # 환경별 설정 (dev/stage/prod)
│ ├── env.hcl # 환경별 프로젝트 매핑
│ ├── global/ # 🌍 Global 서비스
│ │ ├── apis/ # GCP APIs 활성화
│ │ ├── iam/ # Identity & Access Management
│ │ ├── firebase/ # Firebase 설정
│ │ ├── bigquery/ # Global 분석 서비스
│ │ ├── pubsub/ # 메시징 시스템
│ │ └── secret_manager/ # 시크릿 관리
│ └── regions/ # 🗺️ Regional 서비스
│ ├── europe-west3/ # EU Region
│ │ ├── region.hcl # 지역별 설정
│ │ ├── cloudsql/ # 데이터베이스
│ │ ├── memorystore/ # Redis 캐시
│ │ ├── network/ # 네트워킹
│ │ ├── cloud-scheduler/ # 스케줄러
│ │ └── vpc-connector/ # VPC 연결
│ └── asia-northeast3/ # Asia Region (동일 구조)
│ └── ... (동일한 서비스들)
🎯 Project & Region 매핑
Environment별 프로젝트 구성
| Environment | European Region | Asian Region |
|---|---|---|
| Dev | dta-cloud-de-dev @ europe-west3 | dta-cloud-dev @ asia-northeast3 |
| Stage | dta-cloud-de-stage @ europe-west3 | dta-cloud-stage @ asia-northeast3 |
| Prod | dta-cloud-de-prod @ europe-west3 | dta-cloud-prod @ asia-northeast3 |
지역별 특성
🇪🇺 Europe Region (europe-west3)
- 위치: Frankfurt, Germany
- Timezone: Europe/Berlin
- 데이터 주권: EU GDPR 준수
- 주요 사용자: 독일, 유럽 사용자
- 지연시간: ~5-10ms (유럽 사용자 기준)
🇰🇷 Asia Region (asia-northeast3)
- 위치: Seoul, South Korea
- Timezone: Asia/Seoul
- 데이터 주권: 한국 개인정보보호법 준수
- 주요 사용자: 한국, 아시아 사용자
- 지연시간: ~10-15ms (아시아 사용자 기준)
🔧 서비스 분류
🌍 Global Services (Region 독립적)
모든 region에서 공유하는 서비스들입니다:
| 서비스 | 설명 | 위치 | 이유 |
|---|---|---|---|
| APIs | GCP APIs 활성화 | global/apis/ | 프로젝트별 설정 |
| IAM | 사용자, 역할, 권한 관리 | global/iam/ | 통합 권한 관리 |
| Firebase | Firebase 프로젝트 설정 | global/firebase/ | 글로벌 인증 |
| BigQuery | 글로벌 분석 데이터웨어하우스 | global/bigquery/ | 통합 분석 |
| PubSub | 메시징 및 이벤트 시스템 | global/pubsub/ | 글로벌 이벤트 |
| Secret Manager | 시크릿 및 설정 관리 | global/secret_manager/ | 보안 중앙화 |
🗺️ Regional Services (Region별 분리)
각 지역에서 독립적으로 운영되는 서비스들입니다:
| 서비스 | 설명 | 분리 이유 | 최적화 포인트 |
|---|---|---|---|
| Cloud SQL | PostgreSQL 데이터베이스 | 데이터 지역성, 지연시간 | DB 인스턴스 크기 |
| Memorystore | Redis 캐시 | 세션 데이터 지역성 | 메모리 크기 |
| Network | VPC, 서브넷, 방화벽 | 네트워크 분리 | CIDR 범위 |
| Cloud Scheduler | 시간 기반 스케줄러 | Timezone 최적화 | 스케줄 시간 |
| VPC Connector | Serverless VPC 연결 | 지역별 네트워크 | IP 범위 |
| Cloud Storage | 지역별 버킷 | 데이터 지역성, 성능 | Storage class |
| OTEL Collector | 메트릭 수집 | 지역별 모니터링 | 수집 빈도 |
🚀 성능 최적화
지연시간 (Latency) 개선
성능 벤치마크
| 사용자 위치 | 단일 Region | Multi-Region | 개선율 |
|---|---|---|---|
| 🇩🇪 독일 사용자 | ~15ms | ~5ms | 66% 개선 |
| 🇰🇷 한국 사용자 | ~150ms | ~10ms | 93% 개선 |
| 🇯🇵 일본 사용자 | ~180ms | ~15ms | 91% 개선 |
💰 비용 최적화
Region별 리소스 전략
# 사용량 기반 region별 설정
locals {
region_configs = {
europe = {
# 주요 사용자 기반으로 안정적 운영
min_instances = 1
max_instances = 10
machine_type = "e2-standard-2"
disk_size = 20 # GB
}
asia = {
# 초기 단계: 비용 최적화 우선
min_instances = 0 # Scale-to-zero
max_instances = 5
machine_type = "e2-standard-2"
disk_size = 10 # GB
}
}
}
예상 비용 구조
월별 예상 비용 분석:
🇪🇺 Europe Region (기존):
- Cloud Run: $50
- Cloud SQL: $80
- Memorystore: $30
- Network: $40
- 소계: $200
🇰🇷 Asia Region (신규):
- Cloud Run: $30 (Scale-to-zero)
- Cloud SQL: $60 (작은 인스턴스)
- Memorystore: $20 (작은 크기)
- Network: $40
- 소계: $150
🌍 Global Services:
- BigQuery: $50
- PubSub: $20
- IAM/Firebase: $30
- 소계: $100
━━━━━━━━━━━━━━━━━━━━━━━━━
총 예상 비용: $450/월
기존 대비: +$150 (+50%)
🔐 보안 및 규제 준수
데이터 주권 (Data Sovereignty)
규제 준수 매트릭스
| Region | 주요 규제 | 데이터 저장 | 개인정보 처리 |
|---|---|---|---|
| Europe | GDPR | EU 데이터센터 | EU 개인정보 보호 |
| Asia | K-ISMS, PIPA | 한국 데이터센터 | 한국 개인정보 보호 |
📊 Dynamic Configuration
설정 상속 구조
Dynamic Configuration 예시
모든 서비스는 하드코딩 없이 동적 설정을 사용합니다:
# ✅ Good: Dynamic configuration
locals {
# 환경 및 region 설정 로드
region_vars = read_terragrunt_config("../region.hcl")
project_id = local.region_vars.locals.project_id
region = local.region_vars.locals.region
}
inputs = {
project_id = local.project_id
region = local.region
# ... 기타 설정
}
# ❌ Bad: Hard-coded values (피해야 할 방식)
inputs = {
project_id = "dta-cloud-de-dev" # 하드코딩
region = "europe-west3" # 하드코딩
}
🔄 데이터 플로우
사용자 요청 처리
Cross-Region 데이터 동기화
🛠️ 기술 스택
Infrastructure as Code
- Terragrunt: 설정 관리 및 DRY 원칙
- Terraform: 리소스 프로비저닝
- HCL: 설정 언어
클라우드 서비스 (GCP)
- Cloud Run: Serverless 컨테이너 플랫폼
- Cloud SQL: PostgreSQL 관리형 데이터베이스
- Memorystore: Redis 관리형 캐시
- Cloud Scheduler: Cron 기반 스케줄러
- VPC: 가상 프라이빗 클라우드
모니터링 및 관찰성
- OpenTelemetry: 메트릭, 트레이스 수집
- Cloud Monitoring: GCP 네이티브 모니터링
- Cloud Logging: 중앙화된 로깅
📋 설정 관리 상세
공통 설정 (shared/)
shared/common.hcl
locals {
# 조직 정보
organization = {
id = "778204568675"
billing_account = "01A3DE-04193F-06C496"
folder_id = null
}
# 공통 라벨
base_labels = {
managed_by = "terragrunt"
team = "dta-wide"
firebase = "enabled"
generative-language = "enabled"
}
# 공통 API 목록
default_apis = [
"compute.googleapis.com",
"cloudrun.googleapis.com",
"cloudsql.googleapis.com",
# ... 기타 APIs
]
}
shared/regions.hcl
locals {
regions = {
"europe-west3" = {
region = "europe-west3"
zone = "europe-west3-a"
timezone = "Europe/Berlin"
url_suffix = "eu"
}
"asia-northeast3" = {
region = "asia-northeast3"
zone = "asia-northeast3-a"
timezone = "Asia/Seoul"
url_suffix = "asia"
}
}
}
환경별 설정 ([env]/env.hcl)
locals {
# 공통 설정 로드
common_vars = read_terragrunt_config("../shared/common.hcl").locals
regions_vars = read_terragrunt_config("../shared/regions.hcl").locals
environment = "dev"
# Region별 프로젝트 매핑
projects = {
europe = {
project_id = "dta-cloud-de-dev" # 독일 리젼
region = "europe-west3"
}
asia = {
project_id = "dta-cloud-dev" # 한국 리젼
region = "asia-northeast3"
}
}
}
지역별 설정 (regions/[region]/region.hcl)
locals {
# 환경 설정 로드
env_vars = read_terragrunt_config("../../env.hcl").locals
regions_vars = read_terragrunt_config("../../../shared/regions.hcl").locals
# 현재 region 설정
current_region = "asia-northeast3" # 또는 "europe-west3"
region_config = local.regions_vars.regions[local.current_region]
# 해당 region의 프로젝트 정보
project_id = local.env_vars.projects.asia.project_id # 또는 europe
region = local.region_config.region
zone = local.region_config.zone
}
🚀 배포 전략
단계별 배포 순서
배포 명령어
# 1단계: Global 서비스
terragrunt run-all apply --terragrunt-working-dir dev/global/
# 2단계: Europe Region (기존)
terragrunt run-all apply --terragrunt-working-dir dev/regions/europe-west3/
# 3단계: Asia Region (신규)
terragrunt run-all apply --terragrunt-working-dir dev/regions/asia-northeast3/
# 전체 환경 배포
terragrunt run-all apply --terragrunt-working-dir dev/
🔍 검증 및 테스트
설정 검증
# 모든 환경 검증
for env in dev stage prod; do
echo "Validating $env environment..."
terragrunt validate --terragrunt-working-dir $env/
done
# 특정 region 검증
terragrunt validate --terragrunt-working-dir dev/regions/asia-northeast3/
서비스 연결 테스트
# API 엔드포인트 테스트
curl -X GET https://dta-wide-api-dev-eu-xxxxxxxx-ey.a.run.app/health
curl -X GET https://dta-wide-api-dev-asia-xxxxxxxx-an.a.run.app/health
# 데이터베이스 연결 테스트
psql -h <eu-db-ip> -U admin -d dta_wide_0_1_0
psql -h <asia-db-ip> -U admin -d dta_wide_0_1_0
🔄 확장 계획
단기 확장 (3개월)
- US Region 추가:
us-central1 - Load Balancer: Global HTTP(S) Load Balancer
- CDN 최적화: Cloud CDN 설정
중기 확장 (6개월)
- Auto Failover: Region간 자동 장애 조치
- Data Replication: Cross-region 데이터 복제
- Advanced Monitoring: Multi-region 대시보드
장기 확장 (1년)
- Edge Computing: Cloudflare Workers
- AI/ML Optimization: 트래픽 패턴 기반 최적화
- Compliance Automation: 지역별 규제 자동 준수
📚 관련 문서
- Multi-Region 관리 가이드: 설정 및 관리 방법
- Multi-Region 배포 가이드: 배포 및 운영 절차
- Multi-Region 트러블슈팅: 문제 해결 방법
- Terraform 모듈 가이드: Terraform 모듈 사용법
- 네트워크 인프라: VPC 네트워크 관리