[アップデート] CloudFront 標準ログにパーティショニング設定で Hive 形式の時でもディストリビューション ID がパーティションキーに使えるようになりました

[アップデート] CloudFront 標準ログにパーティショニング設定で Hive 形式の時でもディストリビューション ID がパーティションキーに使えるようになりました

Clock Icon2025.05.13

いわさです。

昨年末のアップデートで CloudFront 標準ログがパーティショニングをサポートしました。従来悩みがちだったので嬉しい方も多かったと思います。

https://dev.classmethod.jp/articles/cloudfront-access-log-update-202411/

オプションとして Hive 互換形式を選択することが出来ます。
Hive 形式を使うことでMSCK REPAIR TABLEでパーティションの自動認識ができるようになります。

今まであまり問題になるケースはなかったのですが、実はこのパーティション変数でDistibutionIdを使うと、キー名がキャメル(パスカル)ケースで出力され、パーティションのロードに失敗します。
おそらく先日の CloudFront のマルチテナント対応で、ディストリビューションもパーティションに含めるユースケースが出てきたので発覚したのだと思います。

これが少し前に、パーティショニング変数でdistributionidというのも使えるようになりました。
これで Hive 形式の場合の問題も解消できるようになりそうです。試してみましょう。

従来の DistibutionId

まずは従来のDistibutionIdから使ってみます。
パーティショニングを次のように設定し、Hive 互換形式を有効化します。

DA2A1ED4-D658-4682-AF3B-00057D19AD95.png

しばらく待って S3 に出力されたログを見てみると、たしかにDistributionIdが大文字含んでいますね。気づかなかったな。変数MMmonthに変換されています。

8A8D1D75-4CA5-4629-9C5B-C1B55FECAABF.png

Athena で次のようにテーブルを作成しました。

CREATE EXTERNAL TABLE hoge0513hive1 (
  `date` STRING,
  `time` STRING,
  `c-ip` STRING
)
PARTITIONED BY (
  `DistributionId` STRING,
  `year` STRING,
  `month` STRING,
  `day` STRING,
  `hour` STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://hoge0513hive1/AWSLogs/aws-account-id=123456789012/CloudFront/';

MSCK REPAIR TABLEしてみると、DistributionIdのロードに失敗していますね。

A29B3E09-A2CB-4EC5-BC33-5079A30700E9.png

公式ドキュメントにも次のように記載されており、小文字にする必要がありそうです。

Amazon S3 オブジェクトキーの大文字と小文字の区別 – Amazon S3 パスがキャメルケースではなく小文字になっている (例: userId ではなく userid) ことを確認するか、ALTER TABLE ADD PARTITION を使用してオブジェクトキー名を指定します。
MSCK REPAIR TABLE - Amazon Athena

新しく追加された distribtuionid を使ってみる

では先ほどのログ設定を変更しDistributionIddistributionidに変更してみましょう。

B9411B74-4246-43FA-8EB1-F10C8F4D3253.png

出力されたキーを確認してみると小文字になっていますね。なるほど。

68F7A984-E3F3-4649-A067-A32865362A77.png

ちなみに、CloudFront 標準ログのパーティショニングフィールドでは、許可された変数以外は設定出来ません。次のようにエラーになります。
今まではdistributionidも使えなかったのだろうと思いますが、これがサポートされた感じですね。

image.png

同じようにテーブルを作成してMSCK REPAIR TABLEしてみるとパーティションを発見し自動でメタストアに追加してくれました。

558EB8F0-B349-46B2-9364-F178DE0716F1.png

先ほどは失敗していましたが、レコードの読み込みも出来るようになりましたね。

7E8987D8-DBEF-4425-BE35-E1B7F0DA8795.png

さいごに

本日は CloudFront 標準ログにパーティショニング設定で Hive 形式の時でもディストリビューション ID がパーティションキーに使えるようになったので使ってみました。

今までは複数ディストリビューションをまとめて管理することも少なかったので、Hive 形式の場合でもパーティションキーに指定しなくても良かったと思うのですが、特にマルチテナントディストリビューションを使う場合はディストリビューションをパーティションキーに使いたいことも増えると思いますので、今回の方法を覚えておくと良さそうです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.