はじめに
最近勉強会やハンズオンをよくやっているおかげで、AWSリソースの消し忘れが怖くなることが多くなりました。
特に残したいリソースも運用しているリソースもないのでいっそ自動で全リージョンのEC2インスタンスを全て削除するスクリプトを作っちゃおうと思います。
本題
実装
ec2-delete-instances() { # EC2削除 INSTANCE_IDS=$( aws ec2 describe-instances \ --region $1 \ --filters "Name=instance-state-name,Values=pending,running,stopped,stopping" \ --query "Reservations[].Instances[].[InstanceId]" \ --output text | sed -e "s/[\r\n]\+//g" ) if [ -n "${INSTANCE_IDS[0]}" ]; then aws ec2 terminate-instances \ --instance-ids $INSTANCE_IDS \ --region $1 fi aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text --region $1 | sed -e "s/[\r\n]\+//g" } echo "Start:delete-reaources-ec2 " regions=($(aws ec2 describe-regions --query Regions[*].RegionName --output text --region ap-northeast-1)) # リージョン単位で並列処理 for region in ${regions[@]}; do ec2-delete-instances $region & done wait echo "finish." :
解説
regions=($(aws ec2 describe-regions --query Regions[*].RegionName --output text --region ap-northeast-1))
使用可能なリージョンを全て取得します。
# リージョン単位で並列処理 for region in ${regions[@]}; do ec2-delete-instances $region & done wait
リージョンでループを回し、削除処理につなげます。
関数名の後ろに&
をつけることでリージョン単位で並列処理化しています。
INSTANCE_IDS=$( aws ec2 describe-instances \ --region $1 \ --filters "Name=instance-state-name,Values=pending,running,stopped,stopping" \ --query "Reservations[].Instances[].[InstanceId]" \ --output text | sed -e "s/[\r\n]\+//g" )
インスタンス情報を取得しています。
queryオプションを付与することでインスタンスIDのみを取得しています。
if [ -n "${INSTANCE_IDS[0]}" ]; then aws ec2 terminate-instances \ --instance-ids $INSTANCE_IDS \ --region $1 fi
インスタンスIDが取得できた場合は削除します。
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text --region $1 | sed -e "s/[\r\n]\+//g"
最後にインスタンスの状態を確認して終了です。
終わりに
ひとまずEC2インスタンスの削除はできるようになりました。
このまま別のリソース削除をガンガン作っていきたいです;)