#amazon-web-services #amazon-athena #amazon-waf
Вопрос:
Я настроил ведение журнала AWS WAF в S3 и создал таблицу Athena, как описано в документации ( https://docs.aws.amazon.com/athena/latest/ug/waf-logs.html )
Однако заголовки http хранятся как array<struct<name: string, value: string>>
не карта (по уважительным причинам). Я хотел бы написать такой запрос, как
select headers.user-agent, headers.if-none-match from waf_logs where something;
если совпадение отсутствует, оно может присутствовать или не присутствовать в списке заголовков.
использование CROSS JOIN UNNEST(httprequest.headers)
не работает, так как это приведет к созданию нескольких строк. Использование обозначения карты не работает, так как это массив структуры, а не карта.
В Интернете есть много страниц о том, как настроить таблицу, но не так много с проработанными примерами реальных запросов, и я не могу найти ни одной страницы о том, как выполнять запросы по вложенным атрибутам.
Я был бы очень признателен за любые предложения. Спасибо!
Ответ №1:
Вот запрос 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;
Комментарии:
1. Спасибо за предложение, но я получаю ошибку:
SYNTAX_ERROR: line 6:9: GROUP BY clause cannot contain aggregations, window functions or grouping operations: ["map_agg"(f.name, f.value)]
2. Я обновил запрос, удалил столбец 4 из ГРУППЫ ПО. Сейчас он работает в Афине.