import boto3 import csv import re client = boto3.client('iam') app_families = {} groups = [] for list_groups_page in client.get_paginator('list_groups').paginate(): for group in list_groups_page['Groups']: group_name = group['GroupName'] for list_attached_group_policies_page in client.get_paginator('list_attached_group_policies').paginate( GroupName=group_name ): for policy in list_attached_group_policies_page['AttachedPolicies']: if match := re.search(r'ABAC-(.*)-tag-access-policy-part-1', policy['PolicyName']): app_family = match.group(1) app_families[app_family] = app_families.get(app_family, []) + [group_name] group_info = client.get_group(GroupName=group_name) users = [user['UserName'] for user in group_info['Users']] users.sort() groups.append({'Name': group_name, 'Users': '\n'.join(users)}) app_family_columns = ['Name', 'Groups'] with open('app_families.csv', 'w') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=app_family_columns) writer.writeheader() for app_family, app_family_groups in app_families.items(): app_family_groups.sort() writer.writerow({'Name': app_family, 'Groups': '\n'.join(app_family_groups)}) group_columns = ['Name', 'Users'] with open('groups.csv', 'w') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=group_columns) writer.writeheader() writer.writerows(groups)