2010年3月17日水曜日

EBSのスナップショット作成スクリプト(世代管理機能付)

スズキです。

以下のようなスクリプトを作ってみました。

--------【backup_ebs.sh】--------
#!/bin/sh

# 設定の読み込み
AWS_CONF=/opt/suz-lab/etc/aws.conf
. /opt/suz-lab/bin/common/load_conf.sh $AWS_CONF

# オプションの処理
while getopts n:a:s:v: opt
do
  case ${opt} in
    n) AWS_ACCOUNT_NUMBER=${OPTARG};;
    a) AWS_ACCESS_KEY=${OPTARG};;
    s) AWS_SECRET_KEY=${OPTARG};;
    v) EBS_VOLUME=${OPTARG};;
    g) EBS_GENERATION=${OPTARG};;
    \?) exit 1;;
  esac
done

# スナップショットの作成
ec2-create-snapshot \
-K $AWS_PRIVATE_KEY \
-C $AWS_CERTIFICATE \
--region $AWS_REGION \
$EBS_VOLUME

# 対象EBSのスナップショットリストを取得
SNAPSHOTS=`ec2-describe-snapshots \
-K $AWS_PRIVATE_KEY \
-C $AWS_CERTIFICATE \
--region $AWS_REGION \
| grep $EBS_VOLUME | sort -k5 -r | awk '{print $2}'`

# 世代数の管理
COUNT=1
for SNAPSHOT in $SNAPSHOTS; do
  if [ $COUNT -le $EBS_GENERATION ]; then
    # 最新順で世代数内なら残す
    echo $SNAPSHOT "remained"
  else
    # 最新順で世代数外なら削除
    ec2-delete-snapshot \
    -K $AWS_PRIVATE_KEY \
    -C $AWS_CERTIFICATE \
    --region $AWS_REGION \
    $SNAPSHOT
    echo $SNAPSHOT " deleted"
  fi
  COUNT=`expr $COUNT + 1`
done
--------

ポイントは、"ec2-describe-snapshots"で全リストを取得して、
"grep"で該当EBSの行のみにして、"sort"で作成日の降順で並べ替えて...
といったところでしょうか?

上記スクリプトで最初に読み込んでいる設定ファイルは、次の通りです。

--------【aws.conf】--------
AWS_PRIVATE_KEY=/opt/suz-lab/etc/pk.pem
AWS_CERTIFICATE=/opt/suz-lab/etc/cert.pem
AWS_REGION=us-west-1

EBS_VOLUME=vol-00000000
EBS_GENERATION=7

export EC2_HOME=/opt/ec2-api-tools
export JAVA_HOME=/usr/java/default

export PATH=/sbin:/bin
export PATH=$PATH:/usr/sbin:/usr/bin
export PATH=$PATH:/usr/local/sbin:/usr/local/bin
export PATH=$PATH:$EC2_HOME/bin
--------

以下は、上記スクリプトで利用している設定ファイルの読み込みスクリプトです。

--------【load_conf.sh】--------
#bin/sh

if [ -f $1 ]; then
  $1
else
  echo "can't find $1"
  exit 1
fi
--------

RPM化して、SUZ-LABリポジトリに置きたいなー...

--------
http://www.suz-lab.com

0 コメント: