zuntan02のはてなブログ

備忘録的なものです。時々職場の技術者ブログにも転記してますが、メインはこちらで。

AWS-EC2の定期バックアップ(スナップショット)取得について

★この記事はもう古いです。これはからはAWS Backupを使いましょう
http://zuntan02.hateblo.jp/entry/2019/09/11/140805


大まかに2パターンある模様
個人的に内容が分かり易い、という点をもって、下記に示す2番目の網元AMI提供のものを利用させていただいています。

■1:バックアップコマンド実行専用サーバを立てる

インスタンスのタグにバックアップ対象かどうかを記載して
バックアップ対象のインスタンス(のEBS)に対してスナップショット取得を実施

実現例)
1クリックで毎日スナップショットを自動取得 ? ソンナコトモアロウカト v1.4
http://dev.classmethod.jp/cloud/aws/sonna-kotomo-aroukato-1-4-release/

CloudFormationで実現されており、必要な時だけ起動してきてスナップショット取って消えていく。
殆ど迷うことなく設置できた。各サーバ側に手を入れることなく、とりあえず
デイリースナップショットを取りたい方はこちらもよいかと。


【メリット】
・サーバを追加するときにタグの設定だけでバックアップのON/OFFが可能。

【懸念点】
・サーバがクラッシュした状態であっても、スナップショットを取ってしまう(気がする)。上記のツールについては未検証。
・バックアップ実行サーバが何らかの理由で動作不良に陥った場合に全バックアップが停止する。


■2:各サーバで、自身のEBSを対象にスナップショットを取得

実現例)
https://ja.amimoto-ami.com/2015/03/04/aws-cli-create-snapshot/
網元AMI提供のもの。稼働しているインスタンスにひも付けられているボリュームのスナップショットを作成するシェルスクリプト


【メリット】
・各サーバで直接スナップショットを取っているため、サーバがクラッシュした場合はそれ以上のスナップショットが取られない。
aws-cliのスナップショット作成コマンド実行をシェルスクリプトで実行しているものであり、分かり易い。

【懸念点】
・プライベートサブネットからだとAWSAPIが叩けない模様。パブリックサブネットに居るサーバに代行してもらう必要がある。

■以下簡単な手順メモを残します。

# スナップショット自動取得
# 網元AMIが提供しているsnapshotスクリプトを利用します
# スナップショット取得用ポリシーを作成
# ec2 関係の値の読み取りと、Snapshot の作成・削除のみを許可できます。

[IAM]-[ポリシー]-[ポリシーの作成]-[独自のポリシー作成]
ポリシー名:AmazonEC2CreateSnapshots
ポリシードキュメント:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*",
        "ec2:CreateSnapshot",
        "ec2:DeleteSnapshot"
      ],
      "Resource": "*"
    }
  ]
}

# 既存の各サーバ用ロールに権限を追加
[IAM]-[ロール]-スナップショット取得を実行するサーバのロールに対して
[ポリシーのアタッチ]
ポリシー名:AmazonEC2CreateSnapshots
を選択して[ポリシーのアタッチ]を実行

# テスト:該当サーバ上で手動でのスナップショットを取得

aws ec2 create-snapshot --volume-id vol-hogehoge --description "This is my root volume snapshot." --region ap-northeast-1

→OK

# サーバにシェルスクリプトを配置する

cd /srv/bin/
ll

wget https://gist.githubusercontent.com/wokamoto/1c53fd9d9ce54c446489/raw/create-snapshot.sh
chmod +x /srv/bin/create-snapshot.sh

# 手動実行して動作することを確認
# SNAPSHOTS_PERIOD=2なので3回実行してローテーションされることも確認
/srv/bin/create-snapshot.sh

# rootのcronに設置

crontab -e

# AmazonEC2CreateSnapshots
x xx * * * /srv/bin/create-snapshot.sh > /dev/null 2>&1

以上