如何使用 boto3 从 IAM CreateRole 事件的 cloudtrail 事件中提取角色名称、策略
How to extract rolename, policy from cloudtrail event for IAM CreateRole event using boto3
正在尝试创建 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"
},
{
"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 规则中定义一个规则,以便发送的事件以用户指定的模式出现?
请分享任何指示或示例。
谢谢
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 不控制事件到达的顺序。如果您需要在阅读之前按特定顺序排列事件,则可能需要对其进行排序。
来自
>>> 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'}]
EventBridge 在“详细信息”块内发送事件。因此,要访问 roleName 的信息,请使用以下内容:
role_name = event['detail']['requestParameters']['roleName']
这确实有效。
如果您在 CloudTrail 中观看相同的事件,它也会令人困惑,它实际上显示了原始事件,但没有将其封装在 'detail' 对象中。
正在尝试创建 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"
},
{
"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 规则中定义一个规则,以便发送的事件以用户指定的模式出现?
请分享任何指示或示例。
谢谢
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 不控制事件到达的顺序。如果您需要在阅读之前按特定顺序排列事件,则可能需要对其进行排序。
来自
>>> 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'}]
EventBridge 在“详细信息”块内发送事件。因此,要访问 roleName 的信息,请使用以下内容:
role_name = event['detail']['requestParameters']['roleName']
这确实有效。
如果您在 CloudTrail 中观看相同的事件,它也会令人困惑,它实际上显示了原始事件,但没有将其封装在 'detail' 对象中。