boto3 分页的最后一个标记不起作用

Last marker for boto3 pagination is not working

我正在使用 AWS boto3 SDK 处理角色和策略。我想获取附加到给定角色的策略,然后进行一些处理。这是代码。

def get_policies(role_name):
    marker = None
    while True:
        print ('marker in get_policies is {} '.format(marker))
        if marker:
            response_iterator = iam.list_attached_role_policies(
                RoleName=role_name,
                # PathPrefix='string',
                Marker=marker,
                MaxItems=1
            )
        else:
            response_iterator = iam.list_attached_role_policies(
                RoleName=role_name,
                # PathPrefix='string',
                MaxItems=1
            )
        print("Next Page in get_policy : {} ".format(response_iterator['IsTruncated']))
        print(response_iterator['AttachedPolicies'])
        for policy in response_iterator['AttachedPolicies']:
            detach_policy_from_entities(policy['PolicyArn'])
            print(policy['PolicyName'] + " has to be deleted")
            # delete_policy_response = iam.delete_policy(
            #     PolicyArn=policy['PolicyArn']
            # )
            print('deleted {}'.format(policy['PolicyName']))
        if response_iterator['IsTruncated']:
            marker = response_iterator['Marker']
        else:
            print("done with policy deletion")
            return "finished"

除了它 returns 带有最后一个标记的空列表外,代码工作正常。因此,我有 3 个附加到给定角色的策略。 代码的工作原理如下:

  1. 最初标记是 None,它只是 运行 else 部分和 returns 1 个带有标记的结果用于下一次迭代
  2. 我使用标记得到另一组结果。它有效,returns 1 个结果带有下一次迭代的标记
  3. 我在这里使用标记,但它 returns 和空列表的政策,但我还有一个政策

任何帮助将不胜感激。

您的代码可以很好地配合您的分页逻辑,但我认为如果您不使用 MaxItems 默认情况下您不需要分页,list_attached_role_policies 函数是 return 100 个值。

此外,由于 IAM 实体的默认配额 定义您可以默认将 10 个托管策略附加到 IAM 角色,如果您不请求增加(更多可以找到 IAM 对象配额的信息 here).

所以,为了你的逻辑工作,你需要这样的东西:

import boto3

iam = boto3.client("iam")
role = "role_name"
policies = iam.list_attached_role_policies(RoleName=role)
policies_list = policies['AttachedPolicies']
for policy in policies_list:
    print(policy['PolicyName'])
    # you can add your detach logic here

此外 list_attached_role_policies 方法不 return 内联 政策,如果没有向您显示的政策是内联政策,您将需要list_role_policies 方法。

import boto3

iam = boto3.client("iam")
role = "role_name"
policies = iam.list_role_policies(RoleName=role)
policies_list = policies['PolicyNames']
for policy in policies_list:
    print(policy)
    # you can add your detach logic here

您似乎正在改变附加的角色策略,从而使分页标记无效。另外,除非您特别需要,否则我会删除 MaxItems=1.

一种解决方案是更改代码以简单地将策略 ARN 附加到列表,然后在 for policy in ... 循环后处理该列表以进行分离。

仅供参考,您应该考虑在角色上使用资源级 IAM.Role as it simplifies access to the associated policies (they are available via simple policies and attached_policies 集合)。例如:

import boto3

iam = boto3.resource("iam")
role = iam.Role("role-name-here")

for p in role.attached_policies.all():
    print(p)