たごもりすメモ

コードとかその他の話とか。

NATやファイアウォールの向こうへデータをお届けする fluent-plugin-pull_forward を書いた

Fluentdにおけるネットワークごしデータ転送プラグインといえば forward が組み込みであるし、通信路を暗号化したければ secure-forward がある。
しかしこれらFluentdのネットワーク転送プラグインは基本的に全て送信元から送信先に対してプッシュする形になっており、ネットワーク接続も送信元から送信先に対して行うことになっている。このため送信先のFluentdがNAT下にある場合やファイアウォールで保護された場所にある場合、もしくはダイヤルアップ接続……は、まあ今は無いだろうけど、例えば移動するデバイス上にある場合など、こういったときにはうまくデータの転送を行う構成がとれない。

なぜこういう状況、つまりプッシュ型で転送を行うプラグインばかりなのかというと、FluentdのBuffer pluginの仕組みによる。細かく設計上の話をあれこれしてもアレだし面倒くさいので省くが。

という状況なのはわかっていたんだけどまあ自分に用途ないしいいか、と思って放置していたのだが、色々あって自宅(NAT下)でFluentd立ててそこに向けてデータ送りたいなー、という用途が発生してしまった。

fluent-plugin-pull_forward および fluent-plugin-buffer-pullpool つくった

用途が発生してしまったからにはしょうがないので、趣味プロダクトの一環ということで作った。まだ自宅で使いはじめてないんだけど、動く……はず。

コードはこちら。

https://github.com/tagomoris/fluent-plugin-pull_forward
https://github.com/tagomoris/fluent-plugin-buffer-pullpool

ということで、これを使えばオフィス内のマシンとかけっこう電源落としたりする自宅サーバにもFluentdごしにデータを転送できる! やった! 便利!

しかもプロトコルHTTPS + Basic認証 + JSON なので、実は受け取り側はFluentdである必要すらなく、HTTPSのリクエストを発行できるあらゆるクライアントはFluentdからイベントデータをJSONで好きなタイミングにフェッチできる。なんて便利なんだ!

このためにデータのflush(の実質的な処理)をpull型でできるようにするためのハックを加えたbuffer pluginも作った。対応したAPIをもったBufferedOutput pluginからのみ使用できる*1

注意点としては、フェッチされる前のデータは当然だがFluentdが起動しているノードにファイルとして残り続ける。なので buffer_chunk_limit および buffer_queue_limit の設定および空きディスク容量には注意が必要。あんまり高スループットな環境で使うものではないです。

ということで

実は割と刺さる人がいるのではないかと思います。みなさまぜひご利用ください。

*1:これはBuffer pluginにそういう処理を行うためのAPIが足りないため。将来的にはFluentdのアップデート時になんとかしたい。