自動AMIバックアップスクリプト作成しました(AWS CLIのみ使用)

AWS SDKを使用せず、AWS CLIのみで自動AMIバックアップスクリプトを作成してみました。
AMIを保管する世代を管理でき、削除も自動で行います。
導入がとても簡単なので、楽なので、SDKで作ったものが動かない!なんて時には、是非ご使用してみてください。

【使用前提条件、事前作業】

①EC2に以下のタグがあること。
キー
Backup-Generation バックアップしたい世代数
Name インスタンス名

以下、値の例です。

auto_ami_backup_img1

②キックするEC2でAWS CLIが使える状態であること(Amazon linuxはデフォルトで使えます。)

使えない場合は、インストールしてください。(ここでは省略します。)

# which aws
/usr/bin/aws
③IAMユーザー作成

マネージメントコンソールにて、ポリシー 「AmazonEC2FullAccess」 を割り当てたユーザーを作成します。

CLIの設定をします。

# aws configure --profile araitest
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Default region name [None]: ap-northeast-1
Default output format [None]: text

以下のようにコマンドを実行し、EC2情報が返ってくれば、正常に設定が完了しています。

# aws ec2 describe-instances --profile araitest --region ap-northeast-1 --instance-ids <インスタンスID>

スクリプトの設置

ami_auto_backup.shを任意のディレクトリに格納します。

# mkdir -p /root/AUTO_AMI_BACKUP/
# vim /root/AUTO_AMI_BACKUP/ami_auto_backup.sh

▼ami_auto_backup.sh
※ 13,14行目の”PROFILE”と”REGION”は環境に応じて変更してください。

#!/bin/bash
#
# PROFILE,REGION は環境によって変更してください。
#
# /etc/crontabに以下を設定。
# ----------------------------------------------------------------------------------------
# 30 2 * * *     root    /bin/sh /root/AUTO_AMI_BACKUP/ami_auto_backup.sh >/dev/null 2>&1
# ----------------------------------------------------------------------------------------
#
####################################################################################################
export HOME=/root;

PROFILE="araitest"
REGION="ap-northeast-1"

## tmpディレクトリチェック
if [ ! -e "/tmp" ];then
        mkdir -p /tmp
fi

## 「Backup-Generation」というタグが付いている、インスタンスID,世代数(Backup-GenerationのValue)を取得
/usr/bin/aws ec2 describe-tags --profile ${PROFILE} --region ${REGION} --filters "Name=tag-key,Values=Backup-Generation" | awk '{print $3" "$5}' > /tmp/tmp_get_data

while read INSTANCE_ID SEDAI_NO; do
    if [ ! -z ${INSTANCE_ID}  -a ! -z ${SEDAI_NO} ];then
        ## AMIの数を確認
        NOW_AMI_CNT=`/usr/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filters Name=tag-key,Values=Backup-Type Name=tag-value,Values=auto --query 'sort_by(Images[].{YMD:CreationDate,Name:Name,ImageId:ImageId,DESC:Description},&YMD)' | grep "${INSTANCE_ID}" | wc -l`

        ## Backup-GenerationのValueと現在のAMI数を比較し、現在のAMI数がBackup-GenerationのValueに達していた場合は、一番古いAMIを削除する
        if [ ${NOW_AMI_CNT} -eq ${SEDAI_NO} ];then
            ## 削除対象のAMI_ID取得
            DELETE_AMI_ID=`/usr/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filters Name=tag-key,Values=Backup-Type Name=tag-value,Values=auto --query 'sort_by(Images[].{YMD:CreationDate,Name:Name,ImageId:ImageId,DESC:Description},&YMD)' | grep "${INSTANCE_ID}" | head -1 | awk '{print $4}'`

            ## AMI登録の解除
            /usr/bin/aws ec2 deregister-image --profile ${PROFILE} --region ${REGION} --image-id ${DELETE_AMI_ID}

            ## 削除対象のスナップショットID取得
            DELETE_SNAPSHOT_ID=`/usr/bin/aws ec2 describe-snapshots --profile ${PROFILE} --region ${REGION} --filters Name=description,Values=*${DELETE_AMI_ID}* --query 'Snapshots[*].{ID:SnapshotId}'`
            ## スナップショットの削除
            /usr/bin/aws ec2 delete-snapshot --profile ${PROFILE} --region ${REGION} --snapshot-id ${DELETE_SNAPSHOT_ID}
        fi

        ## インスタンス名取得
        INSTANCE_NAME=`/usr/bin/aws ec2 describe-tags --profile ${PROFILE} --region ${REGION} --filters "Name=tag-key,Values=Name" | grep "${INSTANCE_ID}" | awk '{print $5}'`

        ## AMI作成
        DATE=`date +%Y%m%d%H%M%S`
        CREATE_AMI_ID=`/usr/bin/aws ec2 create-image --profile ${PROFILE} --region ${REGION} --instance-id ${INSTANCE_ID} --name "${INSTANCE_NAME}_${DATE}" --description "Create from ${INSTANCE_ID}" --no-reboot`

        sleep 2

        ## AMIにタグを付けする(例:  Name:amazon-linux-test-SV   Backup-Type:auto)
        /usr/bin/aws ec2 create-tags --profile ${PROFILE} --region ${REGION} --resources ${CREATE_AMI_ID} --tags Key=Name,Value=${INSTANCE_NAME} Key=Backup-Type,Value=auto
    fi
done < /tmp/tmp_get_data

rm -f /tmp/tmp_get_data

exit 0

Cronの設定

/etc/crontabに以下のように設定する。 (AM2:30に毎日起動)

30 2 * * *     root    /bin/sh /root/AUTO_AMI_BACKUP/ami_auto_backup.sh >/dev/null 2>&1

実行結果

自動で作成されたAMIに以下のタグが付きます。

キー
Backup-Type auto(固定)
Name インスタンス名

以下、値の例です。

マネージメントコンソールで、「Backup-Type」で検索すれば、自動で作成されたAMIを簡単に検索することも可能です!