AWS Backup ile Merkezi Yedekleme Yönetimi

Onlarca EC2 instance, RDS veritabanı, EFS dosya sistemi ve DynamoDB tablosu yönetiyorsanız, her servis için ayrı ayrı yedekleme politikası oluşturmak gerçekten bir kabus haline gelebilir. AWS Backup tam da bu noktada devreye giriyor: tek bir merkezden tüm AWS kaynaklarınızın yedeklerini yönetmenizi sağlayan, politika tabanlı bir hizmet. Bu yazıda AWS Backup’ı sıfırdan kurup production ortamına uygun hale getireceğiz.

AWS Backup Nedir ve Neden Kullanmalısınız?

AWS Backup, farklı AWS hizmetlerindeki yedekleme işlemlerini merkezileştiren, tamamen yönetilen bir servistir. EC2, RDS, Aurora, DynamoDB, EFS, FSx, S3 ve hatta on-premises Storage Gateway verilerini tek çatı altında yönetebilirsiniz.

Klasik yaklaşımda her servisin kendi snapshot mekanizması var: RDS için automated backups, EC2 için AMI veya EBS snapshots, EFS için AWS Backup veya kopyalama scriptleri. Bu dağınıklık hem yönetim yükü yaratıyor hem de uyumluluk (compliance) gereksinimlerini karşılamayı zorlaştırıyor. SOC2, HIPAA veya ISO 27001 gereksinimleriniz varsa, merkezi bir yedekleme yönetim aracı artık bir lüks değil zorunluluk.

AWS Backup’ın sunduğu temel avantajlar:

  • Tek konsoldan tüm kaynakların yedekleme durumunu görme
  • Tag tabanlı otomatik kaynak keşfi ve dahil etme
  • Cross-region ve cross-account yedek kopyalama
  • Değiştirilemez (immutable) yedekler için Vault Lock özelliği
  • AWS Organizations entegrasyonu ile çoklu hesap yönetimi
  • Uyumluluk raporlaması ve audit trail

Temel Kavramlar

Başlamadan önce birkaç temel kavramı netleştirelim.

Backup Plan: Hangi kaynakların ne zaman ve nasıl yedekleneceğini tanımlayan politika. İçinde bir veya birden fazla kural barındırır.

Backup Rule: Yedekleme zamanlaması, retention süresi, hedef vault ve cross-region kopyalama gibi detayları içerir.

Backup Vault: Yedeklerin fiziksel olarak depolandığı şifreli konteyner. KMS anahtarlarıyla şifrelenir.

Recovery Point: Bir kaynağın belirli bir zamandaki yedeği. RDS için bu bir DB snapshot, EBS için bir volume snapshot anlamına gelir.

Backup Selection: Backup plan’ın hangi kaynaklara uygulanacağını belirler. Tag tabanlı veya ARN tabanlı seçim yapılabilir.

IAM Rolü ve Vault Oluşturma

Her şeyden önce AWS Backup’ın kullanacağı IAM rolünü ve yedek kasasını oluşturalım.

# AWS Backup service role oluşturma
aws iam create-role 
  --role-name AWSBackupDefaultServiceRole 
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "backup.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }'

# Gerekli managed policy'leri attach et
aws iam attach-role-policy 
  --role-name AWSBackupDefaultServiceRole 
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup

aws iam attach-role-policy 
  --role-name AWSBackupDefaultServiceRole 
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores

Şimdi production ve development için ayrı vault’lar oluşturalım. Ayrı vault kullanmak hem maliyet takibini hem de erişim kontrolünü kolaylaştırır.

# KMS anahtarı oluştur (production vault için)
aws kms create-key 
  --description "AWS Backup Production Vault Key" 
  --key-usage ENCRYPT_DECRYPT 
  --query 'KeyMetadata.KeyId' 
  --output text

# Çıktıdaki KeyId'yi not al, örnek: a1b2c3d4-e5f6-7890-abcd-ef1234567890
KEY_ID="a1b2c3d4-e5f6-7890-abcd-ef1234567890"

# KMS key alias ekle
aws kms create-alias 
  --alias-name alias/backup-production-vault-key 
  --target-key-id $KEY_ID

# Production backup vault oluştur
aws backup create-backup-vault 
  --backup-vault-name production-backup-vault 
  --encryption-key-arn arn:aws:kms:eu-west-1:123456789012:alias/backup-production-vault-key 
  --tags Environment=production,Team=platform

# Development vault oluştur (default şifreleme ile)
aws backup create-backup-vault 
  --backup-vault-name development-backup-vault 
  --tags Environment=development,Team=platform

Backup Plan Oluşturma

Gerçek bir senaryo üzerinden gidelim. Bir e-ticaret uygulaması yönetiyorsunuz. Veritabanları için günlük yedek ve 30 günlük retention, kritik dosya sistemleri için saatlik yedek ve 7 günlük retention, genel EC2 instance’ları için haftalık yedek ve 90 günlük retention istiyorsunuz. Ayrıca tüm production yedeklerinin Frankfurt’tan Ireland’a kopyalanmasını istiyorsunuz (bölgesel felaket senaryosu için).

# Backup plan JSON'ını oluştur
cat > ecommerce-backup-plan.json << 'EOF'
{
  "BackupPlanName": "ecommerce-production-plan",
  "Rules": [
    {
      "RuleName": "daily-database-backup",
      "TargetBackupVaultName": "production-backup-vault",
      "ScheduleExpression": "cron(0 3 * * ? *)",
      "StartWindowMinutes": 60,
      "CompletionWindowMinutes": 180,
      "Lifecycle": {
        "DeleteAfterDays": 30
      },
      "CopyActions": [
        {
          "DestinationBackupVaultArn": "arn:aws:backup:eu-west-1:123456789012:backup-vault:dr-backup-vault",
          "Lifecycle": {
            "DeleteAfterDays": 14
          }
        }
      ],
      "RecoveryPointTags": {
        "BackupType": "daily",
        "Environment": "production"
      }
    },
    {
      "RuleName": "hourly-efs-backup",
      "TargetBackupVaultName": "production-backup-vault",
      "ScheduleExpression": "cron(0 * * * ? *)",
      "StartWindowMinutes": 30,
      "CompletionWindowMinutes": 120,
      "Lifecycle": {
        "DeleteAfterDays": 7
      },
      "RecoveryPointTags": {
        "BackupType": "hourly",
        "Environment": "production"
      }
    },
    {
      "RuleName": "weekly-ec2-backup",
      "TargetBackupVaultName": "production-backup-vault",
      "ScheduleExpression": "cron(0 1 ? * SUN *)",
      "StartWindowMinutes": 120,
      "CompletionWindowMinutes": 480,
      "Lifecycle": {
        "MoveToColdStorageAfterDays": 30,
        "DeleteAfterDays": 90
      },
      "RecoveryPointTags": {
        "BackupType": "weekly",
        "Environment": "production"
      }
    }
  ]
}
EOF

# Plan'ı oluştur
PLAN_ID=$(aws backup create-backup-plan 
  --backup-plan file://ecommerce-backup-plan.json 
  --tags Project=ecommerce,Environment=production 
  --query 'BackupPlanId' 
  --output text)

echo "Backup Plan ID: $PLAN_ID"

Backup Selection: Tag Tabanlı Kaynak Seçimi

Bu noktada en güçlü özelliklerden birine geliyoruz. Tag tabanlı seçim sayesinde yeni bir kaynak oluşturduğunuzda, doğru tag’i koymanız yeterli, otomatik olarak backup planına dahil edilir.

# Tag tabanlı selection oluştur - veritabanları için
aws backup create-backup-selection 
  --backup-plan-id $PLAN_ID 
  --backup-selection '{
    "SelectionName": "production-databases",
    "IamRoleArn": "arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole",
    "ListOfTags": [
      {
        "ConditionType": "STRINGEQUALS",
        "ConditionKey": "Environment",
        "ConditionValue": "production"
      },
      {
        "ConditionType": "STRINGEQUALS",
        "ConditionKey": "BackupTier",
        "ConditionValue": "database"
      }
    ]
  }'

# EC2 ve EFS için ayrı selection
aws backup create-backup-selection 
  --backup-plan-id $PLAN_ID 
  --backup-selection '{
    "SelectionName": "production-compute-storage",
    "IamRoleArn": "arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole",
    "ListOfTags": [
      {
        "ConditionType": "STRINGEQUALS",
        "ConditionKey": "Environment",
        "ConditionValue": "production"
      },
      {
        "ConditionType": "STRINGEQUALS",
        "ConditionKey": "ManagedBackup",
        "ConditionValue": "true"
      }
    ],
    "NotResources": [
      "arn:aws:rds:*:*:db:*"
    ]
  }'

Şimdi mevcut kaynaklarınıza bu tag’leri ekleyin:

# Bir RDS instance'ına backup tag'i ekle
aws rds add-tags-to-resource 
  --resource-name arn:aws:rds:eu-central-1:123456789012:db:ecommerce-prod-db 
  --tags Key=Environment,Value=production Key=BackupTier,Value=database

# Birden fazla EC2 instance'ına tag ekle
INSTANCE_IDS="i-0abc1234def56789 i-0xyz9876fed43210"
aws ec2 create-tags 
  --resources $INSTANCE_IDS 
  --tags Key=Environment,Value=production Key=ManagedBackup,Value=true

# EFS için tag ekle
aws efs create-tags 
  --file-system-id fs-01234567 
  --tags Key=Environment,Value=production Key=ManagedBackup,Value=true

Vault Lock ile Değiştirilemez Yedekler

Ransomware saldırıları veya yanlışlıkla silme senaryolarında yedeklerinizin de silinmesi büyük bir risk. Vault Lock özelliği, belirli bir süre içinde yedeklerin silinemeyeceğini garanti eder. Bu özellik compliance gereksinimleri için de kritik önem taşıyor.

# Vault Lock için önce compliance modunu belirle
# "GOVERNANCE" modu: yetkili kullanıcılar kilit kaldırabilir
# "COMPLIANCE" modu: bir kez kilitlenince KIMSE kaldıramaz (AWS Support dahil)

# Governance modu ile vault lock uygula (test için uygun)
aws backup put-backup-vault-lock-configuration 
  --backup-vault-name production-backup-vault 
  --min-retention-days 7 
  --max-retention-days 365 
  --changeable-for-days 3

# NOT: changeable-for-days süresi dolduktan sonra bu kilit COMPLIANCE moduna döner
# Compliance modunda hiç kimse kilidi kaldıramaz
# Production'da uygulamadan önce mutlaka test edin

# Vault lock durumunu kontrol et
aws backup describe-backup-vault 
  --backup-vault-name production-backup-vault 
  --query '{VaultName: BackupVaultName, LockStatus: Locked, MinRetentionDays: MinRetentionDays}'

On-Demand Yedek Alma ve İzleme

Kritik bir deployment öncesi veya önemli bir değişiklik öncesi manuel yedek almak iyi bir pratiktir.

# On-demand backup başlat
JOB_ID=$(aws backup start-backup-job 
  --backup-vault-name production-backup-vault 
  --resource-arn arn:aws:rds:eu-central-1:123456789012:db:ecommerce-prod-db 
  --iam-role-arn arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole 
  --start-window-minutes 60 
  --lifecycle '{"DeleteAfterDays": 30}' 
  --recovery-point-tags '{"BackupType":"pre-deployment","Triggered":"manual"}' 
  --query 'BackupJobId' 
  --output text)

echo "Backup Job başlatıldı: $JOB_ID"

# Job durumunu izle
watch_backup_job() {
  local job_id=$1
  while true; do
    STATUS=$(aws backup describe-backup-job 
      --backup-job-id $job_id 
      --query 'State' 
      --output text)
    echo "$(date): Job $job_id - Durum: $STATUS"
    if [ "$STATUS" = "COMPLETED" ] || [ "$STATUS" = "FAILED" ]; then
      break
    fi
    sleep 30
  done
}

watch_backup_job $JOB_ID

# Son 24 saatteki tüm backup job'larını listele
aws backup list-backup-jobs 
  --by-created-after $(date -d '24 hours ago' --iso-8601=seconds) 
  --query 'BackupJobs[*].{JobId:BackupJobId,Resource:ResourceArn,Status:State,StartTime:CreationDate}' 
  --output table

Geri Yükleme (Restore) İşlemi

Yedek almak kadar önemli olan şey, o yedeği başarıyla geri yükleyebilmektir. Bunu düzenli olarak test edin.

# Belirli bir kaynak için recovery point'leri listele
aws backup list-recovery-points-by-resource 
  --resource-arn arn:aws:rds:eu-central-1:123456789012:db:ecommerce-prod-db 
  --query 'RecoveryPoints[*].{RecoveryPointArn:RecoveryPointArn,CreationDate:CreationDate,Status:Status,Size:BackupSizeInBytes}' 
  --output table

# En son recovery point ARN'ını al
RECOVERY_POINT_ARN=$(aws backup list-recovery-points-by-resource 
  --resource-arn arn:aws:rds:eu-central-1:123456789012:db:ecommerce-prod-db 
  --query 'RecoveryPoints[0].RecoveryPointArn' 
  --output text)

# RDS restore metadata'sını hazırla
cat > restore-metadata.json << 'EOF'
{
  "DBInstanceIdentifier": "ecommerce-prod-db-restored",
  "DBInstanceClass": "db.r6g.large",
  "Engine": "mysql",
  "LicenseModel": "general-public-license",
  "MultiAZ": "false",
  "DBSubnetGroupName": "production-db-subnet-group",
  "VpcSecurityGroupIds": "sg-0abc1234567890def"
}
EOF

# Restore job başlat
RESTORE_JOB_ID=$(aws backup start-restore-job 
  --recovery-point-arn $RECOVERY_POINT_ARN 
  --metadata file://restore-metadata.json 
  --iam-role-arn arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole 
  --resource-type RDS 
  --query 'RestoreJobId' 
  --output text)

echo "Restore Job başlatıldı: $RESTORE_JOB_ID"

# Restore durumunu takip et
aws backup describe-restore-job 
  --restore-job-id $RESTORE_JOB_ID 
  --query '{Status:Status,CreatedResourceArn:CreatedResourceArn,PercentDone:PercentDone}'

CloudWatch ile Alarm ve Bildirim Kurulumu

Yedekleme başarısız olduğunda haberdar olmak için CloudWatch alarmları kurun.

# Backup başarısız olduğunda SNS bildirimi için topic oluştur
SNS_ARN=$(aws sns create-topic 
  --name backup-alerts 
  --query 'TopicArn' 
  --output text)

# Email aboneliği ekle
aws sns subscribe 
  --topic-arn $SNS_ARN 
  --protocol email 
  --notification-endpoint [email protected]

# Başarısız backup job'ları için CloudWatch alarm
aws cloudwatch put-metric-alarm 
  --alarm-name "BackupJobsFailed" 
  --alarm-description "AWS Backup job başarısız oldu" 
  --namespace AWS/Backup 
  --metric-name NumberOfBackupJobsFailed 
  --dimensions Name=BackupVaultName,Value=production-backup-vault 
  --statistic Sum 
  --period 3600 
  --threshold 1 
  --comparison-operator GreaterThanOrEqualToThreshold 
  --evaluation-periods 1 
  --alarm-actions $SNS_ARN 
  --treat-missing-data notBreaching

# EventBridge rule ile backup events'i yakala
aws events put-rule 
  --name "backup-job-state-change" 
  --event-pattern '{
    "source": ["aws.backup"],
    "detail-type": ["Backup Job State Change"],
    "detail": {
      "state": ["FAILED", "ABORTED", "EXPIRED"]
    }
  }' 
  --state ENABLED

aws events put-targets 
  --rule "backup-job-state-change" 
  --targets "Id=BackupFailureNotification,Arn=$SNS_ARN"

AWS Organizations ile Çoklu Hesap Yönetimi

Birden fazla AWS hesabınız varsa (ve olmalı), backup politikalarını Organizations seviyesinde zorunlu kılabilirsiniz.

# Organizations'da backup policy'yi etkinleştir (management account'tan çalıştırın)
aws organizations enable-policy-type 
  --root-id r-xxxx 
  --policy-type BACKUP_POLICY

# Tüm üye hesaplara uygulanacak merkezi backup policy
cat > org-backup-policy.json << 'EOF'
{
  "plans": {
    "org-mandatory-backup": {
      "regions": {
        "@@assign": ["eu-central-1", "eu-west-1"]
      },
      "rules": {
        "mandatory-daily-backup": {
          "schedule_expression": {
            "@@assign": "cron(0 5 * * ? *)"
          },
          "start_backup_window_minutes": {
            "@@assign": "60"
          },
          "target_backup_vault_name": {
            "@@assign": "Default"
          },
          "lifecycle": {
            "delete_after_days": {
              "@@assign": "35"
            }
          }
        }
      },
      "selections": {
        "tags": {
          "mandatory-backup-resources": {
            "iam_role_arn": {
              "@@assign": "arn:aws:iam::$account:role/AWSBackupDefaultServiceRole"
            },
            "tag_key": {
              "@@assign": "BackupRequired"
            },
            "tag_value": {
              "@@assign": ["true"]
            }
          }
        }
      }
    }
  }
}
EOF

# Policy'yi oluştur
aws organizations create-policy 
  --name "mandatory-backup-policy" 
  --description "Tüm hesaplara zorunlu backup politikası" 
  --content file://org-backup-policy.json 
  --type BACKUP_POLICY

# Policy'yi bir OU'ya uygula
aws organizations attach-policy 
  --policy-id p-xxxxxxxx 
  --target-id ou-xxxx-xxxxxxxx

Maliyet Optimizasyonu

AWS Backup kullanırken maliyetleri kontrol altında tutmak için dikkat etmeniz gerekenler:

Warm Storage vs Cold Storage: EFS ve S3 yedekleri cold storage’a taşınabilir. Yukarıdaki backup plan örneğinde EC2 yedekleri için MoveToColdStorageAfterDays: 30 parametresini kullandık. Cold storage yaklaşık 6 kat daha ucuz ama geri yükleme süresi uzuyor.

Retention Sürelerini Doğru Ayarlayın:

  • Gereksiz uzun retention süreleri maliyeti artırır
  • Development ortamları için çok daha kısa retention (7-14 gün) yeterlidir
  • Compliance gereksiniminiz yoksa her şeyi 90 gün tutmanıza gerek yok

Cross-region kopyaları dikkatli kullanın:

  • Cross-region backup kopyası hem storage hem de transfer maliyeti yaratır
  • Tüm kaynakları değil, gerçekten kritik olanları cross-region’a kopyalayın

Maliyet takibi için tag stratejisi:

# Backup ile oluşan recovery point'lere cost-allocation tag ekle
aws backup tag-resource 
  --resource-arn arn:aws:backup:eu-central-1:123456789012:backup-vault:production-backup-vault 
  --tags CostCenter=infrastructure,Project=platform-backup

# Mevcut storage kullanımını kontrol et
aws backup list-protected-resources 
  --query 'Results[*].{ResourceType:ResourceType,ResourceArn:ResourceArn,LastBackupTime:LastBackupTime}' 
  --output table

Uyumluluk Raporu Oluşturma

Audit için düzenli rapor oluşturmak artık çok kolay:

# Backup report plan oluştur
aws backup create-report-plan 
  --report-plan-name "monthly-compliance-report" 
  --report-delivery-channel '{
    "S3BucketName": "my-backup-reports-bucket",
    "S3KeyPrefix": "backup-reports",
    "Formats": ["CSV", "JSON"]
  }' 
  --report-setting '{
    "ReportTemplate": "BACKUP_JOB_REPORT",
    "Accounts": ["123456789012"],
    "Regions": ["eu-central-1", "eu-west-1"]
  }' 
  --report-plan-tags Project=compliance,Team=security

# Raporu hemen tetikle (scheduled beklemeden)
aws backup start-report-job 
  --report-plan-name "monthly-compliance-report"

Sık Yapılan Hatalar

IAM rolü yetersiz izinleri: AWSBackupServiceRolePolicyForBackup politikası tüm servisler için yeterli değil. Özellikle S3 backup için ek izinler gerekiyor. Her servis eklendiğinde IAM politikasını kontrol edin.

Vault’un farklı bölgede olmaması: Cross-region backup için hedef bölgede de vault oluşturmanız ve vault ARN’ını doğru belirtmeniz gerekiyor. Aynı bölgedeki vault’a cross-region copy ayarı yapılamaz.

Window sürelerini çok kısa tutmak: Büyük RDS instance’ları veya dolu EFS dosya sistemleri için completion window’u yeterince uzun tutmazsanız job timeout olur. Büyük kaynaklar için 8-12 saatlik completion window düşünün.

Restore testi yapmamak: En sık yapılan hata bu. Yedek alınıyor ama hiç test edilmiyor. Ayda en az bir kez kritik kaynakların restore testini yapın ve bunu bir runbook haline getirin.

Tag tutarsızlığı: Tag tabanlı seçimde büyük/küçük harf duyarlılığı var. “Production” ile “production” farklı tag değerleri. Tüm ekip için bir tag naming convention belgesi oluşturun.

Sonuç

AWS Backup, dağınık ve yönetilmesi zor yedekleme süreçlerini merkezi bir yapıya taşımanın en etkili yolu. Tag tabanlı otomatik kaynak dahil etme özelliği sayesinde yeni bir kaynak oluşturulduğunda tek yapmanız gereken doğru tag’i eklemek. Vault Lock ile ransomware ve yanlışlıkla silme senaryolarına karşı güçlü bir koruma elde ediyorsunuz. Organizations entegrasyonu ise çoklu hesap yönetimini gerçek anlamda merkezi hale getiriyor.

Pratik olarak şunu tavsiye ederim: Önce mevcut ortamınızı analiz edin, hangi kaynakların hangi retention süresine ihtiyaç duyduğunu belirleyin, bir tag standardı oluşturun ve bunu Infrastructure as Code (Terraform veya CloudFormation) ile kodlayın. Bu sayede yeni hesap veya bölge eklendiğinde yedekleme altyapısı otomatik olarak kurulacak.

En önemli şeyi son olarak tekrarlayayım: Restore testini ihmal etmeyin. Hiç test edilmemiş bir yedek, yedek sayılmaz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir