[TIPS] AMIとそれに紐づくスナップショットをBash Scriptでまとめて削除する

[TIPS] AMIとそれに紐づくスナップショットをBash Scriptでまとめて削除する

Clock Icon2019.02.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

小ネタです。

今回はAMI削除時に、それに紐づくEBSスナップショットをまとめて削除するためのTIPSを紹介します。

やりたいこと

作成したAMIを綺麗に削除したい場合、単純にAMIを登録解除するだけでは関連するsnapshotなどが残り続ける場合があります

この記事では、指定したAMIをスナップショット含め削除してくれる簡易なBash Scriptを紹介します。

スクリプト

以下が紹介するスクリプトです。事前にjqのインストールが必要です。

#!/bin/bash -e
# usage: bash delete-ami-completely.sh ami-xxxxxxxx ami-yyyyyyyy
AMI_IDS=$@
for AMI_ID in $AMI_IDS;do
SNAPSHOT_IDS=`aws ec2 describe-images --image-ids=$AMI_ID --query "Images[].BlockDeviceMappings[].Ebs.[SnapshotId]" --output text`
echo "deregister image $AMI_ID"
aws ec2 deregister-image --image-id=$AMI_ID
for SNAPSHOT_ID in $SNAPSHOT_IDS;do
echo "delete snapshot $SNAPSHOT_ID"
aws ec2 delete-snapshot --snapshot-id=$SNAPSHOT_ID
done
done

複数のAMI IDを指定するとスナップショット含めてまとめて削除してくれます。

おまけ

上記スクリプトの応用として、弊社が提供している自動実行サービスのバックアップをまとめて削除するスクリプトを紹介します。ジョブ名を指定すると、そのジョブが作成したAMIバックアップ全てをスナップショットも含めて削除できます。insightwatchへの移行時などにご利用ください。

#!/bin/bash -e
# usage: sh delete-cm-backups.sh cm-DailyBackupNoreboot
BACKUP_KEY='cm-Job'
BACKUP_VAL=$1
AMI_IDS=`aws ec2 describe-images --filters "Name=tag:${BACKUP_KEY},Values=${BACKUP_VAL}" \
"Name=state,Values=available" | jq -r .Images[].ImageId`
for AMI_ID in $AMI_IDS;do
SNAPSHOT_IDS=`aws ec2 describe-images --image-ids=$AMI_ID | jq -r .Images[].BlockDeviceMappings[].Ebs.SnapshotId`
echo "deregister image $AMI_ID"
aws ec2 deregister-image --image-id=$AMI_ID
for SNAPSHOT_ID in $SNAPSHOT_IDS;do
echo "delete snapshot $SNAPSHOT_ID"
aws ec2 delete-snapshot --snapshot-id=$SNAPSHOT_ID
done
done

自動実行サービスによるAMIバックアップジョブでは、ジョブの対象となるEC2インスタンスを、cm-DailyBackupNoreboot:trueのような指定のタグが付与されているかによって識別します。そして作成されたAMIバックアップには、EC2インスタンスのタグに対応する形でcm-Job:cm-DailyBackupNorebootのようなタグが付与されます。

このため、自動実行によって作成されたジョブを確認したい場合は、cm-Jobをタグキーに持ち、指定のジョブ名を値に持つAMIを検索することで簡単に特定することができます。AMIバックアップの削除に限らず、バックアップ件数の調査を行いたい場合などにも活用できます。

関連記事

本記事に限らず、近い目的で様々な記事が過去に作成されています。ユースケースに合わせて、より適したアプローチをご選択ください。

AMI削除時にスナップショットも自動で削除するCloudWatch Events AMIの登録解除をイベントフックして、自動的にLambdaから関連するスナップショットを削除する仕組みを作っています。

[EC2] 不要なAMIを一括で削除したい 大規模な数のAMIをまとめて削除するため、事前に対象をCSVに出力し、確認後にまとめて削除する手順を取っています。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.