AWS

リモートでEBSのスナップショットを日時で取得する(複数ボリューム対応版)

前回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 

 

 

 

またまた問題が!

このシェルは複数プロファイルに対応していません。

近日中に作成する予定ですので、できたらまたこちらのブログで公開します。