본문으둜 κ±΄λ„ˆλ›°κΈ°

πŸš€ Multi-Region Infrastructure 배포 κ°€μ΄λ“œ

πŸ“‹ κ°œμš”β€‹

Multi-Region Infrastructure의 초기 배포뢀터 일상적인 μš΄μ˜κΉŒμ§€μ˜ 단계별 κ°€μ΄λ“œμž…λ‹ˆλ‹€.

🎯 배포 μ „λž΅β€‹

배포 μˆœμ„œβ€‹

πŸš€ 단계별 배포 κ°€μ΄λ“œβ€‹

1단계: 사전 쀀비​

ν•„μˆ˜ 도ꡬ μ„€μΉ˜β€‹

# Terragrunt μ„€μΉ˜
curl -LO https://github.com/gruntwork-io/terragrunt/releases/download/v0.55.1/terragrunt_linux_amd64
sudo mv terragrunt_linux_amd64 /usr/local/bin/terragrunt
sudo chmod +x /usr/local/bin/terragrunt

# Terraform μ„€μΉ˜
wget https://releases.hashicorp.com/terraform/1.7.4/terraform_1.7.4_linux_amd64.zip
unzip terraform_1.7.4_linux_amd64.zip
sudo mv terraform /usr/local/bin/

# Google Cloud SDK μ„€μΉ˜ 및 인증
gcloud auth login
gcloud config set project dta-cloud-de-dev

ν”„λ‘œμ νŠΈ 생성​

# μƒˆλ‘œμš΄ Asia region ν”„λ‘œμ νŠΈ 생성
gcloud projects create dta-cloud-dev \
--organization=778204568675 \
--name="DTA Cloud Dev (Asia)"

gcloud projects create dta-cloud-stage \
--organization=778204568675 \
--name="DTA Cloud Stage (Asia)"

gcloud projects create dta-cloud-prod \
--organization=778204568675 \
--name="DTA Cloud Prod (Asia)"

# Billing 계정 μ—°κ²°
for project in dta-cloud-dev dta-cloud-stage dta-cloud-prod; do
gcloud billing projects link $project \
--billing-account=01A3DE-04193F-06C496
done

κΆŒν•œ 섀정​

# Terraform Service Account κΆŒν•œ λΆ€μ—¬
for project in dta-cloud-dev dta-cloud-stage dta-cloud-prod; do
gcloud projects add-iam-policy-binding $project \
--member="serviceAccount:terraform@dta-cloud-de-dev.iam.gserviceaccount.com" \
--role="roles/editor"

gcloud projects add-iam-policy-binding $project \
--member="serviceAccount:terraform@dta-cloud-de-dev.iam.gserviceaccount.com" \
--role="roles/storage.admin"
done

2단계: Global Services 배포​

cd infrastructure/terragrunt

# Dev ν™˜κ²½ Global μ„œλΉ„μŠ€ 배포
echo "🌍 Deploying Global Services (Dev)..."
terragrunt run-all apply --terragrunt-working-dir dev/global/

# 핡심 μ„œλΉ„μŠ€ μˆœμ„œ
terragrunt apply --terragrunt-working-dir dev/global/apis/ # 1. APIs λ¨Όμ €
terragrunt apply --terragrunt-working-dir dev/global/iam/ # 2. IAM μ„€μ •
terragrunt apply --terragrunt-working-dir dev/global/firebase/ # 3. Firebase
terragrunt apply --terragrunt-working-dir dev/global/pubsub/ # 4. PubSub
terragrunt apply --terragrunt-working-dir dev/global/bigquery/ # 5. BigQuery
terragrunt apply --terragrunt-working-dir dev/global/secret_manager/ # 6. Secrets

3단계: Europe Region 배포 (κΈ°μ‘΄)​

echo "πŸ‡ͺπŸ‡Ί Deploying Europe Region..."

# λ„€νŠΈμ›Œν¬ 인프라 λ¨Όμ €
terragrunt apply --terragrunt-working-dir dev/regions/europe-west3/network/
terragrunt apply --terragrunt-working-dir dev/regions/europe-west3/vpc-connector/

# 데이터 μ„œλΉ„μŠ€
terragrunt apply --terragrunt-working-dir dev/regions/europe-west3/cloudsql/
terragrunt apply --terragrunt-working-dir dev/regions/europe-west3/cloudsql-users/
terragrunt apply --terragrunt-working-dir dev/regions/europe-west3/memorystore/

# μ»΄ν“¨νŒ… μ„œλΉ„μŠ€
terragrunt apply --terragrunt-working-dir dev/regions/europe-west3/cloud-scheduler/
terragrunt apply --terragrunt-working-dir dev/regions/europe-west3/otel-collector/

# 전체 region 배포 (μœ„μ˜ 단계λ₯Ό ν•œλ²ˆμ—)
terragrunt run-all apply --terragrunt-working-dir dev/regions/europe-west3/

4단계: Asia Region 배포 (μ‹ κ·œ)​

echo "πŸ‡°πŸ‡· Deploying Asia Region..."

# λ„€νŠΈμ›Œν¬ 인프라
echo " πŸ“‘ Network infrastructure..."
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/network/
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/vpc-connector/

# 데이터 μ„œλΉ„μŠ€
echo " πŸ’Ύ Data services..."
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/cloudsql/
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/cloudsql-users/
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/memorystore/

# μŠ€μΌ€μ€„λŸ¬ (νƒ€μž„μ‘΄ μ΅œμ ν™”)
echo " ⏰ Scheduler services..."
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/cloud-scheduler/

# λͺ¨λ‹ˆν„°λ§
echo " πŸ“Š Monitoring services..."
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/otel-collector/

# 전체 Asia region 배포
terragrunt run-all apply --terragrunt-working-dir dev/regions/asia-northeast3/

5단계: 검증 및 ν…ŒμŠ€νŠΈβ€‹

μ—°κ²°μ„± ν…ŒμŠ€νŠΈβ€‹

# 각 region API μ—”λ“œν¬μΈνŠΈ ν…ŒμŠ€νŠΈ
echo "πŸ” Testing API endpoints..."

# Europe region
curl -X GET https://dta-wide-api-dev-eu-xxxxxxxx-ey.a.run.app/health
curl -X GET https://dta-wide-api-dev-eu-xxxxxxxx-ey.a.run.app/api/system/info

# Asia region
curl -X GET https://dta-wide-api-dev-asia-xxxxxxxx-an.a.run.app/health
curl -X GET https://dta-wide-api-dev-asia-xxxxxxxx-an.a.run.app/api/system/info

λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° ν…ŒμŠ€νŠΈβ€‹

# Europe Cloud SQL μ—°κ²°
echo "πŸ’Ύ Testing Europe database..."
gcloud sql connect db-dta-wide-dev-eu \
--project=dta-cloud-de-dev \
--user=admin

# Asia Cloud SQL μ—°κ²°
echo "πŸ’Ύ Testing Asia database..."
gcloud sql connect db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--user=admin

μŠ€μΌ€μ€„λŸ¬ λ™μž‘ 확인​

# Europe μŠ€μΌ€μ€„λŸ¬ μƒνƒœ
gcloud scheduler jobs list \
--project=dta-cloud-de-dev \
--location=europe-west3

# Asia μŠ€μΌ€μ€„λŸ¬ μƒνƒœ
gcloud scheduler jobs list \
--project=dta-cloud-dev \
--location=asia-northeast3

6단계: Production ν™˜κ²½ 배포​

Stage ν™˜κ²½ 먼저​

# Stage ν™˜κ²½ 배포 (Dev 검증 ν›„)
echo "πŸ§ͺ Deploying Stage environment..."

# Global services
terragrunt run-all apply --terragrunt-working-dir stage/global/

# Regional services
terragrunt run-all apply --terragrunt-working-dir stage/regions/europe-west3/
terragrunt run-all apply --terragrunt-working-dir stage/regions/asia-northeast3/

Production ν™˜κ²½ 배포​

# Production 배포 (맀우 μ‹ μ€‘ν•˜κ²Œ!)
echo "πŸš€ Deploying Production environment..."

# 1. Global services (non-disruptive)
terragrunt run-all apply --terragrunt-working-dir prod/global/

# 2. Europe region (κΈ°μ‘΄ μ„œλΉ„μŠ€ μ—…λ°μ΄νŠΈ)
terragrunt run-all apply --terragrunt-working-dir prod/regions/europe-west3/

# 3. Asia region (μ‹ κ·œ μ„œλΉ„μŠ€)
terragrunt run-all apply --terragrunt-working-dir prod/regions/asia-northeast3/

πŸ”„ 일상적인 배포 μ ˆμ°¨β€‹

일반적인 μ—…λ°μ΄νŠΈβ€‹

μ„€μ • λ³€κ²½ 배포​

#!/bin/bash
# deploy-config-change.sh

ENVIRONMENT=$1
SERVICE=$2
REGION=$3

if [[ -z "$ENVIRONMENT" || -z "$SERVICE" ]]; then
echo "Usage: $0 <environment> <service> [region]"
echo "Example: $0 dev cloudsql asia-northeast3"
exit 1
fi

if [[ -n "$REGION" ]]; then
# νŠΉμ • region의 νŠΉμ • μ„œλΉ„μŠ€
terragrunt apply --terragrunt-working-dir $ENVIRONMENT/regions/$REGION/$SERVICE/
else
# λͺ¨λ“  region의 νŠΉμ • μ„œλΉ„μŠ€
for region in europe-west3 asia-northeast3; do
echo "Deploying $SERVICE to $region..."
terragrunt apply --terragrunt-working-dir $ENVIRONMENT/regions/$region/$SERVICE/
done
fi

Emergency 배포​

#!/bin/bash  
# emergency-deploy.sh

ENVIRONMENT=$1
REGION=$2

echo "🚨 Emergency deployment to $REGION in $ENVIRONMENT"

# λΉ λ₯Έ 검증
terragrunt validate --terragrunt-working-dir $ENVIRONMENT/regions/$REGION/

# μ¦‰μ‹œ 배포
terragrunt run-all apply \
--terragrunt-working-dir $ENVIRONMENT/regions/$REGION/ \
--terragrunt-non-interactive

Rolling Update​

μ„œλΉ„μŠ€λ³„ Rolling Update​

#!/bin/bash
# rolling-update.sh

SERVICE=$1

for env in dev stage prod; do
echo "πŸ”„ Rolling update $SERVICE in $env..."

for region in europe-west3 asia-northeast3; do
echo " πŸ“ Updating $region..."
terragrunt apply --terragrunt-working-dir $env/regions/$region/$SERVICE/

# ν—¬μŠ€μ²΄ν¬ λŒ€κΈ°
sleep 30

# μ„œλΉ„μŠ€ μƒνƒœ 확인
if ! ./scripts/health-check.sh $env $region $SERVICE; then
echo "❌ Health check failed! Rolling back..."
terragrunt apply --terragrunt-working-dir $env/regions/$region/$SERVICE/ \
-var="rollback=true"
exit 1
fi
done
done

πŸ“Š 배포 μžλ™ν™”β€‹

CI/CD νŒŒμ΄ν”„λΌμΈβ€‹

GitHub Actions μ˜ˆμ‹œβ€‹

# .github/workflows/multi-region-deploy.yml
name: Multi-Region Infrastructure Deploy

on:
push:
branches: [main]
paths: ['infrastructure/terragrunt/**']

jobs:
deploy-dev:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Terragrunt
run: |
wget -O terragrunt https://github.com/gruntwork-io/terragrunt/releases/download/v0.55.1/terragrunt_linux_amd64
chmod +x terragrunt
sudo mv terragrunt /usr/local/bin/

- name: Deploy Global Services
run: |
cd infrastructure/terragrunt
terragrunt run-all apply --terragrunt-working-dir dev/global/ --terragrunt-non-interactive

- name: Deploy Europe Region
run: |
terragrunt run-all apply --terragrunt-working-dir dev/regions/europe-west3/ --terragrunt-non-interactive

- name: Deploy Asia Region
run: |
terragrunt run-all apply --terragrunt-working-dir dev/regions/asia-northeast3/ --terragrunt-non-interactive

- name: Run Tests
run: ./scripts/test-multi-region.sh dev

deploy-stage:
needs: deploy-dev
if: github.ref == 'refs/heads/main'
# ... Stage 배포 steps

deploy-prod:
needs: deploy-stage
if: github.ref == 'refs/heads/main'
# ... Prod 배포 steps (μˆ˜λ™ 승인 ν•„μš”)

μžλ™ν™” μŠ€ν¬λ¦½νŠΈβ€‹

전체 ν™˜κ²½ 배포 μŠ€ν¬λ¦½νŠΈβ€‹

#!/bin/bash
# deploy-multi-region.sh

set -e

ENVIRONMENT=${1:-dev}
ACTION=${2:-apply}
REGION=${3:-all}

echo "πŸš€ Multi-Region Deployment"
echo "Environment: $ENVIRONMENT"
echo "Action: $ACTION"
echo "Region: $REGION"

cd infrastructure/terragrunt

# Global services 배포 ν•¨μˆ˜
deploy_global() {
echo "🌍 Deploying Global Services ($ENVIRONMENT)..."
terragrunt run-all $ACTION --terragrunt-working-dir $ENVIRONMENT/global/
}

# Region별 배포 ν•¨μˆ˜
deploy_region() {
local region=$1
echo "πŸ“ Deploying $region region ($ENVIRONMENT)..."

# λ„€νŠΈμ›Œν¬ λ¨Όμ €
terragrunt $ACTION --terragrunt-working-dir $ENVIRONMENT/regions/$region/network/
terragrunt $ACTION --terragrunt-working-dir $ENVIRONMENT/regions/$region/vpc-connector/

# 데이터 μ„œλΉ„μŠ€
terragrunt $ACTION --terragrunt-working-dir $ENVIRONMENT/regions/$region/cloudsql/
terragrunt $ACTION --terragrunt-working-dir $ENVIRONMENT/regions/$region/memorystore/

# μ»΄ν“¨νŒ… μ„œλΉ„μŠ€
terragrunt run-all $ACTION --terragrunt-working-dir $ENVIRONMENT/regions/$region/
}

# 메인 배포 둜직
case $REGION in
"all")
deploy_global
deploy_region "europe-west3"
deploy_region "asia-northeast3"
;;
"europe"|"eu")
deploy_region "europe-west3"
;;
"asia")
deploy_region "asia-northeast3"
;;
"global")
deploy_global
;;
*)
echo "❌ Unknown region: $REGION"
echo "Available: all, global, europe, asia"
exit 1
;;
esac

echo "βœ… Deployment completed successfully!"

ν—¬μŠ€μ²΄ν¬ μŠ€ν¬λ¦½νŠΈβ€‹

#!/bin/bash
# health-check.sh

ENVIRONMENT=$1
REGION=$2
SERVICE=${3:-all}

check_cloud_run() {
local project=$1
local region=$2

echo "πŸ” Checking Cloud Run in $region..."

gcloud run services list \
--project=$project \
--region=$region \
--filter="status.conditions.type=Ready AND status.conditions.status=True"
}

check_cloud_sql() {
local project=$1
local region=$2

echo "πŸ” Checking Cloud SQL in $region..."

gcloud sql instances list \
--project=$project \
--filter="state=RUNNABLE AND region:$region"
}

check_memorystore() {
local project=$1
local region=$2

echo "πŸ” Checking Memorystore in $region..."

gcloud redis instances list \
--project=$project \
--region=$region \
--filter="state=READY"
}

# 메인 체크 둜직
case $REGION in
"europe-west3")
PROJECT="dta-cloud-de-$ENVIRONMENT"
;;
"asia-northeast3")
PROJECT="dta-cloud-$ENVIRONMENT"
;;
*)
echo "❌ Unknown region: $REGION"
exit 1
;;
esac

case $SERVICE in
"all")
check_cloud_run $PROJECT $REGION
check_cloud_sql $PROJECT $REGION
check_memorystore $PROJECT $REGION
;;
"cloud-run")
check_cloud_run $PROJECT $REGION
;;
"cloudsql")
check_cloud_sql $PROJECT $REGION
;;
"memorystore")
check_memorystore $PROJECT $REGION
;;
esac

πŸ” 배포 검증​

μžλ™ 검증 μŠ€ν¬λ¦½νŠΈβ€‹

μ—°κ²°μ„± ν…ŒμŠ€νŠΈβ€‹

#!/bin/bash
# test-connectivity.sh

ENVIRONMENT=$1

# μ„œλΉ„μŠ€ URL ꡬ성
EU_URL="https://dta-wide-api-$ENVIRONMENT-eu-xxxxxxxx-ey.a.run.app"
ASIA_URL="https://dta-wide-api-$ENVIRONMENT-asia-xxxxxxxx-an.a.run.app"

echo "πŸ§ͺ Testing Multi-Region Connectivity"

# Europe region ν…ŒμŠ€νŠΈ
echo "πŸ‡ͺπŸ‡Ί Testing Europe region..."
curl -f -s -o /dev/null -w "%{http_code}" $EU_URL/health
if [[ $? -eq 0 ]]; then
echo "βœ… Europe region: OK"
else
echo "❌ Europe region: FAILED"
exit 1
fi

# Asia region ν…ŒμŠ€νŠΈ
echo "πŸ‡°πŸ‡· Testing Asia region..."
curl -f -s -o /dev/null -w "%{http_code}" $ASIA_URL/health
if [[ $? -eq 0 ]]; then
echo "βœ… Asia region: OK"
else
echo "❌ Asia region: FAILED"
exit 1
fi

# μ§€μ—°μ‹œκ°„ ν…ŒμŠ€νŠΈ
echo "⚑ Latency tests..."
curl -w "@curl-format.txt" -o /dev/null -s $EU_URL/health
curl -w "@curl-format.txt" -o /dev/null -s $ASIA_URL/health

데이터 일관성 검증​

#!/bin/bash
# test-data-consistency.sh

ENVIRONMENT=$1

echo "πŸ“Š Testing Data Consistency"

# Europe DB ν…ŒμŠ€νŠΈ
echo "πŸ‡ͺπŸ‡Ί Testing Europe database..."
EU_COUNT=$(psql -h <eu-db-ip> -U admin -d dta_wide_0_1_0 -t -c "SELECT COUNT(*) FROM users;")

# Asia DB ν…ŒμŠ€νŠΈ
echo "πŸ‡°πŸ‡· Testing Asia database..."
ASIA_COUNT=$(psql -h <asia-db-ip> -U admin -d dta_wide_0_1_0 -t -c "SELECT COUNT(*) FROM users;")

echo "EU users: $EU_COUNT"
echo "Asia users: $ASIA_COUNT"

# 데이터 동기화 μƒνƒœ 확인
if [[ $EU_COUNT -eq $ASIA_COUNT ]]; then
echo "βœ… Data consistency: OK"
else
echo "⚠️ Data consistency: MISMATCH"
fi

🚨 λ‘€λ°± μ ˆμ°¨β€‹

κΈ΄κΈ‰ 둀백​

전체 ν™˜κ²½ 둀백​

#!/bin/bash
# emergency-rollback.sh

ENVIRONMENT=$1
REGION=$2
COMMIT_HASH=$3

echo "🚨 Emergency rollback initiated"
echo "Environment: $ENVIRONMENT"
echo "Region: $REGION"
echo "Target commit: $COMMIT_HASH"

# Git μƒνƒœ 볡원
git checkout $COMMIT_HASH -- infrastructure/terragrunt/$ENVIRONMENT/

# μ„€μ • 적용
if [[ "$REGION" == "all" ]]; then
terragrunt run-all apply --terragrunt-working-dir $ENVIRONMENT/
else
terragrunt run-all apply --terragrunt-working-dir $ENVIRONMENT/regions/$REGION/
fi

echo "βœ… Rollback completed"

μ„œλΉ„μŠ€λ³„ 둀백​

# νŠΉμ • μ„œλΉ„μŠ€λ§Œ λ‘€λ°±
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/cloudsql/ \
-var="database_version=POSTGRES_15" # 이전 λ²„μ „μœΌλ‘œ

# Terraform state 볡원 (극단적인 경우)
terragrunt state pull > backup.tfstate
# ... state μˆ˜μ • ...
terragrunt state push backup.tfstate

πŸ“Š μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§β€‹

Region별 μ„±λŠ₯ λ©”νŠΈλ¦­β€‹

Cloud Monitoring 섀정​

# Multi-region λŒ€μ‹œλ³΄λ“œ 생성
gcloud monitoring dashboards create --config-from-file=multi-region-dashboard.json

# μ•Œλ¦Ό μ •μ±… μ„€μ •
gcloud alpha monitoring policies create --policy-from-file=multi-region-alerts.yaml

μ„±λŠ₯ μž„κ³„μΉ˜β€‹

# multi-region-alerts.yaml
displayName: "Multi-Region Performance Alerts"
conditions:
- displayName: "High Latency - Europe"
conditionThreshold:
filter: 'resource.type="cloud_run_revision" AND resource.labels.project_id="dta-cloud-de-dev"'
comparison: COMPARISON_GREATER_THAN
thresholdValue: 500 # 500ms

- displayName: "High Latency - Asia"
conditionThreshold:
filter: 'resource.type="cloud_run_revision" AND resource.labels.project_id="dta-cloud-dev"'
comparison: COMPARISON_GREATER_THAN
thresholdValue: 500 # 500ms

λΉ„μš© λͺ¨λ‹ˆν„°λ§β€‹

Region별 λΉ„μš© 좔적​

# λΉ„μš© 리포트 생성
gcloud billing budgets describe multi-region-budget \
--billing-account=01A3DE-04193F-06C496

# μ˜ˆμƒ λΉ„μš© vs μ‹€μ œ λΉ„μš© 비ꡐ
./scripts/cost-analysis.sh

πŸ› οΈ μœ μ§€λ³΄μˆ˜β€‹

μ •κΈ° μœ μ§€λ³΄μˆ˜ μ²΄ν¬λ¦¬μŠ€νŠΈβ€‹

μ£Όκ°„ μ²΄ν¬λ¦¬μŠ€νŠΈβ€‹

  • λͺ¨λ“  region μ„œλΉ„μŠ€ μƒνƒœ 확인
  • μ§€μ—°μ‹œκ°„ μ„±λŠ₯ 리포트 κ²€ν† 
  • μ—λŸ¬μœ¨ 및 κ°€μš©μ„± λ©”νŠΈλ¦­ 확인
  • λ°±μ—… μƒνƒœ 검증
  • λ³΄μ•ˆ μ—…λ°μ΄νŠΈ 적용

μ›”κ°„ μ²΄ν¬λ¦¬μŠ€νŠΈβ€‹

  • λΉ„μš© μ΅œμ ν™” 뢄석
  • μš©λŸ‰ κ³„νš μ—…λ°μ΄νŠΈ
  • DR(μž¬ν•΄λ³΅κ΅¬) ν…ŒμŠ€νŠΈ
  • μ•„ν‚€ν…μ²˜ κ°œμ„ μ‚¬ν•­ κ²€ν† 
  • μƒˆλ‘œμš΄ region ν•„μš”μ„± 평가

μ—…κ·Έλ ˆμ΄λ“œ μ ˆμ°¨β€‹

Terraform/Terragrunt μ—…κ·Έλ ˆμ΄λ“œβ€‹

# 1. ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œ λ¨Όμ € 검증
terragrunt version
terraform version

# 2. Dev ν™˜κ²½μ—μ„œ μ—…κ·Έλ ˆμ΄λ“œ ν…ŒμŠ€νŠΈ
terragrunt run-all plan --terragrunt-working-dir dev/

# 3. λ¬Έμ œμ—†μœΌλ©΄ 순차적으둜 적용
for env in dev stage prod; do
terragrunt run-all apply --terragrunt-working-dir $env/
done

GCP μ„œλΉ„μŠ€ μ—…κ·Έλ ˆμ΄λ“œβ€‹

# Cloud SQL 버전 μ—…κ·Έλ ˆμ΄λ“œ
gcloud sql instances patch db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--database-version=POSTGRES_16

# Redis 버전 μ—…κ·Έλ ˆμ΄λ“œ
gcloud redis instances upgrade dta-wide-redis \
--project=dta-cloud-dev \
--region=asia-northeast3 \
--redis-version=REDIS_7_2

πŸ”’ λ³΄μ•ˆ 관리​

μ •κΈ° λ³΄μ•ˆ 점검​

IAM κΆŒν•œ 검토​

# κ³Όλ„ν•œ κΆŒν•œ 확인
for project in dta-cloud-de-dev dta-cloud-dev; do
echo "πŸ” Checking $project permissions..."
gcloud projects get-iam-policy $project \
--flatten="bindings[].members" \
--filter="bindings.role=roles/owner OR bindings.role=roles/editor"
done

λ„€νŠΈμ›Œν¬ λ³΄μ•ˆ 점검​

# λ°©ν™”λ²½ κ·œμΉ™ κ²€ν† 
gcloud compute firewall-rules list \
--project=dta-cloud-dev \
--filter="direction=INGRESS AND allowed[].ports:*" \
--format="table(name,direction,sourceRanges[].list():label=SRC_RANGES,allowed[].map().firewall_rule().list():label=ALLOW)"

μΈμ¦μ„œ 및 μ‹œν¬λ¦Ώ 관리​

SSL μΈμ¦μ„œ 갱신​

# μžλ™ κ°±μ‹  μ„€μ • 확인
gcloud compute ssl-certificates list \
--project=dta-cloud-dev \
--filter="type=MANAGED"

# μˆ˜λ™ κ°±μ‹  (ν•„μš”ν•œ 경우)
gcloud compute ssl-certificates create dta-wide-asia-cert \
--project=dta-cloud-dev \
--domains=dta-wide-api-dev-asia.weltcorp.com

μ‹œν¬λ¦Ώ ꡐ체​

# 각 region의 API ν‚€ ꡐ체
for project in dta-cloud-de-dev dta-cloud-dev; do
gcloud secrets versions add dta-wide-api-key \
--project=$project \
--data-file=new-api-key.txt
done

πŸ“ˆ μ„±λŠ₯ νŠœλ‹β€‹

Region별 μ΅œμ ν™”β€‹

μ˜€ν† μŠ€μΌ€μΌλ§ 쑰정​

# Asia region: μ‚¬μš©λŸ‰ 증가에 λ”°λ₯Έ μŠ€μΌ€μΌλ§ μ‘°μ •
gcloud run services update dta-wide-api \
--region=asia-northeast3 \
--project=dta-cloud-dev \
--min-instances=1 \
--max-instances=10 \
--cpu=2 \
--memory=4Gi

λ°μ΄ν„°λ² μ΄μŠ€ μ„±λŠ₯ νŠœλ‹β€‹

# Cloud SQL μΈμŠ€ν„΄μŠ€ 크기 μ‘°μ •
gcloud sql instances patch db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--tier=db-standard-2 \
--storage-size=50GB

μΊμ‹œ μ΅œμ ν™”β€‹

Redis μ„€μ • νŠœλ‹β€‹

# Memorystore μ„€μ • μ—…λ°μ΄νŠΈ
gcloud redis instances update dta-wide-redis \
--project=dta-cloud-dev \
--region=asia-northeast3 \
--size=2 \
--redis-config maxmemory-policy=allkeys-lru

πŸ”„ 데이터 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜β€‹

Initial Data Migration​

EU β†’ Asia 초기 데이터 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜β€‹

#!/bin/bash
# initial-data-migration.sh

echo "πŸ“Š Starting initial data migration..."

# 1. EUμ—μ„œ 데이터 덀프
echo " πŸ“€ Exporting from EU database..."
gcloud sql export sql db-dta-wide-dev-eu \
gs://dta-migration-bucket/eu-initial-dump.sql \
--project=dta-cloud-de-dev \
--database=dta_wide_0_1_0

# 2. Asia둜 데이터 μž„ν¬νŠΈ
echo " πŸ“₯ Importing to Asia database..."
gcloud sql import sql db-dta-wide-dev-asia \
gs://dta-migration-bucket/eu-initial-dump.sql \
--project=dta-cloud-dev \
--database=dta_wide_0_1_0

# 3. 검증
echo " πŸ” Verifying data consistency..."
EU_COUNT=$(gcloud sql execute-sql db-dta-wide-dev-eu \
--project=dta-cloud-de-dev \
--sql="SELECT COUNT(*) FROM users;")

ASIA_COUNT=$(gcloud sql execute-sql db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--sql="SELECT COUNT(*) FROM users;")

if [[ "$EU_COUNT" == "$ASIA_COUNT" ]]; then
echo "βœ… Migration successful!"
else
echo "❌ Migration verification failed!"
fi

μ‹€μ‹œκ°„ 동기화 섀정​

PubSub 기반 데이터 동기화​

# Cross-region 동기화 ν† ν”½ 생성
gcloud pubsub topics create cross-region-sync \
--project=dta-cloud-de-dev

# Asia regionμ—μ„œ ꡬ독
gcloud pubsub subscriptions create asia-sync-subscription \
--topic=cross-region-sync \
--project=dta-cloud-dev

🎯 베슀트 ν”„λž™ν‹°μŠ€β€‹

배포 베슀트 ν”„λž™ν‹°μŠ€β€‹

  1. πŸ“‹ Plan First: 항상 terragrunt plan λ¨Όμ € μ‹€ν–‰
  2. πŸ”„ 순차 배포: Global β†’ Europe β†’ Asia μˆœμ„œ
  3. βœ… 검증: 각 단계별 ν—¬μŠ€μ²΄ν¬ μˆ˜ν–‰
  4. πŸ“Š λͺ¨λ‹ˆν„°λ§: 배포 ν›„ μ¦‰μ‹œ λ©”νŠΈλ¦­ 확인
  5. 🚨 λ‘€λ°± μ€€λΉ„: 문제 μ‹œ μ¦‰μ‹œ λ‘€λ°± κ°€λŠ₯ν•˜λ„λ‘ μ€€λΉ„

운영 베슀트 ν”„λž™ν‹°μŠ€β€‹

  1. πŸ“… μ •κΈ° 점검: μ£Όκ°„/μ›”κ°„ 체크리슀트 μ€€μˆ˜
  2. πŸ’° λΉ„μš© 관리: 월별 λΉ„μš© 리뷰 및 μ΅œμ ν™”
  3. πŸ” λ³΄μ•ˆ κ°•ν™”: μ •κΈ° κΆŒν•œ κ²€ν†  및 μ‹œν¬λ¦Ώ ꡐ체
  4. πŸ“ˆ μ„±λŠ₯ 뢄석: Region별 μ„±λŠ₯ νŠΈλ Œλ“œ 뢄석
  5. πŸ”„ DR ν…ŒμŠ€νŠΈ: 뢄기별 μž¬ν•΄λ³΅κ΅¬ ν…ŒμŠ€νŠΈ

μ„€μ • 관리 베슀트 ν”„λž™ν‹°μŠ€β€‹

  1. 🎯 DRY 원칙: 곡톡 μ„€μ •μ˜ 쀑앙화
  2. πŸ”§ Dynamic Config: ν•˜λ“œμ½”λ”© κΈˆμ§€
  3. πŸ“ λ¬Έμ„œν™”: λͺ¨λ“  변경사항 λ¬Έμ„œν™”
  4. πŸ§ͺ ν…ŒμŠ€νŠΈ: Devμ—μ„œ μΆ©λΆ„ν•œ ν…ŒμŠ€νŠΈ ν›„ Prod 적용
  5. πŸ“‹ 버전 관리: μ„€μ • λ³€κ²½μ˜ Git 기반 좔적

πŸ“ž 문제 해결​

일반적인 λ¬Έμ œλ“€β€‹

Terragrunt 였λ₯˜β€‹

# μΊμ‹œ 클리어
find . -type d -name ".terragrunt-cache" -exec rm -rf {} +

# μ˜μ‘΄μ„± 문제 ν•΄κ²°
terragrunt run-all apply --terragrunt-working-dir dev/ --terragrunt-ignore-dependency-errors

κΆŒν•œ λ¬Έμ œβ€‹

# Service Account κΆŒν•œ μž¬μ„€μ •
./scripts/setup-cross-region-permissions.sh

λ„€νŠΈμ›Œν¬ μ—°κ²° λ¬Έμ œβ€‹

# VPC Connector μž¬μƒμ„±
terragrunt destroy --terragrunt-working-dir dev/regions/asia-northeast3/vpc-connector/
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/vpc-connector/

πŸ“š κ΄€λ ¨ λ¬Έμ„œβ€‹


πŸ“§ 문의: DevOps Team (bok@weltcorp.com)