[小ネタ] Amazon Data Firehoseの動的パーティショニングキーにミリ秒単位のUNIX時間(エポック時間)の日付情報を使う

2024.04.14

Amazon Data Firehoseの動的パーティショニングキーの設定にミリ秒単位のUNIX時間(エポック時間)の日付情報を使用するシーンがありました。
キーのマッピングには普段あまり使用してなかったjq式を使用するため結構ハマりましたので、備忘録としてブログに設定方法を残します。

Firehoseの動的パーティショニングについて

Amazon Data FirehoseはデータをリアルタイムでS3やRedShift、Elasticsearchなどのデータストアに送信するためのサービスです。
Firehoseを通してS3にデータを送信する際に、動的パーティショニングを使用しますと、jsonデータの特定のフィールドの内容に応じてS3オブジェクトのキーを動的に作成できます。

UNIX時間(エポック時間)の日付情報を使う場合

よくあるパターンに日時情報を使う事があると思います。
AWSのドキュメントにはUNIX時間を使用する場合のサンプルが掲載されています。
こちらです→パーティショニングキー
このサンプルによるとUNIX時間のデータevent_timestampを使用する場合、yearキーについては以下のjq式を設定します。

.event_timestamp| strftime("%Y")

しかしミリ秒の場合がなかったので、設定方法を調査しました。

ミリ秒の場合の設定方法

結論

ミリ秒単位のUNIX時間(エポック時間)の日付情報を使う場合、以下のように設定します。
yearキー

(.datetime | tonumber / 1000 | strftime("%Y"))

monthキー

(.datetime | tonumber / 1000 | strftime("%m"))

dayキー

(.datetime | tonumber / 1000 | strftime("%d"))

hourキー

(.datetime | tonumber / 1000 | strftime("%H"))

やってることとしては、datetimeフィールドの値を数値に変換した後1000で割り、パイプでつないでstrftime関数で年を取得、となります。
その他式全体を括弧で囲むなどポイントもあります。

jq式については以下のサイトも参考にしました。
./jq

データを送信してみる

Firehoseに動的パーティショニングの設定を行った後、下のコマンドでFirehoseにデータを送信してみます。
UNIX時間はミリ秒単位で1710428400000を使用しました。
これはUTCで2024年3月14日の15時となります。

aws firehose put-record \
--delivery-stream-name PUT-S3-qHjM0 \
--record '{"Data":"{\"datetime\":1710428400000,\n\"device_id\":\"73b2f335-604f-44b2-932a-60662489abd0\"}"}' \
--cli-binary-format raw-in-base64-out

S3に保存されたデータは以下のようなキー構成となってまして、想定した通りのキー作成ができていることが確認できました。

以上です。