awscliを使ったEC2でEBSのsnapshotを取得するスクリプト(bash)

2020-12-29 - 読み終える時間: 3 分

また不細工なスクリプトが出来てしまった・・・

環境

  • wslのubuntuにAWSCLI V2を入れて使う
  • awscliのプロファイルは登録済み(アクセスキーを使用)

コード全文

#!/bin/bash

#CREATE zin@alterworks.tokyo
#DATE   2020-12-29

##set Generation
declare -i val_GEN_=1

##set profile $val_PROF_
if [ "${1}"=="" ]; then
    val_PROF_=profile1
else
    val_PROF_=${1}
fi

##set $val_APPTAG_
if [ "${2}"=="" ]; then
    val_APPTAG_=application.url
else
    val_PROF_=${2}
fi

##set description $val_DESCRIPT_
val_NOW_=`date +%Y%m%d_%H`
val_DESCRIPT_="Create by ${0} - ${val_NOW_}"

##get volume id ${arr_VOLIDS_[]}
declare -a arr_VOLNAME_=("app-strage" "data-strage")
declare -a arr_VOLIDS_
for i in ${arr_VOLNAME_[@]}
do
    arr_VOLIDS_=(${arr_VOLIDS_[@]} `aws --profile ${val_PROF_} ec2 describe-volumes --filters Name="tag:Name",Values=${i} --query "Volumes[*].VolumeId" --output text`)
done

##create snapshots
val_VOLIDCOUNT_=`expr ${#arr_VOLIDS_[@]} - 1`
for x in `seq 0 ${val_VOLIDCOUNT_}`
do
    aws --profile ${val_PROF_} ec2 create-snapshot \
    --description "${val_DESCRIPT_}" \
    --volume-id ${arr_VOLIDS_[${x}]} \
    --tag-specifications "ResourceType=snapshot,Tags=[{Key=Name,Value=${arr_VOLNAME_[${x}]}},{Key=APP,Value=${val_APPTAG_}}]" >> /tmp/${0}-${val_NOW_}.log
    sleep 3
done

##rotate Generatation
declare -i val_SNAPCOUNT_
declare -i val_BORDER_
for c in `seq 0 ${val_VOLIDCOUNT_}`
do
    val_SNAPCOUNT_=`aws --profile ${val_PROF_} ec2 describe-snapshots --owner-ids self --filters Name=volume-id,Values=${arr_VOLIDS_[${c}]} --query "Snapshots[*].[SnapshotId]" --output text | wc -l`
    if [ "${val_SNAPCOUNT_}" -le "${val_GEN_}" ]; then
        echo No deleted snapshots.
        exit 0
    else
        val_BORDER_=`expr ${val_SNAPCOUNT_} - ${val_GEN_}`
        arr_DELSNAPIDS_=(`aws --profile ${val_PROF_} \
        ec2 describe-snapshots --owner-ids self \
        --filters Name=volume-id,Values=${arr_VOLIDS_[${c}]} \
        --query "reverse(sort_by(Snapshots,&StartTime))[*].[SnapshotId]" --output text | tail -n ${val_BORDER_}`)
        for n in ${arr_DELSNAPIDS_[*]}
        do
            aws --profile ${val_PROF_} ec2 delete-snapshot --snapshot-id ${n}
            if [ "$?" -eq "0" ]; then
                echo "deleted ${n} --- ${val_NOW_}" >> /tmp/${0}-${val_NOW_}.log
            else
                echo "failed ${n} deleting --- ${val_NOW_}" >> /tmp/${0}-${val_NOW_}.log
            fi
            sleep 2
        done
    fi
done

declare -i valGEN=1

ここのとこの数字を変えれば残しておく世代数を変更できるよ。

やぼな解説

EBSボリュームの「Name」タグを指定してSnapshotを作成。 「declare -a arrVOLNAME=("app-strage" "data-strage")」これね。 新しい順に世代数分残して、古いスナップショットを削除します。


今日はここまで