S3のアクセスログが日付ベースのオブジェクトキー形式の出力をサポート。Athenaのパーティションとして利用可能になりました

S3の標準アクセスログ出力、S3のキー(パス)に日時を含める指定が可能となり、Athenaを利用した特定期間のログ解析が簡易になりました。
2023.11.22

2023年11月21日、S3がアップデート、 アクセスログをS3に保存する際、キーのプリフィックスとして 「YYYY/MM/DD」の日付を付与した保存が可能になりました。

今回、新たにサポートされたログ設定と、その動作を試す機会がありましたので、紹介させて頂きます。

設定

S3ダッシュボードを利用して設定を試みました。

S3プロパティ

S3ログ記録編集

サーバーアクセスのログ記録

アクセスのログ記録を編集

ログオブジェクトキーの形式の選択が可能になりました。

[DestinationPrefix][SourceAccountId]/​[SourceRegion]/​[SourceBucket]/​[YYYY]/​[MM]/​[DD]/​[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]

新たにサポートされた形式を選択。発生日時別の処理をしやすくするため、日付のソースはS3イベントの時刻としました。

確認

アクセスログ出力先のS3バケット、設定変更前後のオブジェクトの状態を確認しました。

変更後

S3ログ記録日付パーティション

「YYYY/MM/DD」日付の階層にログが保存されている事が確認できました。

変更前

S3ログ記録従来一覧

従来はファイル名のプリフィックスに「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実行例

Athenaサンプル

パーティションで特定日を指定したクエリ実行が可能になりました。

まとめ

S3のアクセスログ、Athenaで特定日時の解析を行う場合、全期間のログがフルスキャン対象となるため、ログの保持期間によってはコストや所要時間が課題となる場合がありました。

アクセスログの長期保管要件があり、監査や解析にAthenaを利用する事がある場合、今回のアップデートを是非お試し下さい。