先人の作り上げたShellScriptをawscli+jqで移植しよう!というお話です。STOP!車輪の再発明!
長いので使い方を先に説明しますと、『all_createsnapshot.sh』をどこかのEC2で実行すると、タグ付けられたEC2-Instanceを全部バックアップします!cronに登録しておくと良いと思います!
前置き終了以下解説。
『awscli』と『jq』のインストールが必須です。
jqはパスの通った所に置いて下さい。
まずはShellScriptから説明します。
2つのShellScriptは同一ディレクトリに設置して下さい。awscliの設定ファイル設置場所をハードコードしておりますので、各自ご修正ください。
2つのShellScriptの役割はこんな感じです。
- all_createsnapshot.sh ⇒ バックアップ対象のEC2のInstance-IDをリスト化
- createsnapshot.sh ⇒ Instanse-IDを渡すとSnapshotを取得。過去分は削除。
ShellScriptはパラメータを渡して実行する事ができます。
通常は自動取得されますので、設定の必要は無いです。
| パラメータ | 内容 | 未指定時 |
|---|---|---|
| -h | ヘルプを表示 | 表示しない |
| -c | AWS_CONFIG_FILEの場所を指定 (外部から引き渡すときに使用) |
Shell内設定を使用 |
| パラメータ | 内容 | 未指定時 |
|---|---|---|
| -h | ヘルプを表示 | 表示しない |
| -c | AWS_CONFIG_FILEの場所を指定 (外部から引き渡すときに使用) |
Shell内設定を使用 |
| -i | SnapShotを取得したいInstanceID | 実行中のインスタンス |
| -g | SnapShotを保存する世代数 | 5 |
#!/bin/bash
#
# All Instances CreateSnapshot script
CONFIG_FILE=/root/aws/account.txt
opterror(){
echo "Usage: $prog -c [config]" 1>&2
echo " -h HELP"
exit 1
}
while getopts c:h OPT
do
case $OPT in
"h" ) HELP=1 ;;
"c" ) CONFIG="$OPTARG" ;;
* ) opterror
esac
done
# TimeWatch Start ----------------------------
START_TIME=`date +%s`
TMPTXT="$0 Start EC2 SnapShot JOB..."
echo "${TMPTXT}" && logger -t $0 -i "${TMPTXT}"
# Exec ---------------------------------------
test ! -z $HELP && opterror
test ! -z $CONFIG && CONFIG_FILE=${CONFIG}
export AWS_CONFIG_FILE=${CONFIG_FILE}
script_dir=$(cd $(dirname $BASH_SOURCE); pwd)
# Exec Failed Check --------------------------
test -z ${AWS_CONFIG_FILE} && echo "Not Set AWS_CONFIG_FILE ..." && exit 1
test ! -f ${script_dir}/createsnapshot.sh && echo "Not Find createsnapshot.sh ..." && exit 1
# Loop Tagged Instances
aws ec2 describe-instances --filters "Name=tag-key,Values=backup" "Name=tag-value,Values=ON"|jq -r ".Reservations[].Instances[].InstanceId"| while read INSTANCE_ID
do
GENERATION=`aws ec2 describe-instances --instance-id=${INSTANCE_ID} |jq -r '.Reservations[].Instances[].Tags[]|select(.Key== "generation").Value'`
test -z ${GENERATION} && GENERATION=5
TMPTXT="Backup INSTANCE is ${INSTANCE_ID} and Generation is ${GENERATION}"
echo "${TMPTXT}" && logger -t $0 -i "${TMPTXT}"
if [ ! -z $CONFIG ];then
${script_dir}/createsnapshot.sh -i ${INSTANCE_ID} -g ${GENERATION} -c $CONFIG
else
${script_dir}/createsnapshot.sh -i ${INSTANCE_ID} -g ${GENERATION}
fi
done
# TimeWatch STOP -----------------------------
END_TIME=`date +%s`
SS=`expr ${END_TIME} - ${START_TIME}`
HH=`expr ${SS} / 3600`
SS=`expr ${SS} % 3600`
MM=`expr ${SS} / 60`
SS=`expr ${SS} % 60`
TMPTXT="$0 exec Total Time => ${HH}:${MM}:${SS}"
echo "${TMPTXT}" && logger -t $0 -i "${TMPTXT}"
#!/bin/bash
#
# CreateSnapshot script
# using awswcli + jq
CONFIG_FILE=/root/aws/account.txt
export LANG=C
#=====================================================
opterror(){
echo "Usage: $0 -i [instance_id] -g [backup generation] -c [config]" 1>&2
echo " -h HELP"
echo " if Not Defined instance_id, take Backup Myself."
exit 1
}
while getopts i:g:c:h OPT
do
case $OPT in
"h" ) HELP=1 ;;
"i" ) EC2_INSTANCE_ID="$OPTARG" ;;
"g" ) EBS_GENERATION_COUNT="$OPTARG" ;;
"c" ) CONFIG_FILE="$OPTARG" ;;
* ) opterror
esac
done
#------------------------------------------------------
test ! -z $HELP && opterror
test ! -z $CONFIG && CONFIG_FILE=${CONFIG}
export AWS_CONFIG_FILE=${CONFIG_FILE}
test -z $EC2_INSTANCE_ID && EC2_INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
test -z $EBS_GENERATION_COUNT && EBS_GENERATION_COUNT=5
#======================================================
EBS_VOLUME_ID=`aws ec2 describe-volumes|jq --arg hoge ${EC2_INSTANCE_ID} -r '.Volumes[]|select(.Attachments[].InstanceId ==$hoge)|.VolumeId'`
# Create SnapShot --------------------
NOW=`date +"%Y/%m/%d %k:%M:%S"`
DESCRIPT_TXT="AutoBackup ${EC2_INSTANCE_ID} created at ${NOW}"
aws ec2 create-snapshot --volume-id ${EBS_VOLUME_ID} --description "${DESCRIPT_TXT}" >/dev/null 2>&1
# Error Catch ------------------------
RESULT=$?
TMPTXT="${EC2_INSTANCE_ID} create snapshot ${EBS_VOLUME_ID} "
if [ ${RESULT} -ne 0 ];then
TMPTXT="${TMPTXT} => failed..."
else
TMPTXT="${TMPTXT} => Success!!"
fi
echo "${TMPTXT}" && logger -t $0 -i "${TMPTXT}"
# List & Sort Delete SnapShots -------
SNAPSHOTS=(`aws ec2 describe-snapshots |jq --arg hoge ${EBS_VOLUME_ID} -c '.Snapshots[] | select(.VolumeId==$hoge) | [ .StartTime, .SnapshotId, .Description ]'| grep "AutoBackup" |sort -t "," -k 1,1| awk -F'[,"]' '{print $5}'`)
SNAPSHOTS_LINE=${#SNAPSHOTS[*]}
CNT=`expr ${SNAPSHOTS_LINE} - ${EBS_GENERATION_COUNT}`
# Exit -------------------------------
if [ ${CNT} -lt 0 ];then
exit 0
fi
# Delete OLD SnapShot ----------------
for ((i = 0; i < ${CNT}; i++)){
aws ec2 delete-snapshot --snapshot-id ${SNAPSHOTS[i]} >/dev/null 2>&1
RESULT=$?
TMPTXT="${SNAPSHOTS[i]} delete"
if [ ${RESULT} -ne 0 ];then
TMPTXT="${TMPTXT} => failed..."
else
TMPTXT="${TMPTXT} => Success!!"
fi
echo "${TMPTXT}" && logger -t $0 -i "${TMPTXT}"
}
次に、実際の使用方法を説明します。
バックアップ取得対象のEC2にTagを付けます。「Key:backup Value:ON」のものをバックアップ対象とします。「Key:generation Value:[任意の数値]」をつけると、その世代分以降のバックアップは削除されます。未指定時は5世代です。
バックアップ取得対象のEC2にTagを付けます。「Key:backup Value:ON」のものをバックアップ対象とします。「Key:generation Value:[任意の数値]」をつけると、その世代分以降のバックアップは削除されます。未指定時は5世代です。
あとはどこかのEC2で『all_createsnapshot.sh』を実行すれば、タグ付けされたEC2のSnapShotが取得されます。
なおバックアップ削除は『Descriptionに「AutoBackup」という文字列が含まれている物のみ』対象にします。手動取得したSnapshotsが勝手に消去されることは無いのでご安心下さい。
参照元:
【AWS】クラウド時代のバックアップ管理術 ~tagを活用したsnapshotの世代管理~
Amazon EBSのスナップショット(バックアップ)を取得しつつ世代管理も行うスクリプト

0 件のコメント:
コメントを投稿