Поиск журналов Athena AWS WAF по заголовку http

#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 из ГРУППЫ ПО. Сейчас он работает в Афине.