在AWS Lambda提取GuardDuty findings IP时遇类型错误求助
解决GuardDuty Findings提取IP时的TypeError问题
这个错误其实很好排查,咱们一步步拆解问题根源:
错误原因分析
你遇到的TypeError: list indices must be integers or slices, not str,核心问题是用字符串索引了列表对象:
- GuardDuty的
get_findings接口返回的Findings字段始终是一个列表(哪怕你只传入单个Finding ID),你直接用loadFindings['Findings']['Resource'],相当于给列表传了字符串索引,自然会报错。 - 另外,每个Finding里的
NetworkInterfaces也是列表(一个云资源可能绑定多个网卡),同样不能直接用字符串索引。
修复后的代码
我不仅帮你修复了IP提取的问题,还优化了冗余的代码逻辑(比如没必要反复转JSON、手动维护position变量):
import json import boto3 from pprint import pprint def lambda_handler(event, context): client = boto3.client('guardduty') Det_ID = '5ab1b6808e98faaabd947a01af9ed970' # 获取所有Finding ID,boto3直接返回字典,无需转JSON response = client.list_findings(DetectorId=Det_ID) id_list = response['FindingIds'] findings_list = [] # 直接遍历ID列表,不用手动维护position for finding_id in id_list: # 获取单个Finding详情 all_findings = client.get_findings( DetectorId=Det_ID, FindingIds=[finding_id] ) # 从Findings列表中取出第一个元素(因为我们只查了一个ID) finding = all_findings['Findings'][0] # 增加空值判断,避免部分Finding没有网卡或公网IP导致报错 if 'Resource' in finding and 'NetworkInterfaces' in finding['Resource']: # 遍历每个网卡,提取公网IP for interface in finding['Resource']['NetworkInterfaces']: if 'PublicIp' in interface: public_ip = interface['PublicIp'] print(f"Finding {finding_id} 的公网IP:{public_ip}") findings_list.append({ 'finding_id': finding_id, 'public_ip': public_ip }) return { 'statusCode': 200, 'body': json.dumps(findings_list) }
额外优化说明
- 去掉冗余的JSON转义:boto3返回的响应本身就是Python字典,不需要用
json.dumps再json.loads,既浪费资源又没必要。 - 增加空值校验:不是所有GuardDuty Finding都包含资源网卡信息,加判断能避免意外的KeyError。
- 简化循环逻辑:直接遍历ID列表的元素,不用手动维护position变量,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Sam Pitman
相关产品推荐
相关产品推荐

