この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。サービスグループの武田です。
ふと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つ目はポリシーバージョンの削除です。これはポイントというよりかは自分が知らなかっただけなのですが、ポリシーを削除する場合はデフォルト以外のバージョンをすべて消しておく必要があります。そもそもポリシーにバージョンがあるという認識がなかったので学びでした。
まとめ
検証を繰り返していると知らぬ間にゴミリソースがたまりがちです。今回のポリシーなどは料金がかかりませんが、リソースによっては料金が発生するものもあります。定期的に環境のチェックと掃除をしてみてはいかがでしょうか。