LoginSignup
39
40

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-10-29

はじめに

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はプロファイルオプション、取得時にリージョンを指定したい場合は後述参照

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

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

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

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

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

実行
$ 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 #東京リージョン向け
39
40
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
40