fluent-plugin-s3のhex_randomはリトライしても値が変わらない

fluentdでS3に出力させるにはS3のキーがユニークになるようにする必要がある。ランダム値を使い、重複時はリトライをさせればユニークになるだろうと思ったが、hex_randomはリトライをしても値が変わらないので、ダメだった、という話。

time_sliceの時間内に1つしかファイル出力がないのであれば、fluentdのS3出力設定に以下のようにtime_sliceを含めれば、キーがユニークになる。time_sliceが1時間単位の設定ならば、1時間に最大1ファイルということになる。

s3_object_key_format %{path}/%{time_slice}/data.%{file_extension}

time_sliceの時間内に複数のファイル出力を想定したいのであれば、以下のようにindexを付けると、キーがユニークになる。

s3_object_key_format %{path}/%{time_slice}/data.%{index}.%{file_extension}

indexは最初は0で、S3にすでに0が存在すれば1、S3に0も1も存在すれば2になる。fluentdはS3出力時にS3へのファイル存在チェックをして、空いている番号を都度探す。indexが1以上になるケースが少ないのであれば、これでもいい。

ただし、time_slice時間内に常に多くのファイル出力がある場合は、S3へのファイル存在チェックのためS3 APIコール数が膨大になってしまう。以下の記事が参考になる。

fluentdでS3に転送しているならば、無駄なGETリクエストに気をつけろ! - Qiita

そこで、以下のように書いてみた。ランダム値があればキーの重複がめったに起こらないし、重複になればリトライしてもらえばよい、と思っていた。

s3_object_key_format %{path}/%{time_slice}/%{hex_random}.%{file_extension}

しかし、なんとhex_randomはリトライしても値が変わらないようになっているらしい。以下の記事で解説されている。

fluent-plugin-s3 の hex_random プレースホルダー - Qiita

これにより、実際に重複が起きてfluentdがまれにエラーを吐いてしまっていた。

結局、hex_randomindexを組み合わせるのがいいのだろう、という結論。

s3_object_key_format %{path}/%{time_slice}/%{hex_random}.%{index}.%{file_extension}

リンク

関連する私の記事