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 个附加到给定角色的策略。
代码的工作原理如下:
- 最初标记是 None,它只是 运行 else 部分和 returns 1 个带有标记的结果用于下一次迭代
- 我使用标记得到另一组结果。它有效,returns 1 个结果带有下一次迭代的标记
- 我在这里使用标记,但它 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)
我正在使用 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 个附加到给定角色的策略。 代码的工作原理如下:
- 最初标记是 None,它只是 运行 else 部分和 returns 1 个带有标记的结果用于下一次迭代
- 我使用标记得到另一组结果。它有效,returns 1 个结果带有下一次迭代的标记
- 我在这里使用标记,但它 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)