AWS

リモートでEBSのスナップショットを日時で取得する

EC2のインスタンスを日時で取得することにしました。

今回はインスタンスを、リモートでスナップショットを取得する方法についてです。

 

 

IAM ユーザの作成やポリシーの設定などは終わっているものとします。

こちらについてはすでにインターネットに多くの情報がありますので参考にしてください。

わたしがオススメなのはこちら▼

Snapshot を自動で作成するには? | 超高速 WordPress AMI AMIMOTO

 

 

リモートでスナップショットを行うシェルスクリプトを作成するにあたり参考にしたサイトはこちら▼

EBSのスナップショットを日次で取得する – kumonchu.com

 

しかしこのスクリプトはローカルで動作するようになっているのと、作成されたスナップショットに対して、Nameタグにホスト名が指定されていたので変更することにしました。

わたしは、リモートで動作して、NameタグにはEC2の「Nameタグ_日付」を入れることにしました。

 

 

 

作成したシェルの内容

 #!/bin/sh
SHELLDIR=`dirname ${0}`
SHELLDIR=`cd ${SHELLDIR}; pwd`
SHELLNAME=`basename $0`

LOG_DIR="/var/log/ibsaws"
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=$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}'`
    if [ -z ${VOL_ID} ] ; 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}"
    ${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}

    print_msg "${INSTANCE_NAME} Create snapshot End"

}

delete_old_snapshot() {
    print_msg "${INSTANCE_NAME} Delete old snapshot Start"
    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
    print_msg "${INSTANCE_NAME} Delete old snapshot End"
}

create_snapshot
delete_old_snapshot

exit 0

 

このシェルは引数としてインスタンス名が必要です。

例えば、このシェル名がcreate-snapshot.shだとすると、「create-snapshot.sh i-xxxxx」というふうに実行します。

 

cronから実行する場合も引数が必要です。

# 1:00
0 1 * * 1 ec2-user /home/ec2-user/bin/create-snapshot.sh i-9520b430 | logger -i -t AWSCLISnapshot

この例ですと、月曜日の1:00にi-9520b430のスナップショットを作成します。

 

 

 

最後に問題が!

このシェルは複数ボリュームに対応していません。

現在修正中ですので完成したらまたこちらのブログで公開します。