Erstellen einer Tabelle für AWS WAF-S3-Protokolle in Athena mithilfe der Partitionsprojektion - Amazon Athena

Erstellen einer Tabelle für AWS WAF-S3-Protokolle in Athena mithilfe der Partitionsprojektion

Da AWS WAF-Protokolle über eine bekannte Struktur verfügen, deren Partitionsschema Sie im Voraus angeben können, können Sie die Abfragelaufzeit reduzieren und die Partitionsverwaltung mithilfe des Features Athena-Partitionsprojektion automatisieren. Partitionsprojektion fügt automatisch neue Partitionen hinzu, wenn neue Daten hinzugefügt werden. Dadurch entfällt die Notwendigkeit, Partitionen manuell mithilfe von hinzuzufügen ALTER TABLE ADD PARTITION.

Die folgende CREATE TABLE-Beispielanweisung verwendet automatisch die Partitionsprojektion in AWS WAF-Protokollen von einem angegebenen Datum bis zur Gegenwart für vier verschiedene AWS-Regionen. Die PARTITION BY-Klausel in diesem Beispiel partitioniert nach Region und Datum, aber Sie können diesen Vorgang entsprechend Ihren Anforderungen ändern. Ändern Sie die Felder nach Bedarf, damit diese mit Ihrer Protokollausgabe übereinstimmen. Ersetzen Sie in den LOCATION- und storage.location.template-Klauseln die Platzhalter für amzn-s3-demo-bucket und AWS_ACCOUNT_NUMBER durch Werte, die den Amazon-S3-Bucket-Standort Ihrer AWS WAF-Protokolle angeben. Ersetzen Sie für projection.day.range den 01.01.2021 durch das Startdatum, das Sie verwenden möchten. Nach dem erfolgreichen Ausführen der Abfrage können Sie die Tabelle abfragen. Sie müssen ALTER TABLE ADD PARTITION nicht ausführen, um die Partitionen zu laden.

CREATE EXTERNAL TABLE `waf_logs_partition_projection`( `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,fragment:string,scheme:string,host:string>, `labels` array<struct<name:string>>, `captcharesponse` struct<responsecode:string,solvetimestamp:string,failurereason:string>, `challengeresponse` struct<responsecode:string,solvetimestamp:string,failurereason:string>, `ja3fingerprint` string, `ja4fingerprint` string, `oversizefields` string, `requestbodysize` int, `requestbodysizeinspectedbywaf` int) PARTITIONED BY ( `log_time` 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/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/testui/' TBLPROPERTIES ( 'projection.enabled'='true', 'projection.log_time.format'='yyyy/MM/dd/HH/mm', 'projection.log_time.interval'='1', 'projection.log_time.interval.unit'='minutes', 'projection.log_time.range'='2025/01/01/00/00,NOW', 'projection.log_time.type'='date', 'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/testui/${log_time}')
Anmerkung

Das Format des Pfads in der im Beispiel angegebenen LOCATION-Klausel ist Standard, kann jedoch je nach der von Ihnen implementierten AWS WAF-Konfiguration variieren. Der folgende Beispielpfad für AWS WAF-Protokolle gilt beispielsweise für eine CloudFront-Verteilung:

s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_NUMBER/WAFLogs/cloudfront/cloudfronyt/2025/01/01/00/00/

Wenn beim Erstellen oder Abfragen Ihrer AWS WAF-Protokolltabelle Probleme auftreten, überprüfen Sie den Speicherort Ihrer Protokolldaten oder kontaktieren Sie Support.

Weitere Informationen zur Partitionsprojektion finden Sie unter Partitionsprojektion mit Amazon Athena verwenden.