AWS IAMの使用していないカスタマー管理ポリシーをすべて削除する
こんにちは。サービスグループの武田です。
ふとAWS IAMのポリシー一覧を見てみたら作ったものの削除されていない、未使用のカスタマー管理ポリシーが大量にありました。最初はマネジメントコンソールでぽちぽち消してみたんですが、いちいち確認画面が出ますし数も多いので面倒になって来ました。
そんなわけで簡単に削除できるスクリプトを作ってみたので共有します。aws
とjq
コマンドおよび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つ目はポリシーバージョンの削除です。これはポイントというよりかは自分が知らなかっただけなのですが、ポリシーを削除する場合はデフォルト以外のバージョンをすべて消しておく必要があります。そもそもポリシーにバージョンがあるという認識がなかったので学びでした。
まとめ
検証を繰り返していると知らぬ間にゴミリソースがたまりがちです。今回のポリシーなどは料金がかかりませんが、リソースによっては料金が発生するものもあります。定期的に環境のチェックと掃除をしてみてはいかがでしょうか。