You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CloudTrail事件记录缺失控制台显示资源,如何通过Python获取?

用Python结合cloudaux/boto提取AWS CloudTrail事件中所有引用资源

AWS CloudTrail事件的resources字段并非所有操作都会返回(比如AttachRolePolicy这类操作),但控制台能展示的引用资源,本质是通过解析事件的请求/响应参数生成的。以下是程序化的实现方案:

核心思路

通过预定义常见事件类型的参数映射规则,解析事件的requestParameters或responseElements字段,结合cloudaux/boto工具构造或获取资源ARN,补充resources字段的缺失内容。

实现步骤与代码示例

1. 定义事件-资源映射规则

针对不同事件类型,指定参数提取路径、资源类型,或直接调用cloudaux的资源查询方法:

import boto3
from cloudaux.aws.iam import get_role, get_policy

# 映射规则:键为事件名称,值为资源提取规则列表
EVENT_RESOURCE_RULES = {
    'AttachRolePolicy': [
        {
            'source': 'requestParameters',
            'key': 'roleName',
            'arn_template': 'arn:aws:iam::{account_id}:role/{value}',
            'resource_type': 'IAM::Role'
        },
        {
            'source': 'requestParameters',
            'key': 'policyArn',
            'handler': get_policy,
            'resource_type': 'IAM::Policy'
        }
    ],
    'CreateUser': [
        {
            'source': 'requestParameters',
            'key': 'userName',
            'arn_template': 'arn:aws:iam::{account_id}:user/{value}',
            'resource_type': 'IAM::User'
        }
    ]
}

2. 编写资源提取函数

根据规则解析事件,生成或获取资源ARN:

def extract_event_resources(event, account_id):
    extracted_resources = []
    event_name = event.get('eventName')
    
    # 优先返回事件原生的resources字段
    if 'resources' in event and len(event['resources']) > 0:
        return event['resources']
    
    # 处理预定义规则的事件
    if event_name not in EVENT_RESOURCE_RULES:
        return extracted_resources
    
    for rule in EVENT_RESOURCE_RULES[event_name]:
        source_data = event.get(rule['source'], {})
        resource_value = source_data.get(rule['key'])
        if not resource_value:
            continue
        
        # 方式1:通过ARN模板构造资源ARN
        if 'arn_template' in rule:
            arn = rule['arn_template'].format(account_id=account_id, value=resource_value)
            extracted_resources.append({
                'ARN': arn,
                'resourceType': rule['resource_type']
            })
        # 方式2:调用cloudaux工具查询资源详情,提取ARN
        elif 'handler' in rule:
            try:
                if rule['key'] == 'roleName':
                    resource_detail = rule['handler'](resource_value, account_number=account_id)
                else:
                    resource_detail = rule['handler'](resource_value, account_number=account_id)
                
                if resource_detail and 'Arn' in resource_detail:
                    extracted_resources.append({
                        'ARN': resource_detail['Arn'],
                        'resourceType': rule['resource_type']
                    })
            except Exception as e:
                # 捕获权限不足或资源不存在的异常
                print(f"Failed to fetch resource {resource_value}: {str(e)}")
    
    return extracted_resources

3. 结合CloudTrail API使用

从CloudTrail拉取事件后,调用提取函数获取完整资源列表:

# 初始化CloudTrail客户端
cloudtrail_client = boto3.client('cloudtrail')

# 查询指定事件
trail_events = cloudtrail_client.lookup_events(
    EventName='AttachRolePolicy',
    MaxResults=10
)['Events']

# 遍历事件提取资源
for event in trail_events:
    account_id = event.get('recipientAccountId')
    resources = extract_event_resources(event, account_id)
    print(f"事件ID {event['eventId']} 引用资源: {resources}")

方案优缺点

  • 优点:覆盖大部分高频操作,结合cloudaux可自动验证资源有效性,无需手动拼接ARN;
  • 缺点:需维护映射规则字典,新增事件类型时需补充对应规则。

内容的提问来源于stack exchange,提问作者Idan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:35:22