AWS EBSボリュームのスナップショットをCLIを使用して定期取得する

# はじめに
Trusted Advisorにスナップショットが古いと突っ込まれたので、以下のサイトを参考にAWS CLI(Command Line Interface)を用いて定期取得＆世代管理ができるようにしてみる

[What Is the AWS Command Line Interface?](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)
[Amazon EBSのスナップショット(バックアップ)を取得しつつ世代管理も行うスクリプト](http://d.hatena.ne.jp/rx7/20100606/p1)
[タグを利用したEC2のバックアップ(AMI取得)と世代管理](http://blog.suz-lab.com/2012/05/ec2ami.html)

# AWS CLIインストール
[Installing the AWS Command Line Interface](http://docs.aws.amazon.com/cli/latest/userguide/installing.html)
いろいろあるけど今回はsudoを使わないでホームに入れた

```lang:インストール
$ cd
$ wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
$ unzip awscli-bundle.zip
$ ./awscli-bundle/install -b ~/bin/aws
```
パス設定してバージョンが確認できたらOK

```lang:パスとバージョン確認
$ export PATH=~/bin:$PATH
$ aws --version
aws-cli/1.5.2 Python/2.7.3 Linux/3.2.0-41-generic
```
AWSのアクセスキーとリージョンを設定して準備完了

```lang:デフォルトのプロファイル設定
$ aws configure
AWS Access Key ID [None]:****************XXXX
AWS Secret Access Key [None]:****************XXXX
Default region name [None]:us-east-1
Default output format [None]:text
$ aws ec2 describe-instances
･･･（設定したリージョンのEC2インスタンス情報が表示）
```
# AWS EC2コンソールでタグ設定
スナップショットを取得したいボリュームに適当なKey：タグ名とValue：取得世代数を設定

* ELASTIC BLOCK STORE Volumes ＞ ボリューム選択して Add/Edit Tags
* 例）Key:EBS-Snapshot-test,Value=2 と入力してsave

これで２世代保存できるように設定
# 使用してみるコマンド
--profileはプロファイルオプション、取得時にリージョンを指定したい場合は後述参照

```lang:EBSボリュームのタグ情報取得
$ aws ec2 [--profile profile] describe-tags --filters Name=resource-type,Values=volume Name=key,Values=EBS-Snapshot-test
TAGS    EBS-Snapshot-test vol-xxxxxxxa    volume  2
```
先ほど設定したタグがこんな感じで取得されていればOK

```lang:対象EBSボリュームのスナップショットを作成
$ aws ec2 [--profile profile] create-snapshot --volume-id <VolumeID> --description "<Description>"
```
```lang:対象EBSボリュームのスナップショット一覧を取得
$ aws ec2 [--profile profile] describe-snapshots --filters Name=volume-id,Values=<VolumeID>
```
```lang:対象スナップショットを削除
$ aws ec2 [--profile profile] delete-snapshot --snapshot-id <SnapshotID>
```

# 指定したタグのスナップショットを作成するシェル

```lang:SnapshotAWS_EBS.sh
#!/bin/sh

if [ -z "$1" ] ; then
  echo "Set parameter Tags Key:SnapshotAWS_EBS.sh <Key> [profile]"
  exit 1
fi

TAGKEY=$1
PROFILE=""

if [ -n "$2" ] ; then
  PROFILE="--profile $2"
else
  PROFILE="--profile default"
fi

echo "Start SnapshotAWS_EBS:Volumes set tag ${TAGKEY} ${PROFILE}"
VOLUME=`aws ec2 ${PROFILE} describe-tags --filters Name=resource-type,Values=volume Name=key,Values=${TAGKEY} | awk '{print $3}'`

if [ -n "$VOLUME" ] ; then
  echo "Target EBS volumes creating snapshot:"${VOLUME}
else
  echo "End SnapshotAWS_EBS:Volume set tag ${TAGKEY} don't exist ${PROFILE}"
  exit 1
fi

for VOLUME in ${VOLUME}; do
  GEN=`aws ec2 ${PROFILE} describe-tags --filters Name=resource-type,Values=volume Name=resource-id,Values=${VOLUME} Name=key,Values=${TAGKEY} | awk '{print $5}'`
  echo "Create snapshot ${VOLUME} generation number ${GEN} for keeps"

  aws ec2 ${PROFILE} create-snapshot --volume-id ${VOLUME} --description "${TAGKEY}"
  SNAPSHOTS=`aws ec2 ${PROFILE} describe-snapshots --filters Name=volume-id,Values=${VOLUME} Name=description,Values=${TAGKEY} | sort -k7 -r | awk '{print $6}'`
  echo "EBS volumes ${VOLUME} snapshot:"${SNAPSHOTS}
  COUNT=1

  for SNAPSHOTS in ${SNAPSHOTS}; do
    if [ ${COUNT} -le ${GEN} ]; then
      echo "${SNAPSHOTS} for keeps"
    else
      echo "${SNAPSHOTS} delete"
      aws ec2 ${PROFILE} delete-snapshot --snapshot-id ${SNAPSHOTS}
    fi
    COUNT=`expr ${COUNT} + 1`
  done
done

echo "End SnapshotAWS_EBS:Volumes set tag ${TAGKEY} ${PROFILE}"
exit 0
```

先ほど設定したタグ名を引数に実行

```lang:実行
$ SnapshotAWS_EBS.sh EBS-Snapshot-test
Start SnapshotAWS_EBS:Volumes set tag EBS-Snapshot-test --profile default
Target EBS volumes creating snapshot:vol-XXXXXXa
Create snapshot vol-XXXXXXa generation number 2 for keeps
EBS-Snapshot-test       False   007326359613    snap-XXXXXXXa   2014-10-29T05:17:37.000Z        pending vol-XXXXXXa    8
EBS volumes vol-XXXXXXa snapshot:snap-XXXXXXXa snap-XXXXXXXb snap-XXXXXXXc
snap-XXXXXXXa for keeps
snap-XXXXXXXb for keeps
snap-XXXXXXXc delete
End SnapshotAWS_EBS:Volumes set tag EBS-Snapshot-test --profile default
$
```
繰り返し実行した３回目、タグで設定した通り１回目のスナップショットが削除されて２世代分が保存されていることを確認。あとはこれをcronに登録して定期稼動させる

タグにいろいろ持たせればいろいろ細かくできるかもしれない（適当）

# プロファイル設定
profileオプションでアクセスキーやリージョンを使い分けることができるので便利

```lang:プロファイル設定
$ aws configure --profile tokyo
AWS Access Key ID [None]:****************XXXX
AWS Secret Access Key [None]:****************XXXX
Default region name [None]:ap-northeast-1
Default output format [None]:
$ cat ~/.aws/config
[default]
output = text
region = us-east-1
[profile tokyo]
region = ap-northeast-1
output = text
[profile sydney]
region = ap-southeast-2
output = text
$ SnapshotAWS_EBS.sh tagkey #デフォルトのN.ヴァージニアリージョン向け 
$ SnapshotAWS_EBS.sh tagkey tokyo #東京リージョン向け
```