# 获取所有角色,无分页限制
roles = iam.list_roles(MaxItems=100)
role_details = []
for role in roles["Roles"]:
role_name = role["RoleName"]
if role.get("Path", "").startswith("/aws-service-role/"):
continue
# 分析每个角色...
attached = iam.list_attached_role_policies(RoleName=role_name)
# ...构建庞大的 JSON 输出
对于一个拥有 90 个角色的账户,这将生成 26,980 个字符的 JSON。LLM 处理不了。
修复后:
# 修复:按相关性分页并排序
all_roles = []
paginator = iam.get_paginator("list_roles")
for page in paginator.paginate():
all_roles.extend(page["Roles"])
# 过滤服务相关角色(31 个,无法修改)
auditable_roles = [
r for r in all_roles
if not r.get("Path", "").startswith("/aws-service-role/")
]
# 按最后使用日期排序(最活跃的在前)
auditable_roles.sort(key=_last_used_sort_key, reverse=True)
# 仅取前 20 个角色
roles_to_analyze = auditable_roles[:max_roles]
最后还有一个 token 预算保护:
# Token 预算保护:如果输出超过阈值则截断
if len(output) > 4000:
result["role_summary"] = [
{"role_name": r["role_name"], "policies": r.get("attached_policies", [])}
for r in role_details
]
result["note"] = "角色详情已截断,以保持在 token 预算内"
output = json.dumps(result, indent=2, default=str)