๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿ› ๏ธ 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

๐Ÿ“‹ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ฒดํฌ๋ฆฌ์ŠคํŠธโ€‹

์ผ๋ฐ˜์ ์ธ ์ง„๋‹จ ์ˆœ์„œโ€‹

  1. ๐Ÿ” ๋ฌธ์ œ ์‹๋ณ„

    • ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ •ํ™•ํžˆ ํŒŒ์•…
    • ๋ฐœ์ƒ ์‹œ๊ฐ„ ๋ฐ ํŒจํ„ด ํ™•์ธ
    • ์˜ํ–ฅ ๋ฒ”์œ„ ํ™•์ธ (ํŠน์ • region? ์ „์ฒด?)
  2. ๐Ÿ“Š ์ƒํƒœ ํ™•์ธ

    • ./scripts/health-check.sh [env] [region]
    • Terragrunt validate ์‹คํ–‰
    • GCP Console์—์„œ ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ
  3. ๐Ÿ”ง ๊ธฐ๋ณธ ํ•ด๊ฒฐ

    • ์„œ๋น„์Šค ์žฌ์‹œ์ž‘
    • ์บ์‹œ ํด๋ฆฌ์–ด
    • ์„ค์ • ์žฌ์ ์šฉ
  4. ๐Ÿšจ ๊ธด๊ธ‰ ๋Œ€์‘

    • ํŠธ๋ž˜ํ”ฝ ์šฐํšŒ (ํ•„์š”์‹œ)
    • ๋กค๋ฐฑ ์‹คํ–‰ (์‹ฌ๊ฐํ•œ ๊ฒฝ์šฐ)
    • ํŒ€ ์•Œ๋ฆผ ๋ฐ ์ƒํ™ฉ ๊ณต์œ 
  5. ๐Ÿ”„ ๋ณต๊ตฌ ํ™•์ธ

    • ์„œ๋น„์Šค ์ •์ƒ ๋™์ž‘ ํ™•์ธ
    • ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ ์ •์ƒ ํ™•์ธ
    • ์‚ฌ์šฉ์ž ์˜ํ–ฅ๋„ ํ™•์ธ

๊ธด๊ธ‰ ์ƒํ™ฉ ์—ฐ๋ฝ์ฒ˜โ€‹

์—ญํ• ๋‹ด๋‹น์ž์—ฐ๋ฝ์ฒ˜๋Œ€์‘ ๋ฒ”์œ„
Primary DevOpsbok@weltcorp.comSlack: @bok์ „์ฒด ์ธํ”„๋ผ
Database Admindb-admin@weltcorp.comPhone: +49-xxxCloud SQL, ๋ฐ์ดํ„ฐ
Network Adminnetwork@weltcorp.comSlack: @networkVPC, ๋„คํŠธ์›Œํ‚น
Security Adminsecurity@weltcorp.comPhone: +49-xxx๋ณด์•ˆ, IAM

๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œโ€‹


๐Ÿ“ง ๋ฌธ์˜: DevOps Team (bok@weltcorp.com)
๐Ÿ†˜ ๊ธด๊ธ‰ ์ƒํ™ฉ: PagerDuty Escalation