我们如何使用Boto3获取IAM服务上次访问的详细信息



以下是转换为report\csv格式之前的代码

client=boto3.client('iam',aws_access_key_id='somedeclaredvariable',aws_secret_access_key='somedeclaredvariable')
users=client.list_users()
for x in users['Users']:
response = client.generate_service_last_accessed_details(Arn=x['Arn'],Granularity='SERVICE_LEVEL')
response1=client.get_service_last_accessed_details(JobId=response['JobId'])
if(response1['JobStatus']!='IN_PROGRESS'):
print(response1['ServicesLastAccessed'])

我得到的输出在服务上次访问列表中没有任何数据

它只是一个空列表:[]

我在AWS Lambda 中运行相同的代码

import json
import boto3
def lambda_handler(event, context):
# TODO implement
client=boto3.client('iam')
users=client.list_users()
print(users)

for x in users['Users']:

response = client.generate_service_last_accessed_details(Arn=x['Arn'],Granularity='SERVICE_LEVEL')
print(response)
response1=client.get_service_last_accessed_details(JobId=response['JobId'])
if(response1['JobStatus']!='IN_PROGRESS'):
print(response1['ServicesLastAccessed'])

generate_service_last_accessed_details(**kwargs)

生成一个报告,其中包括IAM资源(用户、组、角色或策略(上次尝试访问AWS服务时的详细信息。最近的活动通常在四小时内出现。

我也没有得到GenerateServiceLastAccessedDetails的结果。但我试着运行另一个使用相同用户角色的Lambda。不是这个得到了访问权限之后我才能得到结果。

{'JobId': 'XXXXX', 'ResponseMetadata': {'RequestId': 'bac90379-dXXXXX', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'bac90XXXX', 'content-type': 'text/xml', 'content-length': '395', 'date': 'Thu, 15 Oct 2020 06:40:29 GMT'}, 'RetryAttempts': 0}}

明确表示get_service_last_accessed_details(**kwargs)检索使用GenerateServiceLastAccessedDetails操作创建的上次访问的服务报告。注意

  • 确保您有权访问IAM角色,该角色将获取用户详细信息
  • 它提供最后四个小时的活动。尝试立即访问,然后运行此代码

我发现你必须对get_service_last_accessed_details(JobId=(的结果进行轮询,直到你得到的JobStatus为COMPLETED。

我进行了一系列等待,以涵盖快速响应的情况和较慢的情况,例如

for job_wait in (0.1, 0.1, 0.2, 0.4, 0.5, 1.0, 1.0):
response = ...
status = response.get('JobStatus', '')
if status == 'COMPLETED':
.... exit with result
time.sleep(job_wait)
else:
# loop completed without getting a result

最新更新