Kinesis Data Firehoseで分単位のパーティション(yyyy/MM/dd/HH/mm)を設定してみた

2022.10.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、つくぼし(tsukuboshi0755)です!

Kinesis Data Firehose(以下Firehose)からS3にログを転送する場合、特にプレフィックスの設定をしていない場合、通常時間単位のパーティション(yyyy/MM/dd/HH)に送付します。

しかし、以下のS3カスタムプレフィックスを追加でする事で、保存先パーティションを柔軟に変更する事ができます。

今回は、上記のカスタムプレフィックスを使用する事で、Firehoseからログを送付する場合でも分単位のパーティション(yyyy/MM/dd/HH/mm)を実現する事ができる事に気づいたので、共有します!

なぜFirehoseのプレフィックスを分単位で分けようとしたのか?

元々は一部のWAFで、CloudWatch Dashboard for AWS WAFを使用するために、ログを一旦CloudWatch Logsに送る必要が生じたためです。

しかし原則WAFログはS3を使用して集約するという社内ポリシーがあったため、CloudWatch Logsに送ったログも最終的にはS3に集約する必要が生じました。

そのため、以下のアーキテクチャを用いて、CloudWatch Logsに送られるログをFirehose経由でS3に出力する事にしました。

ここで問題になったのが、WAFログをS3に直接出力した場合(以下S3直接出力構成)と、WAFログを一旦CloudWatch Logsに出力しFirehose経由でS3に保存した場合(以下S3間接出力構成)とで、通常の保存先パーティションが以下の通り異なるという事です。

S3直接出力構成

AWSLogs/<アカウントID>/WAFLogs/<リージョン>/<WebACL名>/<YYYY>/<MM>/<dd>/<HH>/<mm>

S3間接出力構成

<YYYY>/<MM>/<dd>/<HH>

S3直接出力構成ではWAFログの設定が反映され、最後の方が分単位で保存先パーティションが区切られるようになります。

一方で、S3間接出力構成ではFirehoseのデフォルト設定が反映されるため、時間単位で保存先パーティションが区切られる事になります。

今回いずれの構成に関わらずS3の保存先パーティションは同じにしたいという事で、実現方法を調査した所、FirehoseのS3カスタムプレフィックスを変更する事すれば合わせられる事に気づきました!

やってみた

実際にS3間接出力構成におけるFirehose→S3の部分を構築し、その上でFirehoseのS3カスタムプレフィックスを変更する事で、S3直接出力構成と同じパーティションにログが出力されるか確認します。

なお事前に、ログ送付用のS3バケットは作成しておきます。

初めに以下の通り、Firehoseの配信ストリームを作成します。

ここではデフォルトのパーティションを確認するため、S3バケットプレフィックス及びS3バケットエラー出力プレフィックスは一旦空欄にします。

配信ストリームの作成後、FirehoseからS3へのログ送付をテストすると、時間単位(テスト時は2022年10月28日12時)でパーティションが区切られている事が分かります。

次に、Firehoseの送信際の設定を設定タブの編集ボタンから変更します。

S3直接出力構成に合わせるべく、S3バケットプレフィックス及びS3バケットエラー出力プレフィックスに以下の値を入力します。

S3バケットプレフィックス

AWSLogs/<アカウントID>/WAFLogs/<リージョン>/<WebACL名>/!{timestamp:yyyy}/!{timestamp:MM}/!{timestamp:dd}/!{timestamp:HH}/!{timestamp:mm}/

S3バケットエラー出力プレフィックス

AWSLogs/<アカウントID>/WAFLogs/<リージョン>/<WebACL名>/!{timestamp:yyyy}/!{timestamp:MM}/!{timestamp:dd}/!{timestamp:HH}/!{timestamp:mm}/!{firehose:error-output-type}

なお以下の設定画面では、アカウントID及びWebACL名はサンプルを用いています。

配信ストリームの設定変更後、FirehoseからS3へのログ送付をテストすると、無事分単位(テスト時は2022年10月28日13時06分)でパーティションが区切られました!

最後に

Firehoseのログ出力については時間単位までのパーティションしか見かけた事がなかったため、分単位に変更する事はできないのかなと勝手に思っていたのですが、実際に試してみたら分単位でもできる事が分かりました!

ちなみにS3カスタムプレフィックスの公式ドキュメントを確認した所、Java DateTimeFormatterで有効な時刻形式であれば、FirehoseのS3カスタムプレフィックスでも使用可能との事です。

分単位以外にも様々な時刻形式が定義されているので、気になる方は他の時刻形式も試してみてはいかがでしょうか。

以上、つくぼし(tsukuboshi0755)でした!