わたねこコーリング

野良プログラマ発、日々のアウトプット

【AWS】ラムダ関数削除で取り残された IAM ロールとポリシーを整理する

ラムダ関数をコンソールから生成すると、特に明示しない限り、勝手に実行ロールおよびポリシーが生成されます。この関数をまたコンソールから削除すると、ロールとポリシーは残ったまま取り残されるので、ちょっとした実験やプロトタイピングでコンソールからラムダ関数の生成・削除を繰り返していると、どんどん由来不明なロール・ポリシーが溜まってつらぽよ… てのは AWS あるあるでは? その辺を AWS CLI で何とかしようという小ネタです。

まず、ラムダ関数削除から取り残された IAM ロールのリストアップ。aws iam list-roles でロール一覧を出力してみると、ラムダ関数に伴って生成されたロールは Roles[].AssumeRolePolicyDocument.Statement[].Principal.Service の値が "lambda.amazonaws.com" になっているようです。なので、

aws iam list-roles --query 'Roles[?AssumeRolePolicyDocument.Statement[0].Principal.Service==`lambda.amazonaws.com`].Arn'

とフィルタリングすればラムダ関数生成由来のロール ARN 一覧がゲットできそう。あとは、それぞれについて、ラムダ関数が未だ存在しているか調べて、孤児状態ならアタッチされたポリシーも添えて出力するようにしたのが、下記スクリプト(bash)です。

IAM_ROLE_ARNS=$(aws iam list-roles --query 'Roles[?AssumeRolePolicyDocument.Statement[0].Principal.Service==`lambda.amazonaws.com`].Arn' --output text)

for ROLE_ARN in ${IAM_ROLE_ARNS}; do
  LAMBDA_NAME=$(aws lambda list-functions --query 'Functions[?Role==`'${ROLE_ARN}'`].FunctionName' --output text)
  if [ -n "${LAMBDA_NAME}" ]; then
    continue
  fi
  ROLE_NAME=$(basename ${ROLE_ARN})
  ROLE_DATE=$(aws iam get-role --role-name ${ROLE_NAME} --query 'Role.CreateDate' --output text)
  echo -e "${ROLE_NAME}\t${ROLE_DATE}"
  POLICIE_ARNS=$(aws iam list-attached-role-policies --role-name ${ROLE_NAME} --query 'AttachedPolicies[].PolicyArn' --output text)
  for POLICIE_ARN in ${POLICIE_ARNS}; do
    echo -e "\t$(aws iam get-policy --policy-arn ${POLICIE_ARN} --query 'Policy.[PolicyName,CreateDate]' --output text)"
  done
done

この出力書式は、タブ区切りテキストで

<ロール1の名前> <生成日時>
 <ロール1にアタッチされたポリシー1の名前> <生成日時>
 <ロール1にアタッチされたポリシー2の名前> <生成日時>
<ロール2の名前> <生成日時>
 <ロール2にアタッチされたポリシー1の名前> <生成日時>
 <ロール2にアタッチされたポリシー2の名前> <生成日時>
...

という感じです。事前に作っておいたロール・ポリシーをラムダ関数に紐づけた可能性も排除できないので、削除処理までは組み込んでいません。が、ラムダ関数生成由来のロールは <関数名>-role-<8桁くらいのランダム英数字文字列>、アタッチされたポリシーは AWSLambdaBasicExecutionRole-<UUID> という命名がされているようなので、リストから名前と生成日時をチェックすれば、削除して良いかどうかだいたい判断できるんじゃないでしょうか。少なくとも IAM コンソールでロール・ポリシーの一覧とにらめっこして、「これ、何処で使ってるんだっけ?」という状態は解消できるかな、と。