๐ ๏ธ Multi-Region Infrastructure ํธ๋ฌ๋ธ์ํ ๊ฐ์ด๋
๐ ๊ฐ์โ
Multi-Region Infrastructure ์ด์ ์ค ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ค๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ ๊ฐ์ด๋์ ๋๋ค.
๐จ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋คโ
Configuration ๋ฌธ์ โ
โ ๋ฌธ์ : "No such file or directory" - config ๋ก๋ฉ ์คํจโ
Error: Error in function call
โ
โ on terragrunt.hcl line 5, in locals:
โ 5: region_vars = read_terragrunt_config("../region.hcl")
โ
โ Call to function "read_terragrunt_config" failed:
โ No such file or directory: ../region.hcl
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ํ์ผ ์กด์ฌ ์ฌ๋ถ ํ์ธ
ls -la ../region.hcl
# 2. ๊ฒฝ๋ก ์์ (depth ํ์ธ)
# regions/`[region]`/`[service]`/terragrunt.hcl โ ../region.hcl
# regions/`[region]`/`[service]`/`[subservice]`/terragrunt.hcl โ ../../region.hcl
# 3. ์ฌ๋ฐ๋ฅธ ๊ฒฝ๋ก๋ก ์์
locals {
region_vars = read_terragrunt_config("../../region.hcl") # depth์ ๋ง๊ฒ ์กฐ์
}
โ ๋ฌธ์ : ์ํ ์ฐธ์กฐ (Circular Reference)โ
Error: Cycle in local value dependencies
โ
โ on terragrunt.hcl line 10, in locals:
โ 10: project = "${local.project}"
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# โ ์๋ชป๋ ์ค์
locals {
project = "${local.project}" # ์๊ธฐ ์์ ์ฐธ์กฐ!
}
# โ
์ฌ๋ฐ๋ฅธ ์ค์
locals {
region_vars = read_terragrunt_config("../region.hcl")
project = local.region_vars.locals.project_id
}
โ ๋ฌธ์ : Project ID ๋ถ์ผ์นโ
Error: googleapi: Error 403: Project dta-cloud-de-dev is not found and cannot be created
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ํ๋ก์ ํธ ์กด์ฌ ํ์ธ
gcloud projects list --filter="projectId:dta-cloud-*"
# 2. ํ๋ก์ ํธ ์์ฑ (์๋ ๊ฒฝ์ฐ)
gcloud projects create dta-cloud-dev \
--organization=778204568675
# 3. Billing ๊ณ์ ์ฐ๊ฒฐ
gcloud billing projects link dta-cloud-dev \
--billing-account=01A3DE-04193F-06C496
# 4. ํ์ํ APIs ํ์ฑํ
gcloud services enable compute.googleapis.com --project=dta-cloud-dev
๊ถํ ๋ฌธ์ โ
โ ๋ฌธ์ : Service Account ๊ถํ ๋ถ์กฑโ
Error: googleapi: Error 403: Insufficient permissions to access project dta-cloud-dev
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ํ์ฌ ๊ถํ ํ์ธ
gcloud projects get-iam-policy dta-cloud-dev
# 2. Terraform Service Account ๊ถํ ๋ถ์ฌ
gcloud projects add-iam-policy-binding dta-cloud-dev \
--member="serviceAccount:terraform@dta-cloud-de-dev.iam.gserviceaccount.com" \
--role="roles/editor"
# 3. ์ถ๊ฐ ๊ถํ (ํ์ํ ๊ฒฝ์ฐ)
gcloud projects add-iam-policy-binding dta-cloud-dev \
--member="serviceAccount:terraform@dta-cloud-de-dev.iam.gserviceaccount.com" \
--role="roles/storage.admin"
โ ๋ฌธ์ : Cross-Project ๊ถํ ๋ฌธ์ โ
Error: Error creating service: googleapi: Error 400:
The service account dta-wide-api@dta-cloud-dev.iam.gserviceaccount.com
does not have permission to access BigQuery in project dta-cloud-de-dev
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# Asia region Service Account๊ฐ EU BigQuery ์ ๊ทผํ๋๋ก ๊ถํ ๋ถ์ฌ
gcloud projects add-iam-policy-binding dta-cloud-de-dev \
--member="serviceAccount:dta-wide-api@dta-cloud-dev.iam.gserviceaccount.com" \
--role="roles/bigquery.dataViewer"
# PubSub ํฌ๋ก์ค ์ก์ธ์ค ๊ถํ
gcloud projects add-iam-policy-binding dta-cloud-de-dev \
--member="serviceAccount:dta-wide-api@dta-cloud-dev.iam.gserviceaccount.com" \
--role="roles/pubsub.subscriber"
๋คํธ์ํฌ ๋ฌธ์ โ
โ ๋ฌธ์ : VPC Connector IP ์ถฉ๋โ
Error: Error creating VPC Connector: googleapi: Error 400:
IP range 10.8.0.0/28 conflicts with existing subnet
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ๊ธฐ์กด CIDR ๋ฒ์ ํ์ธ
gcloud compute networks subnets list \
--project=dta-cloud-dev \
--filter="region:asia-northeast3"
# 2. ์ฌ์ฉ ๊ฐ๋ฅํ IP ๋ฒ์ ์ฐพ๊ธฐ
gcloud compute networks list-available-ranges \
--project=dta-cloud-dev \
--network=dta-cloud-dev-vpc \
--range-type=vpc-connector
# 3. ์ฌ๋ฐ๋ฅธ CIDR๋ก ์์
# vpc-connector/terragrunt.hcl
ip_cidr_range = "10.9.0.0/28" # ์ถฉ๋ํ์ง ์๋ ๋ฒ์
โ ๋ฌธ์ : ๋ฐฉํ๋ฒฝ ๊ท์น ์ถฉ๋โ
Error: Error creating firewall rule: googleapi: Error 409:
The resource 'allow-ssh' already exists
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ๊ธฐ์กด ๊ท์น ํ์ธ
gcloud compute firewall-rules list \
--project=dta-cloud-dev \
--filter="name=allow-ssh"
# 2. ๊ธฐ์กด ๊ท์น ์ญ์ ๋๋ ์ด๋ฆ ๋ณ๊ฒฝ
gcloud compute firewall-rules delete allow-ssh \
--project=dta-cloud-dev
# 3. ๋๋ region๋ณ ๊ณ ์ ์ด๋ฆ ์ฌ์ฉ
rule_name = "allow-ssh-${local.region_vars.locals.region_config.location}"
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฌธ์ โ
โ ๋ฌธ์ : Cloud SQL ์ฐ๊ฒฐ ์คํจโ
Error: Error connecting to Cloud SQL: pq: connection refused
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. Cloud SQL ์ธ์คํด์ค ์ํ ํ์ธ
gcloud sql instances describe db-dta-wide-dev-asia \
--project=dta-cloud-dev
# 2. ๋คํธ์ํฌ ์ฐ๊ฒฐ ํ์ธ
gcloud sql instances describe db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--format="value(ipAddresses[].ipAddress)"
# 3. VPC ํผ์ด๋ง ํ์ธ
gcloud services vpc-peerings list \
--network=dta-cloud-dev-vpc \
--project=dta-cloud-dev
# 4. Private IP ์ค์ ํ์ธ
gcloud compute addresses list \
--project=dta-cloud-dev \
--global \
--filter="purpose=VPC_PEERING"
โ ๋ฌธ์ : ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ๋ถ์ผ์นโ
Error: Error upgrading database:
Cannot upgrade from POSTGRES_15 to POSTGRES_16 directly
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ํ์ฌ ๋ฒ์ ํ์ธ
gcloud sql instances describe db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--format="value(databaseVersion)"
# 2. ์ง์๋๋ ์
๊ทธ๋ ์ด๋ ๊ฒฝ๋ก ํ์ธ
gcloud sql instances upgrade db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--database-version=POSTGRES_16 \
--dry-run
# 3. ๋ฐฑ์
ํ ์
๊ทธ๋ ์ด๋
gcloud sql backups create \
--instance=db-dta-wide-dev-asia \
--project=dta-cloud-dev
gcloud sql instances upgrade db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--database-version=POSTGRES_16
๐ Regional ์ฅ์ ๋์โ
Europe Region ์ฅ์ โ
์ฅ์ ๊ฐ์งโ
# 1. Europe region ์ํ ํ์ธ
./scripts/health-check.sh dev europe-west3
# 2. ๋ก๋๋ฐธ๋ฐ์์์ EU ์ ์ธ
gcloud compute backend-services update dta-wide-backend \
--project=dta-cloud-de-dev \
--remove-backends=europe-west3-neg
# 3. ํธ๋ํฝ์ Asia๋ก ์ฐํ
gcloud compute url-maps edit dta-wide-global-lb \
--project=dta-cloud-de-dev
๋ณต๊ตฌ ์ ์ฐจโ
# 1. ์๋น์ค ์ฌ์์
terragrunt apply --terragrunt-working-dir dev/regions/europe-west3/
# 2. ๋ฐ์ดํฐ ์ผ๊ด์ฑ ํ์ธ
./scripts/verify-data-consistency.sh
# 3. ํธ๋ํฝ ์ ์ง์ ๋ณต์
gcloud compute backend-services update dta-wide-backend \
--project=dta-cloud-de-dev \
--add-backends=europe-west3-neg
Asia Region ์ฅ์ โ
์ฅ์ ๊ฐ์ง ๋ฐ ๋์โ
# 1. Asia region ์ํ ํ์ธ
./scripts/health-check.sh dev asia-northeast3
# 2. EU์์ Asia ์ฌ์ฉ์ ์์ ์ฒ๋ฆฌ
# (Load Balancer ์ค์ ์์ )
# 3. ๋ฐ์ดํฐ ๋ณต๊ตฌ
gcloud sql import sql db-dta-wide-dev-asia \
gs://backup-bucket/latest-eu-backup.sql \
--project=dta-cloud-dev
Cross-Region ๋ฐ์ดํฐ ๋ถ์ผ์นโ
๋ฌธ์ ๊ฐ์งโ
#!/bin/bash
# detect-data-inconsistency.sh
echo "๐ Checking data consistency..."
# EU ๋ฐ์ดํฐ ์นด์ดํธ
EU_USERS=$(gcloud sql execute-sql db-dta-wide-dev-eu \
--project=dta-cloud-de-dev \
--sql="SELECT COUNT(*) FROM users;" \
--format="value(result[0].value)")
# Asia ๋ฐ์ดํฐ ์นด์ดํธ
ASIA_USERS=$(gcloud sql execute-sql db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--sql="SELECT COUNT(*) FROM users;" \
--format="value(result[0].value)")
DIFF=$((EU_USERS - ASIA_USERS))
if [[ $DIFF -gt 100 ]]; then
echo "๐จ Data inconsistency detected!"
echo "EU: $EU_USERS users"
echo "Asia: $ASIA_USERS users"
echo "Difference: $DIFF users"
# ์๋ ๋๊ธฐํ ํธ๋ฆฌ๊ฑฐ
./scripts/trigger-data-sync.sh
fi
๋ฐ์ดํฐ ๋๊ธฐํ ๋ณต๊ตฌโ
#!/bin/bash
# recover-data-sync.sh
echo "๐ Recovering data synchronization..."
# 1. ์ต์ EU ๋ฐฑ์
์ผ๋ก Asia ๋ณต๊ตฌ
LATEST_BACKUP=$(gcloud sql backups list \
--instance=db-dta-wide-dev-eu \
--project=dta-cloud-de-dev \
--limit=1 \
--format="value(id)")
gcloud sql backups restore $LATEST_BACKUP \
--restore-instance=db-dta-wide-dev-asia \
--project=dta-cloud-dev
# 2. ์ค์๊ฐ ๋๊ธฐํ ์ฌ์์
gcloud pubsub subscriptions delete asia-sync-subscription \
--project=dta-cloud-dev
gcloud pubsub subscriptions create asia-sync-subscription \
--topic=cross-region-sync \
--project=dta-cloud-dev
๐ฐ ๋น์ฉ ๊ด๋ จ ๋ฌธ์ โ
์์ ๋น์ฉ ์ด๊ณผโ
๋ฌธ์ ๊ฐ์งโ
# ํ์ฌ ๋น์ฉ ํ์ธ
gcloud billing budgets list \
--billing-account=01A3DE-04193F-06C496 \
--filter="displayName:DTA-Wide"
๋น์ฉ ์ต์ ํโ
#!/bin/bash
# cost-optimization.sh
echo "๐ฐ Cost optimization analysis..."
# 1. ์ฌ์ฉ๋ฅ ์ด ๋ฎ์ ์ธ์คํด์ค ์ฐพ๊ธฐ
gcloud monitoring metrics list \
--filter="metric.type=cloudsql.googleapis.com/database/cpu/utilization" \
--project=dta-cloud-dev
# 2. Scale-to-zero ์ค์ (Asia region)
gcloud run services update dta-wide-api \
--region=asia-northeast3 \
--project=dta-cloud-dev \
--min-instances=0
# 3. ์์ ์ธ์คํด์ค๋ก ๋ค์ด๊ทธ๋ ์ด๋ (ํ์์)
gcloud sql instances patch db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--tier=db-g1-small
๋ฆฌ์์ค ํ ๋น๋ ์ด๊ณผโ
โ ๋ฌธ์ : Quota ์ด๊ณผโ
Error: googleapi: Error 429: Quota exceeded for quota metric 'CPU'
and limit 'Regional CPU quota' of service 'compute.googleapis.com'
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ํ์ฌ ํ ๋น๋ ํ์ธ
gcloud compute project-info describe \
--project=dta-cloud-dev \
--format="table(quotas.metric,quotas.limit,quotas.usage)"
# 2. ํ ๋น๋ ์ฆ๊ฐ ์์ฒญ
gcloud alpha compute quotas list \
--project=dta-cloud-dev \
--filter="metric:regional_cpu"
# 3. ์์ ํด๊ฒฐ: ๋ ์์ ์ธ์คํด์ค ์ฌ์ฉ
# terragrunt.hcl์์
machine_type = "e2-micro" # e2-standard-2 ๋์
๐ ๋คํธ์ํฌ ๋ฌธ์ โ
Cross-Region ์ฐ๊ฒฐ ๋ฌธ์ โ
โ ๋ฌธ์ : Region๊ฐ ํต์ ์คํจโ
# Asia์์ EU BigQuery ์ ๊ทผ ์คํจ
Error: Error querying BigQuery: Access denied to project dta-cloud-de-dev
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. Cross-project IAM ์ค์
gcloud projects add-iam-policy-binding dta-cloud-de-dev \
--member="serviceAccount:dta-wide-api@dta-cloud-dev.iam.gserviceaccount.com" \
--role="roles/bigquery.dataViewer"
# 2. VPC ํผ์ด๋ง ์ค์ (ํ์ํ ๊ฒฝ์ฐ)
gcloud compute networks peerings create eu-to-asia-peering \
--network=dta-cloud-de-dev-vpc \
--peer-project=dta-cloud-dev \
--peer-network=dta-cloud-dev-vpc \
--project=dta-cloud-de-dev
โ ๋ฌธ์ : DNS ํด์๋ ๋ฌธ์ โ
# ์๋น์ค ๊ฐ ์ด๋ฆ ํด์๋ ์คํจ
Error: Failed to resolve dta-wide-api-asia.internal
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. Cloud DNS ์ค์
gcloud dns managed-zones create dta-wide-internal \
--project=dta-cloud-dev \
--description="Internal DNS for DTA-Wide" \
--dns-name=dta-wide.internal \
--visibility=private \
--networks=dta-cloud-dev-vpc
# 2. DNS ๋ ์ฝ๋ ์ถ๊ฐ
gcloud dns record-sets create dta-wide-api-asia.dta-wide.internal \
--zone=dta-wide-internal \
--project=dta-cloud-dev \
--type=A \
--ttl=300 \
--rrdatas=<internal-ip>
Load Balancer ๋ฌธ์ โ
โ ๋ฌธ์ : ํธ๋ํฝ ๋ถ์ฐ ๋ถ๊ท ํโ
# ๋ชจ๋ ํธ๋ํฝ์ด EU๋ก๋ง ๊ฐ๋ ๊ฒฝ์ฐ
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. Backend ์๋น์ค ์ํ ํ์ธ
gcloud compute backend-services describe dta-wide-backend \
--global \
--project=dta-cloud-de-dev
# 2. Asia region backend ์ถ๊ฐ
gcloud compute backend-services add-backend dta-wide-backend \
--global \
--project=dta-cloud-dev \
--network-endpoint-group=dta-wide-asia-neg \
--network-endpoint-group-region=asia-northeast3
# 3. ํธ๋ํฝ ๋ถ์ฐ ์ ์ฑ
์ค์
gcloud compute backend-services update dta-wide-backend \
--global \
--project=dta-cloud-de-dev \
--load-balancing-scheme=EXTERNAL_MANAGED \
--locality-lb-policy=CLOSEST
๐ ์ฑ๋ฅ ๋ฌธ์ โ
์ง์ฐ์๊ฐ ๋ฌธ์ โ
โ ๋ฌธ์ : ์์๋ณด๋ค ๋์ ์ง์ฐ์๊ฐโ
# Asia region์์ 500ms+ ์ง์ฐ์๊ฐ ๋ฐ์
โ ์ง๋จ ๋ฐ ํด๊ฒฐ:
# 1. ๋คํธ์ํฌ ์ง์ฐ์๊ฐ ์ธก์
echo "๐ก Network latency test..."
curl -w "@curl-format.txt" -o /dev/null -s \
https://dta-wide-api-dev-asia-xxxxxxxx-an.a.run.app/health
# 2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ฑ๋ฅ ํ์ธ
gcloud sql operations list \
--instance=db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--filter="operationType=UPDATE OR operationType=INSERT" \
--limit=10
# 3. Cloud Run ์ฝ๋ ์คํํธ ์ต์ ํ
gcloud run services update dta-wide-api \
--region=asia-northeast3 \
--project=dta-cloud-dev \
--min-instances=1 # ์ฝ๋ ์คํํธ ๋ฐฉ์ง
# 4. Redis ์บ์ ํํธ์จ ํ์ธ
gcloud monitoring metrics list \
--filter="metric.type=redis.googleapis.com/stats/cache_hit_ratio" \
--project=dta-cloud-dev
์ฒ๋ฆฌ๋ ๋ฌธ์ โ
โ ๋ฌธ์ : Asia region ์ฒ๋ฆฌ๋ ๋ถ์กฑโ
# RPS(Requests Per Second) ์ ํ์ ๋๋ฌ
Error: Rate limit exceeded for Cloud Run service
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ํ์ฌ ์ฒ๋ฆฌ๋ ํ์ธ
gcloud monitoring metrics list \
--filter="metric.type=run.googleapis.com/request_count" \
--project=dta-cloud-dev
# 2. ์ธ์คํด์ค ์ ์ฆ๊ฐ
gcloud run services update dta-wide-api \
--region=asia-northeast3 \
--project=dta-cloud-dev \
--max-instances=20 \
--concurrency=100
# 3. CPU/๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ
gcloud run services update dta-wide-api \
--region=asia-northeast3 \
--project=dta-cloud-dev \
--cpu=2 \
--memory=4Gi
๐ ๋ณด์ ๋ฌธ์ โ
์ธ์ฆ ๋ฌธ์ โ
โ ๋ฌธ์ : Firebase ์ธ์ฆ ์คํจโ
# Asia region์์ Firebase ์ธ์ฆ ํ ํฐ ๊ฒ์ฆ ์คํจ
Error: Firebase ID token verification failed
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. Firebase ์ค์ ํ์ธ
gcloud firebase projects list
# 2. Asia region์ Firebase ํ๋ก์ ํธ ์ฐ๊ฒฐ
gcloud firebase projects addfirebase dta-cloud-dev
# 3. Service Account ํค ์
๋ฐ์ดํธ
gcloud iam service-accounts keys create firebase-key.json \
--iam-account=firebase-adminsdk@dta-cloud-dev.iam.gserviceaccount.com \
--project=dta-cloud-dev
# 4. Secret Manager์ ํค ์ ์ฅ
gcloud secrets create firebase-service-account-key \
--project=dta-cloud-dev \
--data-file=firebase-key.json
์ ๊ทผ ์ ์ด ๋ฌธ์ โ
โ ๋ฌธ์ : ๋ฌด๋จ ์ ๊ทผ ์๋โ
# ํ์ฉ๋์ง ์์ IP์์ ์ ๊ทผ ์๋
Warning: Unauthorized access attempt from IP x.x.x.x
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ๋ฐฉํ๋ฒฝ ๊ท์น ๊ฐํ
gcloud compute firewall-rules create deny-unauthorized-access \
--project=dta-cloud-dev \
--action=deny \
--rules=all \
--source-ranges=<suspicious-ip-range> \
--priority=100
# 2. Cloud Armor ์ค์
gcloud compute security-policies create dta-wide-armor-policy \
--project=dta-cloud-dev
gcloud compute security-policies rules create 100 \
--security-policy=dta-wide-armor-policy \
--project=dta-cloud-dev \
--action=deny-403 \
--src-ip-ranges=<malicious-ips>
# 3. ๋ก๊น
๊ฐํ
gcloud logging sinks create security-audit-sink \
bigquery.googleapis.com/projects/dta-cloud-de-dev/datasets/security_audit \
--log-filter='protoPayload.authenticationInfo.principalEmail!=""'
๐ ๋ฐ์ดํฐ ๋ณต๊ตฌโ
๋ฐ์ดํฐ ์์ค ๋์โ
โ ๋ฌธ์ : ์ค์๋ก ๋ฐ์ดํฐ ์ญ์ โ
# ์ฌ์ฉ์ ์ค์๋ก ์ค์ ํ
์ด๋ธ ์ญ์
Error: Table 'users' doesn't exist
โ ๋ณต๊ตฌ ์ ์ฐจ:
# 1. ์ฆ์ ์๋น์ค ์ค์ง (์ถ๊ฐ ์์ค ๋ฐฉ์ง)
gcloud run services update dta-wide-api \
--region=asia-northeast3 \
--project=dta-cloud-dev \
--max-instances=0
# 2. ์ต๊ทผ ๋ฐฑ์
ํ์ธ
gcloud sql backups list \
--instance=db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--limit=5
# 3. Point-in-time ๋ณต๊ตฌ
gcloud sql backups restore <backup-id> \
--restore-instance=db-dta-wide-dev-asia-recovery \
--project=dta-cloud-dev
# 4. ๋ฐ์ดํฐ ๊ฒ์ฆ ํ ์๋น์ค ์ฌ์์
# 5. ํ์์ Cross-region์์ ๋ฐ์ดํฐ ๋ณต๊ตฌ
๋ฐฑ์ ์์คํ ์ฅ์ โ
โ ๋ฌธ์ : ์๋ ๋ฐฑ์ ์คํจโ
# Cloud SQL ์๋ ๋ฐฑ์
์ด 7์ผ๊ฐ ์คํจ
Warning: Automated backups have been failing
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ๋ฐฑ์
์ค์ ํ์ธ
gcloud sql instances describe db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--format="value(settings.backupConfiguration)"
# 2. ์๋ ๋ฐฑ์
์์ฑ
gcloud sql backups create \
--instance=db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--description="Manual backup after auto-backup failure"
# 3. ๋ฐฑ์
์ค์ ์ฌ์ค์
gcloud sql instances patch db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--backup-start-time=03:00 \
--enable-bin-log
๐ง ๊ฐ๋ฐ ํ๊ฒฝ ๋ฌธ์ โ
๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝโ
โ ๋ฌธ์ : ๋ก์ปฌ์์ Asia DB ์ฐ๊ฒฐ ์คํจโ
Error: connection to server at "x.x.x.x", port 5432 failed
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. Cloud SQL Proxy ์ฌ์ฉ
./cloud_sql_proxy -instances=dta-cloud-dev:asia-northeast3:db-dta-wide-dev-asia=tcp:5432
# 2. ๋ฐฉํ๋ฒฝ ๊ท์น ์ถ๊ฐ (๊ฐ๋ฐ์ฉ)
gcloud sql instances patch db-dta-wide-dev-asia \
--project=dta-cloud-dev \
--authorized-networks=<your-ip>/32
# 3. VPN ์ฐ๊ฒฐ (๊ถ์ฅ)
gcloud compute vpn-gateways create dta-wide-vpn-gateway \
--project=dta-cloud-dev \
--region=asia-northeast3
โ ๋ฌธ์ : Terragrunt ๋ก์ปฌ ์คํ ์คํจโ
Error: The state file is locked by another Terragrunt process
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. Lock ์ํ ํ์ธ
terragrunt state list --terragrunt-working-dir dev/regions/asia-northeast3/cloudsql/
# 2. Force unlock (์ฃผ์!)
terragrunt force-unlock <lock-id> \
--terragrunt-working-dir dev/regions/asia-northeast3/cloudsql/
# 3. ์บ์ ์ ๋ฆฌ
find . -name ".terragrunt-cache" -exec rm -rf {} +
๐ ๋ชจ๋ํฐ๋ง ๋ฌธ์ โ
๋ฉํธ๋ฆญ ์์ง ์คํจโ
โ ๋ฌธ์ : OTEL Collector ๋์ ์ํจโ
Error: No metrics received from asia-northeast3 region
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. OTEL Collector ๋ก๊ทธ ํ์ธ
gcloud logging read \
'resource.type="cloud_run_revision" AND resource.labels.service_name="otel-collector-dev"' \
--project=dta-cloud-dev \
--limit=50
# 2. ๋คํธ์ํฌ ์ฐ๊ฒฐ ํ์ธ
gcloud run services describe otel-collector-dev \
--region=asia-northeast3 \
--project=dta-cloud-dev \
--format="value(status.address.url)"
# 3. VPC Connector ์ค์ ํ์ธ
gcloud compute networks vpc-access connectors describe \
dta-cloud-dev-asia \
--region=asia-northeast3 \
--project=dta-cloud-dev
์๋ฆผ ์์คํ ๋ฌธ์ โ
โ ๋ฌธ์ : ์๋ฆผ์ด ์ค์ง ์์โ
# ์ฅ์ ๋ฐ์ํด๋ ์๋ฆผ ์์
โ ํด๊ฒฐ๋ฐฉ๋ฒ:
# 1. ์๋ฆผ ์ฑ๋ ํ์ธ
gcloud alpha monitoring channels list \
--project=dta-cloud-de-dev
# 2. ์๋ฆผ ์ ์ฑ
ํ์ธ
gcloud alpha monitoring policies list \
--project=dta-cloud-de-dev \
--filter="displayName:Multi-Region"
# 3. ํ
์คํธ ์๋ฆผ ๋ฐ์ก
gcloud alpha monitoring policies test \
--policy=<policy-name> \
--project=dta-cloud-de-dev
๐ ๏ธ ๋๋ฒ๊น ๋๊ตฌโ
๋ก๊ทธ ๋ถ์โ
Multi-Region ๋ก๊ทธ ํตํฉ ์ฟผ๋ฆฌโ
# ๋ชจ๋ region ์๋ฌ ๋ก๊ทธ ํตํฉ ํ์ธ
gcloud logging read '
(resource.labels.project_id="dta-cloud-de-dev" OR resource.labels.project_id="dta-cloud-dev") AND
severity>=ERROR AND
timestamp>="2024-01-20T00:00:00Z"
' --limit=100 --format=json
ํน์ ์๋น์ค ๋๋ฒ๊น โ
# Cloud Run ์์ธ ๋ก๊ทธ
gcloud logging read '
resource.type="cloud_run_revision" AND
resource.labels.service_name="dta-wide-api" AND
resource.labels.location="asia-northeast3"
' --limit=50
์ํ ์ง๋จ ์คํฌ๋ฆฝํธโ
์ข ํฉ ํฌ์ค์ฒดํฌโ
#!/bin/bash
# comprehensive-health-check.sh
ENVIRONMENT=$1
echo "๐ฅ Comprehensive Health Check for $ENVIRONMENT"
# Region๋ณ ์ํ ์ฒดํฌ ํจ์
check_region_health() {
local region=$1
local project=$2
echo "๐ Checking $region ($project)..."
# Cloud Run ์ํ
CLOUD_RUN_STATUS=$(gcloud run services list \
--project=$project \
--region=$region \
--filter="metadata.name=dta-wide-api" \
--format="value(status.conditions[0].status)")
# Cloud SQL ์ํ
CLOUDSQL_STATUS=$(gcloud sql instances list \
--project=$project \
--filter="region:$region" \
--format="value(state)")
# Memorystore ์ํ
REDIS_STATUS=$(gcloud redis instances list \
--project=$project \
--region=$region \
--format="value(state)")
echo " Cloud Run: $CLOUD_RUN_STATUS"
echo " Cloud SQL: $CLOUDSQL_STATUS"
echo " Redis: $REDIS_STATUS"
# ์ ์ฒด ์ํ ๋ฐํ
if [[ "$CLOUD_RUN_STATUS" == "True" && "$CLOUDSQL_STATUS" == "RUNNABLE" && "$REDIS_STATUS" == "READY" ]]; then
echo " โ
$region: HEALTHY"
return 0
else
echo " โ $region: UNHEALTHY"
return 1
fi
}
# ํ๊ฒฝ๋ณ ํ๋ก์ ํธ ๋งคํ
case $ENVIRONMENT in
"dev")
EU_PROJECT="dta-cloud-de-dev"
ASIA_PROJECT="dta-cloud-dev"
;;
"stage")
EU_PROJECT="dta-cloud-de-stage"
ASIA_PROJECT="dta-cloud-stage"
;;
"prod")
EU_PROJECT="dta-cloud-de-prod"
ASIA_PROJECT="dta-cloud-prod"
;;
esac
# ์ ์ฒด ์ํ ์ฒดํฌ
OVERALL_STATUS=0
check_region_health "europe-west3" $EU_PROJECT || OVERALL_STATUS=1
check_region_health "asia-northeast3" $ASIA_PROJECT || OVERALL_STATUS=1
if [[ $OVERALL_STATUS -eq 0 ]]; then
echo "๐ Overall Status: HEALTHY"
else
echo "๐จ Overall Status: ISSUES DETECTED"
exit 1
fi
์ฑ๋ฅ ๋ถ์ ๋๊ตฌโ
์ง์ฐ์๊ฐ ๋ถ์โ
#!/bin/bash
# latency-analysis.sh
echo "โก Multi-Region Latency Analysis"
# EU region ์ง์ฐ์๊ฐ
echo "๐ช๐บ Europe Region Latency:"
for i in {1..5}; do
curl -w "Response time: %{time_total}s\n" -o /dev/null -s \
https://dta-wide-api-dev-eu-xxxxxxxx-ey.a.run.app/health
done
# Asia region ์ง์ฐ์๊ฐ
echo "๐ฐ๐ท Asia Region Latency:"
for i in {1..5}; do
curl -w "Response time: %{time_total}s\n" -o /dev/null -s \
https://dta-wide-api-dev-asia-xxxxxxxx-an.a.run.app/health
done
๐ ๋ฌธ์ ํด๊ฒฐ ์ฒดํฌ๋ฆฌ์คํธโ
์ผ๋ฐ์ ์ธ ์ง๋จ ์์โ
-
๐ ๋ฌธ์ ์๋ณ
- ์๋ฌ ๋ฉ์์ง ์ ํํ ํ์
- ๋ฐ์ ์๊ฐ ๋ฐ ํจํด ํ์ธ
- ์ํฅ ๋ฒ์ ํ์ธ (ํน์ region? ์ ์ฒด?)
-
๐ ์ํ ํ์ธ
-
./scripts/health-check.sh [env] [region] - Terragrunt validate ์คํ
- GCP Console์์ ์๋น์ค ์ํ ํ์ธ
-
-
๐ง ๊ธฐ๋ณธ ํด๊ฒฐ
- ์๋น์ค ์ฌ์์
- ์บ์ ํด๋ฆฌ์ด
- ์ค์ ์ฌ์ ์ฉ
-
๐จ ๊ธด๊ธ ๋์
- ํธ๋ํฝ ์ฐํ (ํ์์)
- ๋กค๋ฐฑ ์คํ (์ฌ๊ฐํ ๊ฒฝ์ฐ)
- ํ ์๋ฆผ ๋ฐ ์ํฉ ๊ณต์
-
๐ ๋ณต๊ตฌ ํ์ธ
- ์๋น์ค ์ ์ ๋์ ํ์ธ
- ์ฑ๋ฅ ๋ฉํธ๋ฆญ ์ ์ ํ์ธ
- ์ฌ์ฉ์ ์ํฅ๋ ํ์ธ
๊ธด๊ธ ์ํฉ ์ฐ๋ฝ์ฒโ
| ์ญํ | ๋ด๋น์ | ์ฐ๋ฝ์ฒ | ๋์ ๋ฒ์ |
|---|---|---|---|
| Primary DevOps | bok@weltcorp.com | Slack: @bok | ์ ์ฒด ์ธํ๋ผ |
| Database Admin | db-admin@weltcorp.com | Phone: +49-xxx | Cloud SQL, ๋ฐ์ดํฐ |
| Network Admin | network@weltcorp.com | Slack: @network | VPC, ๋คํธ์ํน |
| Security Admin | security@weltcorp.com | Phone: +49-xxx | ๋ณด์, IAM |
๐ ๊ด๋ จ ๋ฌธ์โ
- Multi-Region ์ํคํ ์ฒ: ์ ์ฒด ๊ตฌ์กฐ ๋ฐ ์ค๊ณ
- Multi-Region ๊ด๋ฆฌ ๊ฐ์ด๋: ์ผ์์ ์ธ ๊ด๋ฆฌ ๋ฐฉ๋ฒ
- Terraform ๊ฐ์ด๋: Terraform ๋ชจ๋ ์ฌ์ฉ๋ฒ
- ๋คํธ์ํฌ ๊ฐ์ด๋: VPC ๋คํธ์ํฌ ๊ด๋ฆฌ
- Cloud SQL ๊ฐ์ด๋: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ
๐ง ๋ฌธ์: DevOps Team (bok@weltcorp.com)
๐ ๊ธด๊ธ ์ํฉ: PagerDuty Escalation