AWS IAMの使用していないカスタマー管理ポリシーをすべて削除する

こんにちは。サービスグループの武田です。未使用のカスタマー管理ポリシーが大量にあったので、簡単に削除できるスクリプトを作ってみたので共有します。
2022.03.09

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

こんにちは。サービスグループの武田です。

ふとAWS IAMのポリシー一覧を見てみたら作ったものの削除されていない、未使用のカスタマー管理ポリシーが大量にありました。最初はマネジメントコンソールでぽちぽち消してみたんですが、いちいち確認画面が出ますし数も多いので面倒になって来ました。

そんなわけで簡単に削除できるスクリプトを作ってみたので共有します。awsjqコマンドおよびbash環境で動作します。ローカルに環境がない場合はAWS CloudShellで実行してみてください。

#!/bin/bash

set -eu

policies=$(aws iam list-policies --scope Local)

while :; do
    delete_target=$(echo "$policies" | jq -rc '.Policies[] | select(.AttachmentCount == 0 and .PermissionsBoundaryUsageCount == 0)')

    for t in $delete_target; do
        versions=$(aws iam list-policy-versions --policy-arn $(echo "$t" | jq -r '.Arn'))
        for v in $(echo "$versions" | jq -rc '.Versions[]'); do
            if [[ $(echo "$v" | jq -r '.IsDefaultVersion') == "false" ]]; then
                aws iam delete-policy-version --policy-arn $(echo "$t" | jq -r '.Arn') --version-id $(echo "$v" | jq -r '.VersionId')
            fi
        done

        aws iam delete-policy --policy-arn $(echo "$t" | jq -r '.Arn')
    done

    next_token=$(echo "$policies" | jq -r '.NextToken')
    if [[ "$next_token" == "null" ]]; then
        break
    fi

    policies=$(aws iam list-policies --scope Local --starting-token "$next_token")
done

ポイントは2つあります。1つ目は--scope Localの指定です。単にlist-policiesを実行するとAWS管理ポリシーも取得されます。今回はカスタマー管理ポリシーだけを取得したいのでオプションを指定しました。2つ目はポリシーバージョンの削除です。これはポイントというよりかは自分が知らなかっただけなのですが、ポリシーを削除する場合はデフォルト以外のバージョンをすべて消しておく必要があります。そもそもポリシーにバージョンがあるという認識がなかったので学びでした。

まとめ

検証を繰り返していると知らぬ間にゴミリソースがたまりがちです。今回のポリシーなどは料金がかかりませんが、リソースによっては料金が発生するものもあります。定期的に環境のチェックと掃除をしてみてはいかがでしょうか。