AWS CLIでEC2のバックアップをとる


先日EC2インスタンスの定期バックアップスクリプトを組んだので、aws-cliコマンドのメモついでに公開。
セキュリティ面・エラー処理周りの実装があまいので流れとコマンドだけ。

やりたい事

  • ローカルや他サーバから特定のEC2インスタンスのバックアップをとる
  • 世代管理をしたい
  • 削除処理はAMI解除 → スナップショット削除とする

処理の流れ

  1. AMIを作成する
    • 名前は「ホスト名_日付」みたいな感じにしておく
  2. AMI名を利用して解除したいAMIのIDを取得する
    • 世代数と日付の演算を利用して削除したいAMI名を決定する
  3. AMIの解除をする
  4. AMI_IDを使ってスナップショットのIDを取得
  5. スナップショットを削除する

定期実行したい場合

  • 管理サーバあたりのcronにセットしとくといいかも?
  • Lambdaを利用した実装方法を模索しましたがデフォルトだとaws-cliを使えない(Lambda側)のでめんどくさいです

複数管理したい場合

  • 名前の配列を用意して上記の流れをループさせればOK

使用するコマンド

AMIの作成

$ aws ec2 create-image --instance-id --name AMI_NAME --no-reboot

※再起動してでも正確にバックアップをとりたい場合は「--no-reboot」を外す

AMI_IDの取得

$ aws ec2 describe-images --owners self --query 'Images[?Name==`AMI_NAME`].[ImageId]|[0]|[0]' --output text

AMI解除

$ aws ec2 deregister-image --image-id AMI_ID

スナップショットIDの取得

$ aws ec2 describe-snapshots --owner-ids AWS_ACCOUNT_ID --query 'Snapshots[?contains(Description, `AMI_ID`)].[SnapshotId]' --output text

スナップショットの削除

$ aws ec2 delete-snapshot --snapshot-id SNAPSHOT_ID