如何使用 boto3 从 IAM CreateRole 事件的 cloudtrail 事件中提取角色名称、策略

问题描述

尝试创建 EventBridge 规则以从源“aws.iam”获取事件“CreateRole”。

来自 cloudtrail 的事件有一个包含 3 个元素的数组“resources”,rolename、arn、account_id。他们有这样的模式:

"Resources": [
                {
                    "ResourceType": "AWS::IAM::Role","ResourceName": "********gdggdgd***"
                },{
                    "ResourceType": "AWS::IAM::Role","ResourceName": "arn:aws:iam::<account_id>:role/sample-test-5"
                },"ResourceName": "sample-test-5"
                }
            ]

但是这些元素的顺序是随机的,在某些事件角色名称中 - sample-test-5 作为第一个元素出现,而在某些事件中它出现在中间或最后。

现在在 lambda 中,使用 json 提取角色名称,如下所示:

 role_name = event['Resources'][0]['ResourceName']

以便使用role_name 可以获得boto3 的客户端。但是由于数组中元素顺序随机,在某些情况下无法获取正确的role_name,也无法获取boto3客户端。

尝试使用 boto3 客户端直接获取角色名称,但不可用。获取角色,需要传入参数rolename:

response = client.get_role(
    RoleName='string'
)

那么如何从具有随机元素顺序的原始事件中获取角色名称

我是否也可以在 EventBridge 规则中定义一个规则,以便发送的事件以用户指定的模式出现?

分享任何提示或示例。

谢谢

解决方法

EventBridge 允许您根据事件和规则模式匹配数组。您可以看到参考 https://docs.aws.amazon.com/eventbridge/latest/userguide/arrays-in-eventbridge-event-patterns.html

例如,考虑一个包含以下内容的事件模式。

  "resources": [
   "arn:aws:ec2:us-east-1:123456789012:instance/i-b188560f","arn:aws:ec2:us-east-1:111122223333:instance/i-b188560f","arn:aws:ec2:us-east-1:444455556666:instance/i-b188560f",]

此示例模式匹配包含以下文本的事件,因为模式数组中的第一项与事件数组中的第二项匹配。

 "resources": [
   "arn:aws:autoscaling:us-east-1:123456789012:autoScalingGroup:eb56d16b-bbf0-401d-b893-d5978ed4a025:autoScalingGroupName/ASGTerminate","arn:aws:ec2:us-east-1:123456789012:instance/i-b188560f" 
  ]

EventBridge 不控制事件到达的顺序。如果您需要在阅读事件之前按特定顺序排列事件,则可能需要对其进行排序。

来自https://stackoverflow.com/a/57714526

>>> from operator import itemgetter
>>> arr = [{'score': 10,'name': 'Bob'},{'score': 15,'name':'Susan'},{'score': 1,'name': 'Skippy'}]
>>> sorted(arr,key=itemgetter('score'),reverse=True)
[{'score': 15,'name': 'Susan'},{'score': 10,'name': 'Skippy'}]
,

EventBridge 在“详细信息”块内发送事件。因此,要访问 roleName 的信息,请使用以下内容:

role_name = event['detail']['requestParameters']['roleName']

这确实有效。

如果您在 CloudTrail 中观看相同的事件也会令人困惑,它实际上显示了原始事件,而没有将其封装在“详细信息”对象中。