boto3调用IAM接口分页时最后一个marker失效问题求助
问题根因
- AWS IAM的分页查询marker是基于请求发起时刻的资源集合快照生成的,你在每次拿到单页策略后直接执行了解绑操作,修改了角色当前绑定的策略总集合,后续请求使用旧marker查询时,资源集合的偏移位置已经发生变化,因此出现第三轮请求返回空列表、遗漏策略的问题。
- 你设置的
MaxItems=1放大了这个问题:每次只返回1条,每拉1条就修改资源集合,分页偏移直接失效。
修复方案
调整执行逻辑:先全量拉取该角色所有绑定的策略,存入本地列表后,再统一遍历执行解绑/删除操作,避免拉取过程中修改资源集合导致分页异常。
修正后代码示例
def get_policies(role_name): marker = None # 先全量收集所有绑定的策略 all_attached_policies = [] # 第一步:全量拉取策略,不做修改操作 while True: if marker: resp = iam.list_attached_role_policies( RoleName=role_name, Marker=marker ) else: resp = iam.list_attached_role_policies( RoleName=role_name ) all_attached_policies.extend(resp['AttachedPolicies']) if resp['IsTruncated']: marker = resp['Marker'] else: break # 第二步:遍历本地列表执行解绑/删除 for policy in all_attached_policies: detach_policy_from_entities(policy['PolicyArn']) print(f"{policy['PolicyName']} 已解绑") # 按需打开删除策略的注释 # iam.delete_policy(PolicyArn=policy['PolicyArn']) # print(f"{policy['PolicyName']} 已删除") print("策略处理完成") return "finished"
内容的提问来源于stack exchange,提问作者Reyansh Kharga
相关产品推荐
相关产品推荐

