π Multi-Region Infrastructure Quick Start
π κ°μβ
DTA-Wide Multi-Region Infrastructureλ₯Ό 5λΆ μμ μ΄ν΄νκ³ μμν μ μλ λΉ λ₯Έ κ°μ΄λμ λλ€.
π― ꡬ쑰 νλμ 보기β
π DTA-Wide Infrastructure
βββ πͺπΊ Europe (λ
μΌ): dta-cloud-de-* @ europe-west3
βββ π°π· Asia (νκ΅): dta-cloud-* @ asia-northeast3
Project λ§€νβ
| Environment | πͺπΊ Europe | π°π· Asia |
|---|---|---|
| Dev | dta-cloud-de-dev | dta-cloud-dev |
| Stage | dta-cloud-de-stage | dta-cloud-stage |
| Prod | dta-cloud-de-prod | dta-cloud-prod |
β‘ 5λΆ λ°°ν¬ κ°μ΄λβ
1λ¨κ³: νκ²½ μ€λΉ (1λΆ)β
# νλ‘μ νΈ λλ ν λ¦¬λ‘ μ΄λ
cd infrastructure/terragrunt
# νκ²½ μ ν
export ENVIRONMENT=dev # λλ stage, prod
2λ¨κ³: Global μλΉμ€ λ°°ν¬ (2λΆ)β
# Global μλΉμ€ νλ²μ λ°°ν¬
terragrunt run-all apply --terragrunt-working-dir $ENVIRONMENT/global/
3λ¨κ³: Regionλ³ λ°°ν¬ (2λΆ)β
# Europe region (κΈ°μ‘΄)
terragrunt run-all apply --terragrunt-working-dir $ENVIRONMENT/regions/europe-west3/
# Asia region (μ κ·)
terragrunt run-all apply --terragrunt-working-dir $ENVIRONMENT/regions/asia-northeast3/
4λ¨κ³: κ²μ¦ (30μ΄)β
# μλΉμ€ μν νμΈ
curl https://dta-wide-api-dev-eu-xxxxxxxx-ey.a.run.app/health
curl https://dta-wide-api-dev-asia-xxxxxxxx-an.a.run.app/health
π― μΌλ°μ μΈ μμ λ€β
νΉμ Regionλ§ λ°°ν¬β
# πͺπΊ EUλ§ λ°°ν¬
terragrunt run-all apply --terragrunt-working-dir dev/regions/europe-west3/
# π°π· Asiaλ§ λ°°ν¬
terragrunt run-all apply --terragrunt-working-dir dev/regions/asia-northeast3/
νΉμ μλΉμ€λ§ μ λ°μ΄νΈβ
# CloudSQL μ
λ°μ΄νΈ (λͺ¨λ region)
terragrunt apply --terragrunt-working-dir dev/regions/europe-west3/cloudsql/
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/cloudsql/
# Cloud Scheduler μ
λ°μ΄νΈ (Asia only)
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/cloud-scheduler/
μ€μ κ²μ¦β
# μ 체 μ€μ κ²μ¦
terragrunt validate --terragrunt-working-dir dev/
# νΉμ region κ²μ¦
terragrunt validate --terragrunt-working-dir dev/regions/asia-northeast3/
π§ μμ£Ό νλ μμ β
μλ‘μ΄ Region μΆκ°β
Step 1: Region μ μβ
# shared/regions.hclμ μΆκ°
"us-central1" = {
region = "us-central1"
zone = "us-central1-a"
timezone = "America/Chicago"
url_suffix = "us"
}
Step 2: Project λ§€νβ
# dev/env.hclμ μΆκ°
projects = {
europe = { ... } # κΈ°μ‘΄
asia = { ... } # κΈ°μ‘΄
us = {
project_id = "dta-cloud-us-dev"
region = "us-central1"
}
}
Step 3: λ°°ν¬β
# κΈ°μ‘΄ region 볡μ¬
cp -r dev/regions/europe-west3 dev/regions/us-central1
# region.hcl μμ ν λ°°ν¬
terragrunt run-all apply --terragrunt-working-dir dev/regions/us-central1/
νκ²½λ³ λ°°ν¬β
# Dev β Stage β Prod μμ°¨ λ°°ν¬
for env in dev stage prod; do
echo "π Deploying $env environment..."
terragrunt run-all apply --terragrunt-working-dir $env/
done
λ‘€λ°±β
# νΉμ μλΉμ€ λ‘€λ°±
git checkout HEAD~1 -- infrastructure/terragrunt/dev/regions/asia-northeast3/cloudsql/
terragrunt apply --terragrunt-working-dir dev/regions/asia-northeast3/cloudsql/
# μ 체 νκ²½ λ‘€λ°±
git checkout HEAD~1 -- infrastructure/terragrunt/dev/
terragrunt run-all apply --terragrunt-working-dir dev/
π λͺ¨λν°λ§ λΉ λ₯Έ νμΈβ
μν 체ν¬β
# λͺ¨λ region μν νλ²μ νμΈ
./scripts/health-check-all.sh dev
# μ±λ₯ λ©νΈλ¦ νμΈ
gcloud monitoring metrics list \
--filter="metric.type=run.googleapis.com/request_latencies" \
--project=dta-cloud-dev
λΉμ© νμΈβ
# μλ³ λΉμ© νμΈ
gcloud billing budgets list \
--billing-account=01A3DE-04193F-06C496 \
--filter="displayName:DTA-Wide"
# Regionλ³ λΉμ© λΉκ΅
./scripts/cost-breakdown.sh
π¨ κΈ΄κΈ μν© λμβ
π₯ μ₯μ λμ (3λΆ μμ)β
1λΆμ§Έ: λ¬Έμ νμ β
# λΉ λ₯Έ μν νμΈ
./scripts/emergency-check.sh
2λΆμ§Έ: νΈλν½ μ°νβ
# λ¬Έμ region νΈλν½ μ°¨λ¨
gcloud compute backend-services update dta-wide-backend \
--global \
--remove-backends=<problem-region>-neg
3λΆμ§Έ: ν μλ¦Όβ
# Slack μλ¦Ό
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"π¨ Multi-Region Infrastructure Alert: <region> is down"}' \
$SLACK_WEBHOOK_URL
π λΉ λ₯Έ 볡ꡬβ
# μλ 볡ꡬ μ€ν¬λ¦½νΈ
./scripts/auto-recovery.sh <environment> <region>
# μλ 볡ꡬ (μλ μ€ν¨μ)
terragrunt destroy --terragrunt-working-dir $ENV/regions/$REGION/$SERVICE/
terragrunt apply --terragrunt-working-dir $ENV/regions/$REGION/$SERVICE/
π νμ΅ λ¦¬μμ€β
νμ μ½κΈ°β
- Multi-Region μν€ν μ² - π μ 체 ꡬ쑰 μ΄ν΄ (10λΆ)
- Multi-Region κ΄λ¦¬ - π§ μΌμ μ΄μ λ°©λ² (15λΆ)
μν©λ³ κ°μ΄λβ
- λ°°ν¬ μ€ λ¬Έμ : λ°°ν¬ κ°μ΄λ
- μ΄μ μ€ λ¬Έμ : νΈλ¬λΈμν
- μ±λ₯ μ΄μ: μ±λ₯ νλ μΉμ
μ€μ΅ μμ β
κΈ°λ³Έ λ°°ν¬ μ€μ΅β
# 1. Dev νκ²½μ μλ‘μ΄ μλΉμ€ μΆκ°
mkdir infrastructure/terragrunt/dev/regions/europe-west3/new-service
# 2. κΈ°λ³Έ terragrunt.hcl μμ±
cat > infrastructure/terragrunt/dev/regions/europe-west3/new-service/terragrunt.hcl << EOF
include "root" {
path = find_in_parent_folders("root.hcl")
expose = true
}
terraform {
source = "../../../../terraform/modules/new-service"
}
locals {
region_vars = read_terragrunt_config("../region.hcl")
}
inputs = {
project_id = local.region_vars.locals.project_id
region = local.region_vars.locals.region
}
EOF
# 3. λ°°ν¬
terragrunt apply --terragrunt-working-dir dev/regions/europe-west3/new-service/
Cross-Region μ€μ μ€μ΅β
# 1. Asia regionμλ λμΌ μλΉμ€ λ°°ν¬
cp -r dev/regions/europe-west3/new-service dev/regions/asia-northeast3/
# 2. μμͺ½ regionμ λ°°ν¬
for region in europe-west3 asia-northeast3; do
terragrunt apply --terragrunt-working-dir dev/regions/$region/new-service/
done
π― 체ν¬λ¦¬μ€νΈβ
λ°°ν¬ μ 체ν¬λ¦¬μ€νΈβ
- Terragrunt/Terraform μ΅μ λ²μ μΈκ°?
- GCP νλ‘μ νΈκ° μμ±λμ΄ μλκ°?
- Service Account κΆνμ΄ μ€μ λμ΄ μλκ°?
- νμν APIsκ° νμ±νλμ΄ μλκ°?
-
terragrunt validateν΅κ³Όνλκ°?
λ°°ν¬ ν 체ν¬λ¦¬μ€νΈβ
- λͺ¨λ μλΉμ€κ° μ μ λμνλκ°?
- API μλν¬μΈνΈ μλ΅νλκ°?
- λ°μ΄ν°λ² μ΄μ€ μ°κ²°λλκ°?
- μ€μΌμ€λ¬κ° μ μ λμνλκ°?
- λͺ¨λν°λ§ λ©νΈλ¦μ΄ μμ§λλκ°?
λ¬Έμ λ°μμ 체ν¬λ¦¬μ€νΈβ
- μλ¬ λ©μμ§λ₯Ό μ νν νμΈνλκ°?
- λ‘κ·Έλ₯Ό νμΈν΄λ΄€λκ°?
- κΆν λ¬Έμ λ μλκ°?
- λ€νΈμν¬ μ°κ²°μ μ μμΈκ°?
- λ‘€λ°±μ΄ νμνκ°?
π μ±κ³΅ νμΈβ
λ°°ν¬ μ±κ³΅ μ§νβ
# β
μ±κ³΅ 체ν¬
echo "π Multi-Region Infrastructure Health Check"
# 1. λͺ¨λ API μλν¬μΈνΈ μλ΅
curl -f https://dta-wide-api-dev-eu-xxxxxxxx-ey.a.run.app/health # EU
curl -f https://dta-wide-api-dev-asia-xxxxxxxx-an.a.run.app/health # Asia
# 2. λ°μ΄ν°λ² μ΄μ€ μ°κ²°
gcloud sql connect db-dta-wide-dev-eu --project=dta-cloud-de-dev # EU DB
gcloud sql connect db-dta-wide-dev-asia --project=dta-cloud-dev # Asia DB
# 3. μ€μΌμ€λ¬ λμ
gcloud scheduler jobs list --project=dta-cloud-de-dev --location=europe-west3
gcloud scheduler jobs list --project=dta-cloud-dev --location=asia-northeast3
echo "β
All systems operational!"
μ±λ₯ κ²μ¦β
# μ§μ°μκ° μΈ‘μ
echo "β‘ Performance validation..."
# EU region
time curl -s https://dta-wide-api-dev-eu-xxxxxxxx-ey.a.run.app/health
# Asia region
time curl -s https://dta-wide-api-dev-asia-xxxxxxxx-an.a.run.app/health
echo "π Performance targets:"
echo " EU users: < 50ms β
"
echo " Asia users: < 100ms β
"
π λμ μμ²β
λ¬Έμ ν΄κ²° μμβ
- π λ¬Έμ νμΈ: μ΄ κ°μ΄λ λ° κ΄λ ¨ λ¬Έμ
- π λ‘κ·Έ νμΈ:
gcloud logging read ... - π§ͺ κ°λ¨ ν
μ€νΈ:
terragrunt validate,curlν μ€νΈ - π₯ ν λ¬Έμ: Slack #devops μ±λ
- π κΈ΄κΈ μν©: PagerDuty escalation
μ μ©ν λͺ λ Ήμ΄ λͺ¨μβ
# λΉ λ₯Έ μν 체ν¬
alias check-eu="terragrunt validate --terragrunt-working-dir dev/regions/europe-west3/"
alias check-asia="terragrunt validate --terragrunt-working-dir dev/regions/asia-northeast3/"
alias check-global="terragrunt validate --terragrunt-working-dir dev/global/"
# λΉ λ₯Έ λ°°ν¬
alias deploy-eu="terragrunt run-all apply --terragrunt-working-dir dev/regions/europe-west3/"
alias deploy-asia="terragrunt run-all apply --terragrunt-working-dir dev/regions/asia-northeast3/"
alias deploy-global="terragrunt run-all apply --terragrunt-working-dir dev/global/"
# λΉ λ₯Έ λ‘€λ°±
alias rollback-asia="git checkout HEAD~1 -- infrastructure/terragrunt/dev/regions/asia-northeast3/"
π― λ€μ λ¨κ³β
λ°°ν¬κ° μλ£λμλ€λ©΄:
- π μ±λ₯ λͺ¨λν°λ§ μ€μ
- π 보μ κ°ν
- π° λΉμ© μ΅μ ν
- π US Region νμ₯ κ³ν