Cloud Function因KeyError 'project'崩溃,Webex通知功能故障
解决Security Command Center告警推送Webex Teams的KeyError 'project'问题
问题核心
KeyError 'project' 表明你的代码尝试访问字典(SCC告警事件的payload)中不存在的project字段。组织级SCC的告警事件结构和项目级存在差异,你之前尝试的project_id可能也不在预期的层级。
排查与修复步骤
1. 打印完整事件payload,明确字段结构
在函数开头添加日志输出,获取完整的事件数据,确认实际存在的字段:
import json import logging def scc_to_webex(event, context): # 打印完整事件结构,便于排查字段位置 logging.info("Full SCC event payload:\n%s", json.dumps(event, indent=2)) # 原有业务逻辑代码...
部署后触发一次告警,查看Cloud Function日志,定位项目相关信息的实际位置(常见位置包括jsonPayload.finding.resource_name、jsonPayload.finding.parent或resource.project)。
2. 修正项目ID的提取逻辑
根据日志中的实际结构调整代码,比如从resource_name提取项目ID:
# 假设告警finding数据在event['jsonPayload']['finding']中 finding = event['jsonPayload']['finding'] resource_name = finding.get('resource_name', '') # 解析resource_name(格式示例://cloudresourcemanager.googleapis.com/projects/your-project-id) if '/projects/' in resource_name: project_id = resource_name.split('/projects/')[1].split('/')[0] else: project_id = '未知项目'
如果项目信息在parent字段中,可改用以下逻辑:
parent = finding.get('parent', '') if '/projects/' in parent: project_id = parent.split('/projects/')[1].split('/')[0]
3. 避免硬编码字段访问
所有字典字段访问改用get()方法,避免KeyError:
# 替代直接下标访问event['project'] project_id = event.get('project_id', '未知项目') # 针对嵌套字段的安全访问 project_id = event.get('jsonPayload', {}).get('finding', {}).get('project_id', '未知项目')
4. 确认SCC事件触发范围
确保你的Cloud Function绑定的是组织级SCC通知,而非项目级。组织级事件的字段结构更复杂,项目信息通常不会出现在顶层字段中。
内容的提问来源于stack exchange,提问作者smzj_2023
相关产品推荐
相关产品推荐

