Athena 本身不存储日志。它通过您定义的表在 S3 中查询日志文件,例如 CloudTrail、VPC 流日志、负载均衡器和 WAF 日志。常规查询结果会以 CSV 格式保存在您的结果桶中。如需 JSON,请在查询中使用 UNLOAD … WITH (format = ‘JSON’):Athena 将换行分隔的 JSON 写入 S3 前缀,您可以下载它。
许多 AWS 团队将几个月的日志保存在 S3 中,并使用 Athena 查询它们,而不是将所有内容发送到 SIEM。Prime Core 拥有超过 24,000 条独特检测规则,与 676 种 MITRE ATT&CK 技术相对应。以下是如何获取一个片段,清理它,并在 LogTotal 中免费调查。
在您开始之前
权限。 您需要运行 Athena 查询 (athena:StartQueryExecution 和相关操作),读取 Glue 中的表定义,读取源桶,并写入导出桶。如果日志使用 KMS 加密,请添加 kms:Decrypt。
了解表及其分区。 CloudTrail 表通常按区域和日期进行分区,使用分区投影或您添加的分区。Athena 按扫描的数据收费,因此每次都要对分区进行过滤。没有分区的查询可能会扫描数年的日志。
一个工作组。 Athena 在具有结果位置的工作组中运行查询。UNLOAD 写入其自身的目标,但仍需要设置工作组。
使用 UNLOAD 导出
UNLOAD (
SELECT *
FROM cloudtrail_logs
WHERE region = 'eu-west-1'
AND day = '2026/10/19'
AND useridentity.arn LIKE '%suspicious-user%'
)
TO 's3://my-athena-exports/ct-1019/'
WITH (format = 'JSON', compression = 'NONE')
调整分区列(区域、日期)以匹配您的表定义。目标前缀必须为空。
从命令行:
QID=$(aws athena start-query-execution –work-group primary
–query-string “$(cat unload.sql)”
–query ‘QueryExecutionId’ –output text)
# 等待直到成功
until [ “$(aws athena get-query-execution –query-execution-id “$QID”
–query ‘QueryExecution.Status.State’ –output text)” = “SUCCEEDED” ]; do sleep 5; done
aws s3 cp s3://my-athena-exports/ct-1019/ ./ct-1019/ –recursive
zcat -f ./ct-1019/* > ct_1019.jsonl
zcat -f 可处理压缩和未压缩的输出,以防压缩被设置为默认值。如果查询失败,等待循环永不结束。如果您定期编写脚本,请同时检查是否失败。
为什么不用 get-query-results? 它可以工作,但它以字符串列表的形式返回行,每页 1,000 个,然后您需要将它们拼接回对象。UNLOAD 让您在一步中获得干净的 JSON。
在 LogTotal 中上传、清理和查看
- 上传。 打开 logtotal.com 并拖放 .jsonl 文件。
- 清理。
- 查看。
出现问题时
| 症状 | 可能原因 | Fix |
|---|---|---|
| 查询扫描了太字节 | 没有分区过滤器 | 在分区列上进行过滤 |
| 关于输出位置的错误 | 目标前缀不为空 | 使用新的前缀 |
| 访问被拒绝 | 缺少 S3、Glue 或 KMS 权限 | 检查每一个,KMS 是通常的嫌疑 |
| 零行 | 分区未加载,或分区格式错误 | 检查分区投影或运行 MSCK REPAIR TABLE |
| 输出文件无法作为文本打开 | GZIP 压缩 | 使用 zcat,或设置 compression = ‘NONE’ |
FAQ
这与 Amazon Security Lake 一样吗?
Security Lake 也使用 Athena,但有自己的 OCSF 表和 Lake Formation 权限。
我可以导出原始的 CloudTrail 文件吗?
可以。如果您只需要完整的一天,从 S3 复制文件更简单。当您需要过滤时,Athena 才显得有价值。