如何在CloudWatch LogsGroup中保存Athena查询内容、执行用户等信息
Athena查询日志补全字段实现方案
结论:可以实现,原生EventBridge直接推送的Athena状态变更事件默认不包含你需要的三类字段,需要通过Lambda二次加工后写入CloudWatch日志组
核心原理
你当前收到的事件中包含唯一标识queryExecutionId,通过该ID调用Athena的get_query_executionAPI即可获取所有缺失的信息:
- 实际执行的SQL请求内容:对应API返回结果的
QueryExecution.Query字段 - 请求执行相关时间:请求发起时间对应
QueryExecution.Status.SubmissionDateTime,查询总耗时对应QueryExecution.Statistics.TotalExecutionTimeInMillis - 执行请求的用户身份:对应
QueryExecution.ExecutionParameters.Principal字段,为发起查询的IAM身份ARN
具体实现步骤
- 调整原有EventBridge规则的目标配置:删除直接推送至CloudWatch日志组的目标,新增触发Lambda函数的目标
- 配置Lambda的执行权限:给Lambda对应的IAM角色添加
athena:GetQueryExecution和logs:PutLogEvents权限 - 编写Lambda处理逻辑:
- 解析收到的Athena状态变更事件,提取
queryExecutionId和原有事件字段 - 调用
get_query_execution接口拉取查询元数据,提取你需要的三个补充字段 - 拼接原有事件和补充字段,生成完整的日志结构
- 调用CloudWatch Logs的
put_log_events接口,将完整日志写入你指定的日志组
- 解析收到的Athena状态变更事件,提取
- 可选优化:在Lambda中增加状态判断逻辑,仅当查询进入
SUCCEEDED/FAILED/CANCELLED终态时才写入日志,避免重复写入QUEUED、RUNNING状态的冗余数据
内容的提问来源于stack exchange,提问作者Mitsukk
相关产品推荐
相关产品推荐

