前回EC2のバックアップで記事を公開したのだが、この記事ではEC2ボリュームが複数ボリュームだった場合、対応できていませんでした。
リモートでEBSのスナップショットを日時で取得する
前回の記事をリライトしようかとも思いましたが、履歴として残して置きたいと思い、新しい記事で公開することにしました。
作成したシェル
#!/bin/sh SHELLDIR=`dirname ${0}` SHELLDIR=`cd ${SHELLDIR}; pwd` SHELLNAME=`basename $0`
LOG_DIR="/var/log/ibsaws" #LOG_FILE="${LOG_DIR}/${SHELLNAME}.log" LOG_FILE="${LOG_DIR}/create-snapshot.log"
AZ=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone` LN=`echo $((${#AZ} - 1))` REGION=`echo ${AZ} | cut -c 1-${LN}` SNAPSHOTS_PERIOD=4
AWS="/usr/bin/aws --region ${REGION}"
#INSTANCE_ID="i-xxxxxxx" INSTANCE_ID=$1 INSTANCE_NAME=`${AWS} ec2 describe-instances --instance-ids ${INSTANCE_ID} --output json | jq -r '.Reservations[].Instances[] | .Tags[] |select(.Key=="Name").Value'`
print_msg() { echo "`date '+%Y/%m/%d %H:%M:%S'` $1" | tee -a ${LOG_FILE} }
create_snapshot() { print_msg "${INSTANCE_NAME} Create snapshot Start" VOL_ID=`${AWS} ec2 describe-instances --instance-ids ${INSTANCE_ID} --output text | grep EBS | awk '{print $5}'` #スナップショットの削除でもボリュームの一覧を使いたいので退避しておく VOLUME=${VOL_ID} # 要素の数が0ならエラー if [ ${#VOL_ID} == 0 ] ; then echo ${VOL_ID} print_msg "ERR:ec2-describe-instances" logger -f ${LOG_FILE} exit 1 fi print_msg "${INSTANCE_NAME} ec2-describe-instances Success : ${VOL_ID}"
### snapshot開始 for VOL_ID in ${VOL_ID}; do ${AWS} ec2 create-snapshot --volume-id ${VOL_ID} --description "Created by AWSCLIBatch(${INSTANCE_ID}) from ${VOL_ID}" >> ${LOG_FILE} 2>&1 if [ $? != 0 ] ; then print_msg "ERR:${SHELLDIR}/${SHELLNAME} ec2-create-snapshot" logger -f ${LOG_FILE} exit 1 fi ### ボリュームでスナップショット一覧を取得し一番新しいスナップショットIDを取得する SNAPSHOT_ID=`${AWS} ec2 describe-snapshots --filters Name=volume-id,Values=${VOL_ID} | sort -k11 -r | head -n1 | awk '{print $10}'` SNAPSHOT_DATE=`date +%Y%m%d` aws ec2 create-tags --resources ${SNAPSHOT_ID} --tags Key=Name,Value=${INSTANCE_NAME}_${SNAPSHOT_DATE} done
print_msg "${INSTANCE_NAME} Create snapshot End"
}
delete_old_snapshot() { print_msg "${INSTANCE_NAME} Delete old snapshot Start"
VOL_ID=${VOLUME} for VOL_ID in ${VOL_ID}; do SNAPSHOTS=`${AWS} ec2 describe-snapshots --output text | grep ${VOL_ID} | grep "Created by AWSCLIBatch" | wc -l` while [ ${SNAPSHOTS} -gt ${SNAPSHOTS_PERIOD} ] do ${AWS} ec2 delete-snapshot --snapshot-id `${AWS} ec2 describe-snapshots --output text | grep ${VOL_ID} | grep "Created by AWSCLIBatch" | sort -k 11,11 | awk 'NR==1 {print $10}'` >> ${LOG_FILE} 2>&1 if [ $? != 0 ] ; then print_msg "ERR:${SHELLDIR}/${SHELLNAME} ec2-delete-snapshot" logger -f ${LOG_FILE} exit 1 fi SNAPSHOTS=`${AWS} ec2 describe-snapshots | grep ${VOL_ID} | grep "Created by AWSCLIBatch" | wc -l` done done
print_msg "${INSTANCE_NAME} Delete old snapshot End" }
create_snapshot delete_old_snapshot
exit 0
|
またまた問題が!
このシェルは複数プロファイルに対応していません。
近日中に作成する予定ですので、できたらまたこちらのブログで公開します。