☁️

AWS CLIで全リージョンの全EC2インスタンスを削除する

2021/04/19に公開

はじめに

最近勉強会やハンズオンをよくやっているおかげで、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インスタンスの削除はできるようになりました。
このまま別のリソース削除をガンガン作っていきたいです;)

GitHubで編集を提案

Discussion