背景
ある業務で2022年12月31日より前に作成されたAMIを一括削除する対応が必要になりました。
対象のAMIってどれくらいあるんだろっとコンソールを確認したところ50個弱のAMIがあることを確認。
手動で消せなくもないけど楽をしたい、、と思いシェルスクリプトとAWS CLIで半自動化できないか考えてみました。結構簡単にできたのでご紹介します。
削除対象の確認
まずは2022年12月31日より前に作成されたAMIを一括出力して対象を確認しました。やっていることは単純で、ami_idsにAWS CLIコマンドを使ってAMI名を格納させ、for文で繰り返し処理させています。
CreationDateを使用することで2022年12月31日より前に作成されたAMIを指定することができました。
!/bin/bash
# リージョンをアジアパシフィック (東京)に指定
region="ap-northeast-1"
# AMI取得
ami_ids=$(aws ec2 describe-images --region $region --owners self --query 'Images[?CreationDate<`2023-12-31`]ImageId]' --output text)
# AMI毎に繰り返す
for ami_id in $ami_ids; do
echo "$ami_id"
# AMIに関連付けられた各スナップショット取得
snapshots=$(aws ec2 describe-snapshots --owner-ids self --filters "Name=description,Values=*${ami_id}*" --query 'Snapshots[*].[SnapshotId]' --output text)
# スナップショットIDを表示
echo "$snapshots"
echo "-----"
done
出力結果(抜粋)
$ ./ami_snapshot.sh ami-00xxxxxxxxxxxx 2022-12-12T23:43:49.000Z snap-xxxxxxxxxxxx ----- ami-00xxxxxxxxxxxx 2022-08-15T07:53:12.000Z snap-xxxxxxxxxxxx ----- $
削除
一覧の取得が終わり、amiの作成日も問題ないことがわかったので削除を行います。
スクリプトは下記のような感じで、一覧取得の時とほとんどスクリプトは一緒です。
for分の中にAMIとスナップショットを削除するコマンドを追加しました。
また、繰り返し処理し続けていると負荷がかかるため『sleep 1』を追加して処理間隔を空けました。
#!/bin/bash
# リージョンをアジアパシフィック (東京)に指定
region="ap-northeast-1"
# AMI取得
ami_ids=$(aws ec2 describe-images --region $region --owners self --query 'Images[?CreationDate<`2023-12-31`]ImageId]' --output text)
# AMI毎に繰り返す
for ami_id in $ami_ids; do
echo "AMI: $ami_id"
# AMIに関連付けられた各スナップショット取得
snapshots=$(aws ec2 describe-snapshots --region $region --owner-ids self --filters "Name=description,Values=*${ami_id}*" --query 'Snapshots[*].[SnapshotId]' --output text)
# AMIを削除
aws ec2 deregister-image --region $region --image-id $ami_id
echo "Deleted AMI: $ami_id"
# スナップショットを削除
for snapshot_id in $snapshots; do
aws ec2 delete-snapshot --region $region --snapshot-id $snapshot_id
echo "Deleted snapshot: $snapshot_id"
sleep 1
done
echo "-----"
done
出力結果(抜粋)
$ ./delete.sh AMI:ami-00xxxxxxxxxxxx Deleted AMI: ami-00xxxxxxxxxxxx Deleted snapshot: snap-xxxxxxxxxxxx ----- AMI:ami-00xxxxxxxxxxxx Deleted AMI: ami-xxxxxxxxxxxx Deleted snapshot: snap-xxxxxxxxxxxx ----- $
無事削除されたことを確認できました。
今回のように単純な繰り返し処理ならシェルスクリプトは便利だなぁと改めて実感しました。