背景
ある業務で2022年12月31日より前に作成されたAMIを一括削除する対応が必要になりました。
対象のAMIってどれくらいあるんだろっとコンソールを確認したところ50個弱のAMIがあることを確認。
手動で消せなくもないけど楽をしたい、、と思いシェルスクリプトとAWS CLIで半自動化できないか考えてみました。結構簡単にできたのでご紹介します。
削除対象の確認
まずは2022年12月31日より前に作成されたAMIを一括出力して対象を確認しました。やっていることは単純で、ami_idsにAWS CLIコマンドを使ってAMI名を格納させ、for文で繰り返し処理させています。
!/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 ----- $
削除
#!/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 ----- $