2023年11月21日、S3がアップデート、 アクセスログをS3に保存する際、キーのプリフィックスとして 「YYYY/MM/DD」の日付を付与した保存が可能になりました。
今回、新たにサポートされたログ設定と、その動作を試す機会がありましたので、紹介させて頂きます。
設定
S3ダッシュボードを利用して設定を試みました。
サーバーアクセスのログ記録
ログオブジェクトキーの形式の選択が可能になりました。
[DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
新たにサポートされた形式を選択。発生日時別の処理をしやすくするため、日付のソースはS3イベントの時刻としました。
確認
アクセスログ出力先のS3バケット、設定変更前後のオブジェクトの状態を確認しました。
変更後
「YYYY/MM/DD」日付の階層にログが保存されている事が確認できました。
変更前
従来はファイル名のプリフィックスに「YYYY-MM-DD」が反映されていました。
Athena利用例
Location
新たにサポートされたキーを利用する事で、Athena の Location設定で、特定日の指定が可能になりました。
LOCATION 's3://<BUCKET>/<PREFIX>/<ACCOUNTID>/<REGION>/<BUCKET>/YYYY/MM/DD/'
パーティション投影
パーティション投影で利用する事も可能です。
CREATE EXTERNAL TABLE `s3_access_logs_pp` (
`bucketowner` STRING,
`bucket_name` STRING,
`requestdatetime` STRING,
`remoteip` STRING,
`requester` STRING,
`requestid` STRING,
`operation` STRING,
`key` STRING,
`request_uri` STRING,
`httpstatus` STRING,
`errorcode` STRING,
`bytessent` BIGINT,
`objectsize` BIGINT,
`totaltime` STRING,
`turnaroundtime` STRING,
`referrer` STRING,
`useragent` STRING,
`versionid` STRING,
`hostid` STRING,
`sigv` STRING,
`ciphersuite` STRING,
`authtype` STRING,
`endpoint` STRING,
`tlsversion` STRING,
`accesspointarn` STRING,
`aclrequired` STRING
)
PARTITIONED BY (day STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$'
)
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://<BUCKET>/<PREFIX>/00000000/<REGION>/<BUCKET>'
TBLPROPERTIES (
"projection.enabled" = "true",
"projection.day.type" = "date",
"projection.day.range" = "2023/11/01,NOW",
"projection.day.format" = "yyyy/MM/dd",
"projection.day.interval" = "1",
"projection.day.interval.unit" = "DAYS",
"storage.location.template" = 's3://<BUCKET>/<PREFIX>/00000000/<REGION>/<BUCKET>/${day}'
)
- Athena実行例
パーティションで特定日を指定したクエリ実行が可能になりました。
まとめ
S3のアクセスログ、Athenaで特定日時の解析を行う場合、全期間のログがフルスキャン対象となるため、ログの保持期間によってはコストや所要時間が課題となる場合がありました。
アクセスログの長期保管要件があり、監査や解析にAthenaを利用する事がある場合、今回のアップデートを是非お試し下さい。