π 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
π― λ² μ€νΈ νλν°μ€β
λ°°ν¬ λ² μ€νΈ νλν°μ€β
- π Plan First: νμ
terragrunt planλ¨Όμ μ€ν - π μμ°¨ λ°°ν¬: Global β Europe β Asia μμ
- β κ²μ¦: κ° λ¨κ³λ³ ν¬μ€μ²΄ν¬ μν
- π λͺ¨λν°λ§: λ°°ν¬ ν μ¦μ λ©νΈλ¦ νμΈ
- π¨ λ‘€λ°± μ€λΉ: λ¬Έμ μ μ¦μ λ‘€λ°± κ°λ₯νλλ‘ μ€λΉ
μ΄μ λ² μ€νΈ νλν°μ€β
- π μ κΈ° μ κ²: μ£Όκ°/μκ° μ²΄ν¬λ¦¬μ€νΈ μ€μ
- π° λΉμ© κ΄λ¦¬: μλ³ λΉμ© 리뷰 λ° μ΅μ ν
- π 보μ κ°ν: μ κΈ° κΆν κ²ν λ° μν¬λ¦Ώ κ΅μ²΄
- π μ±λ₯ λΆμ: Regionλ³ μ±λ₯ νΈλ λ λΆμ
- π DR ν μ€νΈ: λΆκΈ°λ³ μ¬ν΄λ³΅κ΅¬ ν μ€νΈ
μ€μ κ΄λ¦¬ λ² μ€νΈ νλν°μ€β
- π― DRY μμΉ: κ³΅ν΅ μ€μ μ μ€μν
- π§ Dynamic Config: νλμ½λ© κΈμ§
- π λ¬Έμν: λͺ¨λ λ³κ²½μ¬ν λ¬Έμν
- π§ͺ ν μ€νΈ: Devμμ μΆ©λΆν ν μ€νΈ ν Prod μ μ©
- π λ²μ κ΄λ¦¬: μ€μ λ³κ²½μ 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/
π κ΄λ ¨ λ¬Έμβ
- Multi-Region μν€ν μ²: μ 체 ꡬ쑰 λ° μ€κ³
- Multi-Region λ°°ν¬ κ°μ΄λ: λ°°ν¬ μ μ°¨
- Multi-Region νΈλ¬λΈμν : λ¬Έμ ν΄κ²°
- Terraform κ°μ΄λ: Terraform λͺ¨λ μ¬μ©λ²
π§ λ¬Έμ: DevOps Team (bok@weltcorp.com)