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を簡単に検索することも可能です!