【AWS】IAM Role 一覧とアタッチされているポリシーをCSVで出力【boto3】

IAM ロールの一覧とそれにアタッチしているポリシーの一覧を作る必要があり、
手動だと手間がかかるので、Python(boto3)を使ってCSVで出力できるようにしました。

やったこと

PythonでIAM Roleの一覧とアタッチされているIAMポリシーをCSVで出力する。

【CSV カラム】

  • IAM Role名
  • IAM Role ARN
  • Customer Policy
  • Managed Policy

【処理の流れ】

  1. IAM Roleの一覧を取得
  2. . 取得したIAM Role名からアタッチされているIAM ポリシーを取得しDF化
  3. DFをCSVで出力

以下はDFで出力したときの表です。 f:id:ykoomaru:20191130092835p:plain

ちなみにカスタマーポリシーとマネージドポリシーで取得するAPIが異なるので注意が必要です。

  • カスタマーポリシー : list_role_policies
  • マネージドポリシー : list_attached_role_policies

スクリプト

aws/IAMRoleList.py at master · koonagi/aws · GitHub

import boto3
import json
import pprint as pp
import pandas as pd

#クライアントの生成
client = boto3.client('iam')

#IAMRole一覧の取得
responce = client.list_roles()
Roles = responce['Roles']

#IAMRole名とARNの取得
list_rolename = []
list_rolearn = []

for items in Roles:
    list_rolename.append(items['RoleName'])
    list_rolearn.append(items['Arn'])


#Role名よりアタッチされているIAMポリシーの取得
list_customerpolicy = []
list_managedpolicy = []

for items in Roles:
    customerpolicy = client.list_role_policies(
    RoleName=items['RoleName']
    )
    
    managedpolicy = client.list_attached_role_policies(
    RoleName=items['RoleName']
    )
    
    
    if managedpolicy['AttachedPolicies']:
        join_managedpolicy = []
        for i, policy in enumerate(managedpolicy['AttachedPolicies']):
            join_managedpolicy.append(policy['PolicyName'])
        list_managedpolicy.append(",".join(join_managedpolicy))
        list_customerpolicy.append(",".join(customerpolicy['PolicyNames']))
        continue
    list_customerpolicy.append(",".join(customerpolicy['PolicyNames']))
    list_managedpolicy.append(" ".join(managedpolicy['AttachedPolicies']))

#データフレームに入れるためのリスト
informations = []
informations.append(list_rolename)
informations.append(list_rolearn)
informations.append(list_customerpolicy)
informations.append(list_managedpolicy)

#データフレーム化
df = pd.DataFrame({
    'RoleName' : informations[0],
    'RoleArn' : informations[1],
    'CustomerPolicyName' : informations[2],
    'ManagedPolicyName' : informations[3]
    }
)

#DFの表示
display(df)

#CSVに出力
df.to_csv("IAMRoleList.csv")