2026年9月5日

2026年9月5日

AWS S3をバックアップ先にするaws-cliの設定方法

はじめに

オンプレミスやVPS上のサーバーのバックアップを安全に保管するうえで、Amazon S3は耐久性99.999999999%(イレブンナイン)と地理的冗長性を備えた定番の選択肢です。aws-cliを使えばスクリプトで簡単に同期・アップロードができ、cronと組み合わせるだけで本格的なオフサイトバックアップが完成します。

本記事ではaws-cliの基本セットアップから、IAMポリシーの最小権限設定、ライフサイクルルールでのコスト削減、SSE-S3/SSE-KMSによる暗号化までを通しで解説します。

症状・背景

  • ローカルRAIDだけでは火災・盗難・ランサムウェアに対応できない
  • 既存のrsyncによる別ホスト同期では遠隔地保管ができていない
  • バックアップ容量が膨らみコストが想定より高い
  • IAMユーザーに過剰な権限を与えていてセキュリティ監査で指摘された

手順・設定方法

ステップ1: aws-cliのインストールと初期設定

# Ubuntu/Debianの場合は公式の最新版を導入
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip
unzip awscliv2.zip && sudo ./aws/install
# バージョン確認
aws --version
# プロファイル単位で資格情報を登録(複数案件で使い分けやすい)
aws configure --profile backup

ステップ2: 最小権限のIAMユーザーとバケットを準備

# バケット作成(バージョニング有効化でランサム対策)
aws s3api create-bucket --bucket mycompany-backup-tokyo --region ap-northeast-1 \
  --create-bucket-configuration LocationConstraint=ap-northeast-1
aws s3api put-bucket-versioning --bucket mycompany-backup-tokyo \
  --versioning-configuration Status=Enabled
# パブリックアクセス完全ブロック
aws s3api put-public-access-block --bucket mycompany-backup-tokyo \
  --public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

ステップ3: バックアップアップロードと同期

# 単一ファイルをサーバーサイド暗号化付きでアップロード
aws s3 cp /var/backups/db-20260514.sql.gz s3://mycompany-backup-tokyo/db/ \
  --sse AES256 --profile backup
# ディレクトリ全体を効率的に同期(差分のみ転送)
aws s3 sync /var/backups/ s3://mycompany-backup-tokyo/server01/ \
  --storage-class STANDARD_IA --delete --exclude "*.tmp" --profile backup
# 一覧確認
aws s3 ls s3://mycompany-backup-tokyo/server01/ --recursive --human-readable

ステップ4: ライフサイクルとcronによる自動化

# 30日経過後にGlacier Instant Retrievalへ、365日で削除するルール
cat > lifecycle.json <<'EOF'
{"Rules":[{"ID":"archive","Status":"Enabled","Filter":{"Prefix":""},
  "Transitions":[{"Days":30,"StorageClass":"GLACIER_IR"}],
  "Expiration":{"Days":365}}]}
EOF
aws s3api put-bucket-lifecycle-configuration --bucket mycompany-backup-tokyo \
  --lifecycle-configuration file://lifecycle.json
# cron登録(毎日3時に同期)
echo "0 3 * * * aws s3 sync /var/backups/ s3://mycompany-backup-tokyo/server01/ --profile backup" \
  | sudo tee /etc/cron.d/s3-backup

注意事項

  • アクセスキーは~/.aws/credentialsの権限を600に。可能ならEC2であればIAMロール、外部ならIAM Roles Anywhereを使う
  • --deleteオプションは強力だが、誤って大量データを削除する事故が起きやすい。先に--dryrunで確認する
  • 大容量ファイルはaws s3 cpが自動的にマルチパートアップロードに切り替わるが、中断時の不完全パートが課金対象になるためAbortIncompleteMultipartUploadルールを必ず設定
  • リージョン跨ぎの転送料金は高額。バックアップは原則として同一リージョンか、明示的に災害対策用としてのみクロスリージョンレプリケーションを使う

まとめ

1. 最小権限IAM: バックアップ用ユーザーにはs3:PutObject等の必要最小限のみ付与

2. バージョニング: ランサムウェア対策にバケットバージョニングは必須

3. ストレージクラス: アクセス頻度に応じてSTANDARD_IAやGLACIER_IRで大幅にコスト削減

4. ライフサイクル: 古いバックアップの自動アーカイブと削除でコストと容量を管理

5. 自動化: cronとaws s3 syncで差分転送を毎日実行し運用負荷ゼロに

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ