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_random
とindex
を組み合わせるのがいいのだろう、という結論。
s3_object_key_format %{path}/%{time_slice}/%{hex_random}.%{index}.%{file_extension}
リンク
関連する私の記事