backup-retention-policy について
データライフサイクルと災害復旧を計画するチーム向けのバックアップ保持ポリシースキルです。保存階層、クラウドのライフサイクル例、DB バックアップ、コンプライアンス、復旧目標、検証、テスト、アラートを扱います。
主な機能
- 013-2-1-1-0 バックアップルール
- 02保存階層と保持期間
- 03クラウドのライフサイクル例
- 04データベースのバックアップとローテーション
- 05コンプライアンスと RTO/RPO 計画
- 06ポリシーの検証とテスト
活用シーン
- 01バックアップ保持スケジュールの設計
- 02災害復旧目標の計画
- 03コンプライアンス要件に沿ったポリシー確認
- 04復元テストとアラートの計画
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dengineproblem/ agents-monorepo --skill backup-retention-policyインストール後、Claude Code で/backup-retention-policyを入力して読み込まれたか確認します。
詳細
バックアップ保持ポリシーのエキスパート
データのライフサイクル管理と障害復旧のエキスパートです。
3-2-1-1-0 ルール
- 3 個の重要なデータのコピー(1 個のプライマリコピー+2 個のバックアップ)
- 2 種類の異なるメディア
- 1 個の外部/クラウドバックアップ
- 1 個のオフライン/不変バックアップ
- テスト後のエラー 0 件
ストレージ階層
| 階層 | アクセス頻度 | 期間 | コスト |
|---|---|---|---|
| ホット | 頻繁 | 0-30 日 | $$$ |
| ウォーム | 定期的 | 30-90 日 | $$ |
| コールド | まれ | 90 日-7 年 | $ |
| アーカイブ | 長期 | 7 年以上 | ¢ |
AWS S3 ライフサイクルポリシー
{
"Rules": [
{
"ID": "BackupLifecycle",
"Status": "Enabled",
"Filter": {
"Prefix": "backups/"
},
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
},
{
"Days": 365,
"StorageClass": "DEEP_ARCHIVE"
}
],
"Expiration": {
"Days": 2555
},
"NoncurrentVersionTransitions": [
{
"NoncurrentDays": 30,
"StorageClass": "GLACIER"
}
],
"NoncurrentVersionExpiration": {
"NoncurrentDays": 365
}
}
]
}
Azure Blob のライフサイクル
{
"rules": [
{
"name": "backupRetention",
"type": "Lifecycle",
"definition": {
"actions": {
"baseBlob": {
"tierToCool": {"daysAfterModificationGreaterThan": 30},
"tierToArchive": {"daysAfterModificationGreaterThan": 90},
"delete": {"daysAfterModificationGreaterThan": 2555}
},
"snapshot": {
"delete": {"daysAfterCreationGreaterThan": 90}
}
},
"filters": {
"blobTypes": ["blockBlob"],
"prefixMatch": ["backups/"]
}
}
}
]
}
バックアップローテーションスクリプト
#!/bin/bash
BACKUP_DIR="/var/backups"
DAILY_RETENTION=7
WEEKLY_RETENTION=4
MONTHLY_RETENTION=12
# Удаление ежедневных старше 7 дней
find "$BACKUP_DIR/daily" -type f -mtime +$DAILY_RETENTION -delete
# Удаление еженедельных старше 4 недель
find "$BACKUP_DIR/weekly" -type f -mtime +$((WEEKLY_RETENTION * 7)) -delete
# Удаление ежемесячных старше 12 месяцев
find "$BACKUP_DIR/monthly" -type f -mtime +$((MONTHLY_RETENTION * 30)) -delete
# Логирование
echo "$(date): Rotation completed" >> /var/log/backup_rotation.log
PostgreSQL バックアップ
#!/bin/bash
DB_NAME="production"
BACKUP_DIR="/var/backups/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
# Полный бэкап
pg_dump -Fc -f "$BACKUP_DIR/full_$DATE.dump" $DB_NAME
# Инкрементальный с WAL
pg_basebackup -D "$BACKUP_DIR/base_$DATE" -Ft -z -P
# Архивация WAL логов
archive_command = 'cp %p /var/backups/wal/%f'
MySQL バックアップ
#!/bin/bash
MYSQL_USER="backup_user"
MYSQL_PASS="secure_password"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
# Полный бэкап
mysqldump --user=$MYSQL_USER --password=$MYSQL_PASS \
--all-databases --single-transaction \
--routines --triggers --events \
| gzip > "$BACKUP_DIR/full_$DATE.sql.gz"
# Инкрементальный с binlog
mysqlbinlog --read-from-remote-server \
--host=localhost --user=$MYSQL_USER \
--raw --stop-never mysql-bin.000001
コンプライアンス要件
| 規格 | 要件 |
|---|---|
| GDPR | 削除する権利、データの最小化 |
| SOX | 財務記録を 7 年間保持 |
| HIPAA | 医療データを 6 年間保持 |
| PCI DSS | 監査用に最低 1 年間保持 |
RTO/RPO の計画
Критические системы:
RPO: 1 час
RTO: 4 часа
Стратегия: Синхронная репликация + горячий standby
Бизнес-системы:
RPO: 4 часа
RTO: 24 часа
Стратегия: Асинхронная репликация + теплый standby
Архивные системы:
RPO: 24 часа
RTO: 72 часа
Стратегия: Ежедневные бэкапы + холодное хранение
Python によるポリシーの検証
from datetime import datetime, timedelta
from typing import List, Dict
class BackupRetentionValidator:
def __init__(self, retention_policy: Dict):
self.policy = retention_policy
def validate_backup(self, backup_date: datetime, backup_type: str) -> bool:
"""Проверка соответствия бэкапа политике хранения"""
retention_days = self.policy.get(backup_type, {}).get('retention_days', 0)
expiry_date = backup_date + timedelta(days=retention_days)
return datetime.now() < expiry_date
def get_expired_backups(self, backups: List[Dict]) -> List[Dict]:
"""Получить список просроченных бэкапов"""
expired = []
for backup in backups:
if not self.validate_backup(backup['date'], backup['type']):
expired.append(backup)
return expired
def calculate_storage_forecast(self, daily_backup_size_gb: float) -> Dict:
"""Прогноз использования хранилища"""
total_storage = 0
for backup_type, config in self.policy.items():
retention = config.get('retention_days', 0)
frequency = config.get('frequency_days', 1)
copies = retention // frequency
total_storage += copies * daily_backup_size_gb
return {
'total_gb': total_storage,
'monthly_cost_estimate': total_storage * 0.023 # S3 Standard pricing
}
テストスケジュール
| テストの種類 | 頻度 | 対象範囲 |
|---|---|---|
| 抜き取り復元 | 毎月 | データの 10% |
| 完全復元 | 四半期ごと | 重要なシステム |
| DR 演習 | 毎年 | シナリオ全体 |
| ポリシー監査 | 毎年 | すべてのポリシー |
監視とアラート
Алерты:
backup_failed:
severity: critical
notification: [pagerduty, slack]
backup_size_anomaly:
threshold: 20%
severity: warning
retention_violation:
severity: high
action: auto_remediate
storage_threshold:
threshold: 80%
severity: warning
ベストプラクティス
- 復元をテストする — テストしていないバックアップは、バックアップではありません
- データを暗号化する — 保存データには AES-256 を使用します
- バージョン管理 — 複数のバージョンを保持します
- 地理的に分散する — 最低 2 つのリージョンに分散します
- イミュータブルストレージ — ランサムウェアから保護します
- 手順を文書化する — DR 用のランブックを用意します
コメント
Markdown 対応