はじめに
Trusted Advisorにスナップショットが古いと突っ込まれたので、以下のサイトを参考にAWS CLI(Command Line Interface)を用いて定期取得&世代管理ができるようにしてみる
What Is the AWS Command Line Interface?
Amazon EBSのスナップショット(バックアップ)を取得しつつ世代管理も行うスクリプト
タグを利用したEC2のバックアップ(AMI取得)と世代管理
AWS CLIインストール
Installing the AWS Command Line Interface
いろいろあるけど今回はsudoを使わないでホームに入れた
$ cd
$ wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
$ unzip awscli-bundle.zip
$ ./awscli-bundle/install -b ~/bin/aws
パス設定してバージョンが確認できたらOK
$ export PATH=~/bin:$PATH
$ aws --version
aws-cli/1.5.2 Python/2.7.3 Linux/3.2.0-41-generic
AWSのアクセスキーとリージョンを設定して準備完了
$ 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
これで2世代保存できるように設定
使用してみるコマンド
--profileはプロファイルオプション、取得時にリージョンを指定したい場合は後述参照
$ 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
$ aws ec2 [--profile profile] create-snapshot --volume-id <VolumeID> --description "<Description>"
$ aws ec2 [--profile profile] describe-snapshots --filters Name=volume-id,Values=<VolumeID>
$ aws ec2 [--profile profile] delete-snapshot --snapshot-id <SnapshotID>
指定したタグのスナップショットを作成するシェル
#!/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
先ほど設定したタグ名を引数に実行
$ 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
$
繰り返し実行した3回目、タグで設定した通り1回目のスナップショットが削除されて2世代分が保存されていることを確認。あとはこれをcronに登録して定期稼動させる
タグにいろいろ持たせればいろいろ細かくできるかもしれない(適当)
プロファイル設定
profileオプションでアクセスキーやリージョンを使い分けることができるので便利
$ 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 #東京リージョン向け