问题描述
我已将 AWS WAF 日志记录设置为 S3,并按照文档 ( https://docs.aws.amazon.com/athena/latest/ug/waf-logs.html ) 中的描述创建了一个 Athena 表
但是,http 标头存储为 array<struct<name: string,value: string>>
而不是地图(出于正当理由)。我想写一个像
select headers.user-agent,headers.if-none-match from waf_logs where something;
if-none-match 可能出现也可能不出现在标题列表中。
使用 CROSS JOIN UNnesT(httprequest.headers)
不起作用,因为这会创建多行。使用地图符号不起作用,因为它是结构数组,而不是地图。
互联网上有很多关于如何设置表格的页面,但没有多少提供实际查询的工作示例,而且我找不到关于如何通过嵌套属性进行查询的页面。
我非常感谢任何建议。谢谢!
解决方法
这是一个 WAF 查询,它应该可以解决请求标头的问题:
WITH waf_data AS (
SELECT
waf.action as action,waf.httprequest.clientip as clientip,waf.httprequest.country as country,map_agg(f.name,f.value) AS kv
FROM "waf_logs" waf,UNNEST(waf.httprequest.headers) AS t(f)
GROUP BY 1,2,3
)
SELECT
waf_data.action,waf_data.clientip,waf_data.country,waf_data.kv['Host'] AS host,waf_data.kv['User-Agent'] as UserAgent,waf_data.kv['Cookie'] as cookie
FROM waf_data
WHERE waf_data.kv['Host'] like 'waf_alb.us-east-2.elb.amazonaws.com'
LIMIT 10;