Criar uma tabela para logs do S3 do AWS WAF no Athena usando a projeção de partições
Como os logs do AWS WAF têm uma estrutura conhecida com um esquema de partição que você pode especificar antecipadamente, é possível reduzir o runtime das consultas e automatizar o gerenciamento de partições usando o recurso de projeção de partições do Athena. A projeção de partições adiciona automaticamente novas partições à medida que os dados são adicionados. Isso elimina a necessidade de adicionar manualmente as partições usando ALTER TABLE ADD PARTITION
.
A instrução de exemplo CREATE TABLE
a seguir usa automaticamente a projeção de partições com base nos logs do AWS WAF desde uma data especificada até o dia de hoje para diferentes regiões da AWS. A cláusula PARTITION BY
neste exemplo particiona por região e data, mas você pode modificá-la de acordo com seus requisitos. Modifique os campos conforme necessário para corresponder à saída do log. Nas cláusulas LOCATION
e storage.location.template
, substitua os espaços reservados bucket
e accountID
por valores que identifiquem o local do bucket do Amazon S3 dos seus logs do AWS WAF. Em projection.day.range
, substitua 2021
/01
/01
pela data de início desejada. Depois que você executar a consulta com êxito, poderá consultar a tabela. Você não precisa executar ALTER TABLE ADD PARTITION
para carregar as partições.
CREATE EXTERNAL TABLE `waf_logs`( `timestamp` bigint, `formatversion` int, `webaclid` string, `terminatingruleid` string, `terminatingruletype` string, `action` string, `terminatingrulematchdetails` array < struct < conditiontype: string, sensitivitylevel: string, location: string, matcheddata: array < string > > >, `httpsourcename` string, `httpsourceid` string, `rulegrouplist` array < struct < rulegroupid: string, terminatingrule: struct < ruleid: string, action: string, rulematchdetails: array < struct < conditiontype: string, sensitivitylevel: string, location: string, matcheddata: array < string > > > >, nonterminatingmatchingrules: array < struct < ruleid: string, action: string, overriddenaction: string, rulematchdetails: array < struct < conditiontype: string, sensitivitylevel: string, location: string, matcheddata: array < string > > >, challengeresponse: struct < responsecode: string, solvetimestamp: string >, captcharesponse: struct < responsecode: string, solvetimestamp: string > > >, excludedrules: string > >, `ratebasedrulelist` array < struct < ratebasedruleid: string, limitkey: string, maxrateallowed: int > >, `nonterminatingmatchingrules` array < struct < ruleid: string, action: string, rulematchdetails: array < struct < conditiontype: string, sensitivitylevel: string, location: string, matcheddata: array < string > > >, challengeresponse: struct < responsecode: string, solvetimestamp: string >, captcharesponse: struct < responsecode: string, solvetimestamp: string > > >, `requestheadersinserted` array < struct < name: string, value: string > >, `responsecodesent` string, `httprequest` struct < clientip: string, country: string, headers: array < struct < name: string, value: string > >, uri: string, args: string, httpversion: string, httpmethod: string, requestid: string >, `labels` array < struct < name: string > >, `captcharesponse` struct < responsecode: string, solvetimestamp: string, failureReason: string >, `challengeresponse` struct < responsecode: string, solvetimestamp: string, failureReason: string >, `ja3Fingerprint` string, `oversizefields` string, `requestbodysize` int, `requestbodysizeinspectedbywaf` int ) PARTITIONED BY ( `region` string, `date` string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/
accountID
/WAFLogs/region
/DOC-EXAMPLE-WEBACL
/' TBLPROPERTIES( 'projection.enabled' = 'true', 'projection.region.type' = 'enum', 'projection.region.values' = 'us-east-1,us-west-2,eu-central-1,eu-west-1', 'projection.date.type' = 'date', 'projection.date.range' = '2021/01/01,NOW', 'projection.date.format' = 'yyyy/MM/dd', 'projection.date.interval' = '1', 'projection.date.interval.unit' = 'DAYS', 'storage.location.template' = 's3://amzn-s3-demo-bucket/AWSLogs/accountID
/WAFLogs/${region}/DOC-EXAMPLE-WEBACL
/${date}/')
nota
O formato do caminho na cláusula LOCATION
no exemplo corresponde ao padrão, mas pode variar com base na configuração AWS WAF implementada. Por exemplo, o exemplo de caminho de log do AWS WAF a seguir é para uma distribuição do CloudFront:
s3://amzn-s3-demo-bucket/AWSLogs/12345678910
/WAFLogs/cloudfront/cloudfronyt/2022/08/08/17/55/
Se você tiver problemas ao criar ou consultar sua tabela de logs do AWS WAF, confirme a localização de seus dados de log ou entre em contato com o AWS Support
Para obter mais informações sobre projeção de partições, consulte Usar projeção de partições com o Amazon Athena.