Azure 백업 전략: RPO·RTO를 금액으로 역산하고 복구 시간을 실제로 재보기

Azure Backup으로 백업과 복구 전략 세우기

백업 설정은 대부분 이렇게 됩니다. Azure Backup을 켜고, 기본 정책(매일 1회, 30일 보관)을 그대로 쓰고, 초록색 체크가 뜨면 끝. 복구를 한 번도 해보지 않은 채 몇 년이 지납니다.

그러다 실제로 복구가 필요해지면 두 가지를 그때 알게 됩니다. 복구에 생각보다 오래 걸린다는 것, 그리고 백업 시점이 필요한 시점보다 훨씬 이전이라는 것입니다. 이 글은 그 두 숫자 — RPO와 RTO — 에서 거꾸로 백업 설계를 끌어내는 방법입니다.

RPO와 RTO를 실제 금액으로 정하기

용어부터 명확히 하겠습니다. 헷갈리면 설계가 어긋납니다.

  • RPO (Recovery Point Objective)얼마나 잃어도 되는가. 백업 주기가 결정합니다. 하루 1회 백업이면 최대 24시간치 데이터를 잃습니다
  • RTO (Recovery Time Objective)얼마나 빨리 복구해야 하는가. 복구 방식이 결정합니다

“둘 다 짧을수록 좋다”는 답은 쓸모가 없습니다. 짧게 만들수록 비용이 오르기 때문입니다. 중단 1시간당 손실 금액을 대략이라도 잡아야 판단이 가능합니다.

예를 들어 온라인 주문을 받는 서비스의 시간당 매출이 500만원이라고 하면, 이렇게 비교할 수 있습니다.

RTO 목표필요한 구성추가 비용 성격4시간 장애 시 손실
24시간Azure Backup 복원백업 스토리지만2,000만원
4시간Backup + 사전 준비된 스크립트거의 동일2,000만원
1시간Site Recovery (ASR)복제 대상 VM당 라이선스 + 스토리지500만원
수 분다중 리전 액티브-액티브인프라 2벌거의 없음

이렇게 놓고 보면 판단이 쉬워집니다. 연 1회 4시간 장애를 가정했을 때 손실이 2,000만원이고, ASR 비용이 연 500만원이라면 ASR이 남는 장사입니다. 반대로 사내 관리 시스템처럼 하루 멈춰도 손실이 크지 않다면 기본 백업으로 충분합니다.

중요한 건 모든 시스템에 같은 목표를 적용하지 않는 것입니다. 시스템별로 등급을 나누는 편이 현실적입니다.

등급대상RPORTO방식
Tier 1매출 직결 서비스15분1시간ASR + DB 지역 복제
Tier 2내부 업무 시스템24시간8시간Azure Backup (일 1회)
Tier 3개발·테스트1주상관없음IaC로 재생성

Tier 3에 주목하실 만합니다. 개발 환경은 백업하지 않는 것이 정답인 경우가 많습니다. Terraform이나 Bicep으로 언제든 다시 만들 수 있다면, 백업 스토리지 비용을 낼 이유가 없습니다.

백업 정책 만들기

Tier 2 기준으로 정책을 만들어보겠습니다. 기본 정책을 그대로 쓰지 않고, 보관 기간을 계층적으로 구성하는 게 핵심입니다.

#!/usr/bin/env bash
set -euo pipefail
RG="rg-backup-prod"
VAULT="rsv-prod-krc-01"

# Recovery Services 자격 증명 모음 생성
az backup vault create \
  --name "$VAULT" -g "$RG" --location koreacentral

# 중복 옵션: 지역 중복(GRS)이 기본. 리전 장애까지 대비
az backup vault backup-properties set \
  --name "$VAULT" -g "$RG" \
  --backup-storage-redundancy GeoRedundant

# VM 백업 활성화
az backup protection enable-for-vm \
  --vault-name "$VAULT" -g "$RG" \
  --vm "/subscriptions/<SUB>/resourceGroups/rg-prod-app/providers/Microsoft.Compute/virtualMachines/vm-api-prod-krc-01" \
  --policy-name DefaultPolicy

보관 정책은 일·주·월·연 단위를 조합하는 편이 비용 대비 효율적입니다. 매일 복구 지점을 1년간 들고 있을 필요는 없습니다.

{
  "schedulePolicy": {
    "schedulePolicyType": "SimpleSchedulePolicy",
    "scheduleRunFrequency": "Daily",
    "scheduleRunTimes": ["2026-08-01T18:00:00Z"]
  },
  "retentionPolicy": {
    "retentionPolicyType": "LongTermRetentionPolicy",
    "dailySchedule":   { "retentionDuration": { "count": 30,  "durationType": "Days"   } },
    "weeklySchedule":  { "retentionDuration": { "count": 12,  "durationType": "Weeks"  } },
    "monthlySchedule": { "retentionDuration": { "count": 12,  "durationType": "Months" } },
    "yearlySchedule":  { "retentionDuration": { "count": 7,   "durationType": "Years"  } }
  }
}

scheduleRunTimesUTC 기준이라는 점을 놓치기 쉽습니다. 위 예시의 18:00Z는 한국 시간 새벽 3시입니다. 이걸 모르고 03:00Z로 넣으면 한국 시간 정오에 백업이 돌아 업무 시간 성능에 영향을 줍니다.

복구 시간을 실제로 재본다

여기가 이 글에서 가장 강조하고 싶은 부분입니다. RTO는 문서에 적는 숫자가 아니라 측정하는 숫자입니다.

VM 복원은 단순히 파일을 되돌리는 게 아닙니다. 실제로는 이런 단계를 거칩니다.

  1. 복구 지점에서 디스크 복원 — 용량에 비례, 수십 분~수 시간
  2. 복원된 디스크로 VM 재생성
  3. 네트워크 재구성 — NIC, 공용 IP, 로드밸런서 백엔드 풀 등록
  4. 확장(Extension) 재설치 — 모니터링 에이전트, 백신 등
  5. 애플리케이션 기동 및 검증

1번만 생각하고 RTO를 잡으면 반드시 초과합니다. 3~5번이 실제로는 1번보다 오래 걸리는 경우가 흔합니다. 특히 로드밸런서 백엔드 풀 등록이나 DNS 반영을 수동으로 하면 시간이 크게 늘어납니다.

# 복구 지점 목록 확인
az backup recoverypoint list \
  --vault-name "$VAULT" -g "$RG" \
  --container-name "vm-api-prod-krc-01" \
  --item-name "vm-api-prod-krc-01" \
  --query "[].{time:properties.recoveryPointTime, type:properties.recoveryPointType}" \
  -o table

# 디스크만 복원 (가장 빠른 방식 - 이후 VM은 직접 생성)
az backup restore restore-disks \
  --vault-name "$VAULT" -g "$RG" \
  --container-name "vm-api-prod-krc-01" \
  --item-name "vm-api-prod-krc-01" \
  --rp-name "<RECOVERY_POINT_NAME>" \
  --storage-account "stbackupstaging001" \
  --target-resource-group "rg-restore-test"

# 복원 작업 진행 상황
az backup job list --vault-name "$VAULT" -g "$RG" \
  --query "[0].{op:properties.operation, status:properties.status, start:properties.startTime, duration:properties.duration}" \
  -o table

마지막 명령의 duration실측 RTO의 1단계 값입니다. 이걸 분기마다 한 번씩 재보고, 3~5단계를 더해서 실제 RTO를 산출하세요.

복구 훈련은 별도의 리소스 그룹(rg-restore-test)에 복원하면 운영에 영향을 주지 않습니다. 끝나면 리소스 그룹째 지우면 됩니다. 분기 1회, 한 시간이면 충분합니다.

백업이 지켜주지 못하는 것들

VM 백업을 켰다고 전부 보호되는 게 아닙니다. 아래는 별도로 챙겨야 하는 항목들입니다. 복구 상황에서 “이건 백업에 없네”를 발견하면 늦습니다.

대상VM 백업에 포함?필요한 조치
Azure SQL Database자체 자동 백업 + LTR 설정
Blob Storage버전 관리 + 지점 복원 활성화
Azure Files파일 공유 백업 별도 설정
Key Vault 시크릿소프트 삭제 + 제거 보호
AKS 클러스터 상태Velero 또는 AKS 백업
인프라 구성 자체IaC (Terraform/Bicep)

마지막 줄이 핵심입니다. VM 데이터는 복원했는데 네트워크·NSG·로드밸런서 설정이 없으면 서비스가 안 뜹니다. 인프라 구성을 코드로 관리하고 있어야 진짜 복구가 가능합니다. 백업 전략의 절반은 IaC라고 봐도 무방합니다.

Key Vault는 특히 주의

Key Vault를 실수로 지우면 그 안의 시크릿·키·인증서가 전부 사라집니다. 제거 보호(Purge Protection)를 켜두면 소프트 삭제 기간 동안 완전 삭제가 불가능해집니다.

az keyvault update \
  --name kv-api-prod-krc-01 -g rg-prod-app \
  --enable-purge-protection true \
  --retention-days 90

제거 보호는 한 번 켜면 끌 수 없습니다. 대신 실수로 인한 영구 삭제를 확실히 막아줍니다. 운영 Key Vault에는 켜두는 편이 맞습니다. 관련 내용은 Key Vault 시크릿 관리 글에 정리했습니다.

백업 비용이 예상보다 큰 이유

백업을 켜고 몇 달 뒤 청구서를 보면 생각보다 큰 경우가 있습니다. 세 가지 요인이 겹칩니다.

  • 보호된 인스턴스 요금 — VM 1대당 고정 요금이 붙습니다. 백업 용량과 무관합니다
  • 백업 스토리지 용량 — 여기서 GRS(지역 중복)는 LRS의 약 2배입니다
  • 보관 기간 — 연 단위 보관을 7년으로 잡으면 복구 지점이 계속 쌓입니다

두 번째가 판단이 필요한 지점입니다. GRS는 리전 전체가 날아가도 복구할 수 있게 해주지만, 비용이 두 배입니다. Tier 2 이하 시스템에는 LRS로 충분한 경우가 많습니다. 리전 장애까지 대비해야 하는 시스템이 실제로 몇 개인지 세어보시길 권합니다.

# 볼트별 백업 스토리지 사용량 확인
az backup vault list --query "[].{name:name, rg:resourceGroup, redundancy:properties.redundancySettings.standardTierStorageRedundancy}" -o table

# 백업 항목별 최근 복구 지점 크기 추이
az backup item list --vault-name "$VAULT" -g "$RG" \
  --query "[].{item:properties.friendlyName, lastBackup:properties.lastBackupTime, status:properties.lastBackupStatus}" \
  -o table

중복 옵션은 볼트를 만든 뒤 백업 항목이 하나라도 등록되면 변경할 수 없습니다. 처음에 정해야 합니다. 나중에 바꾸려면 볼트를 새로 만들고 백업을 다시 시작해야 하는데, 그러면 기존 복구 지점을 잃습니다.

백업 실패를 모르고 지나가지 않으려면

실무에서 가장 위험한 상황은 백업이 몇 주째 실패하고 있는데 아무도 모르는 것입니다. 포털에 들어가야만 보이는 상태로 두면 반드시 놓칩니다.

// Log Analytics - 지난 7일 백업 실패 항목
AddonAzureBackupJobs
| where TimeGenerated > ago(7d)
| where JobOperation == "Backup"
| summarize
    Total = count(),
    Failed = countif(JobStatus == "Failed"),
    LastRun = max(TimeGenerated)
  by BackupItemUniqueId
| where Failed > 0
| sort by Failed desc

이 쿼리를 경고 규칙으로 걸어두세요. 심각도는 Sev 2 정도가 적당합니다. 새벽에 깨울 일은 아니지만 다음 근무일에는 반드시 봐야 하는 항목입니다. 알림 설계 기준은 Monitor 알림 설계 글에 정리했습니다.

흔한 백업 실패 원인 세 가지도 함께 알아두면 대응이 빠릅니다.

  • VM이 할당 해제 상태 — 꺼진 VM은 백업이 실패하거나 크래시 일관성 스냅샷만 남습니다. 개발 VM 자동 종료와 백업 시각이 겹치면 자주 발생합니다
  • 디스크가 백업 중 확장됨 — 백업 진행 중 디스크 크기를 바꾸면 실패합니다
  • 확장(Extension) 오류 — VM 에이전트가 오래됐거나 응답하지 않는 경우. VM 안에서 에이전트 상태를 확인해야 합니다

첫 번째가 특히 흔합니다. 백업 시각을 자동 종료 시각보다 앞으로 옮기기만 해도 해결됩니다.

랜섬웨어 대비: 불변 볼트와 다단계 삭제

공격자가 침투하면 백업부터 지우려 합니다. 백업이 지워지면 몸값을 낼 수밖에 없기 때문입니다. Azure Backup에는 이를 막는 기능이 있고, 기본값이 아닌 것들이 있습니다.

  • 소프트 삭제 — 백업을 지워도 14일간 보관. 기본 활성화되어 있습니다
  • 다단계 인증(MUA) — 백업 삭제·정책 변경 같은 중요 작업에 별도 승인을 요구. 기본 비활성
  • 불변 볼트(Immutable Vault) — 보관 기간 단축이나 삭제를 원천 차단. 기본 비활성

운영 환경이라면 불변 볼트를 켜는 것을 권합니다. 다만 켜면 보관 기간을 줄일 수 없게 되므로, 정책이 확정된 뒤에 적용하세요.

# 백업 항목의 소프트 삭제 상태 확인
az backup vault backup-properties show \
  --name "$VAULT" -g "$RG" \
  --query "{softDelete:softDeleteFeatureState, redundancy:storageModelType}" -o table

정리

  1. 중단 1시간당 손실을 잡고 RPO·RTO를 역산한다 (감이 아니라 금액으로)
  2. 시스템을 3등급으로 나눈다. 개발 환경은 백업 대신 IaC 재생성
  3. 보관은 일·주·월·연 계층으로 구성한다 (스케줄은 UTC 주의)
  4. 분기 1회 별도 리소스 그룹에 복구 훈련을 하고 시간을 잰다
  5. VM 백업에 포함되지 않는 것들(DB·Blob·Key Vault·인프라 구성)을 별도로 챙긴다
  6. 운영 볼트에는 불변 볼트와 MUA를 켠다

백업의 목적은 백업을 남기는 게 아니라 복구에 성공하는 것입니다. 한 번도 복구해보지 않은 백업은 아직 백업이 아닙니다. 비용 측면은 Blob Storage 수명 주기 정책과 함께 보시면 보관 비용을 함께 최적화할 수 있습니다.

댓글 남기기