-1

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

来自 cloudtrail 的事件有一个数组“资源”,其中包含 3 个元素: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"
                },
                {
                    "ResourceType": "AWS::IAM::Role",
                    "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'
)

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

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

请分享任何指示或示例。

谢谢

4

2 回答 2

1

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': 'Bob'}, {'score': 1, 'name': 'Skippy'}]
于 2021-02-12T02:45:10.410 回答
0

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

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

这实际上奏效了。

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

于 2021-02-12T16:17:23.343 回答