AWS SDKを使用せず、AWS CLIのみで自動AMIバックアップスクリプトを作成してみました。
AMIを保管する世代を管理でき、削除も自動で行います。
導入がとても簡単なので、楽なので、SDKで作ったものが動かない!なんて時には、是非ご使用してみてください。
【使用前提条件、事前作業】
①EC2に以下のタグがあること。
| キー | 値 |
| Backup-Generation | バックアップしたい世代数 |
| Name | インスタンス名 |
以下、値の例です。
②キックする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を簡単に検索することも可能です!