fluentdでshadow proxy
fluentdでshadow proxy
shadow proxyを実現したい。いろんな方法があるみたいで、nginxなんかはモジュールでshadow proxyができる。
この他にもあるんですが、現状の構成を変えずに実現したいと調べたところ、fluentdでログを読んでリクエストを再生成する方法があるようで、これをやってみる。
qiita.com
shadow proxyって
何だって話を。普通HTTPでproxyっていうと、受け取ったリクエストをそのままだったり、ちょっと加工したりして、バックエンドの別のHTTPサーバへ流す機能のこと。
バックエンドが返したレスポンスをもともとリクエストをだしたところへ返す役割もある。shadow proxyでは、受け取ったリクエストを稼働しているバックエンドに流してレスポンスを受け取るのと別に、テスト機にリクエストを流す。レスポンスは受け取らない(受け取ってるだろうけど無視)。アプリケーションの試験に利用したりするみたい。
rubyをインストール
fluentdはruby上で動作していて、ruby2.1以上が必要。ところが、RHELのyumでインストールされるrubyは1.9。使えません。まずはrubyをソースからインストール。
ソースはここ。
tarballを展開して、configure,make,make install.
fluentdをインストール
gemでインストールできます。
# gem install fluentd
fluentdのプラグイン fluentd-plugin-http_shadow をインストール
これもgemでインストール。
# gem install fluentd-plugin-http_shadow
設定
作成されたfuentd.confを編集。まずはsource(入力ソース)を指定。本エントリの場合はapacheのログです。
まず入力を指定
<source> @type tail format apache2 time_key log_time time_format %d/%b/%Y:%H:%M:%S %z path /var/log/httpd/httpd_access_%Y%m%d.log pos_file /var/log/td-agent/access.pos tag http_shadow </source>
"path"にログのパスを記述。ファイル名が日毎に違うので、上記のように日付と時間が展開されるように指定。
"tag"がこのsourceから入ってきたデータですよーってこと。
出力を指定
出力はさっきいれたプラグインのshdow proxy。
こんな感じ。
<match http_shadow> @type http_shadow host "172.18.12.71" host_key host path_format ${path} method_key method max_concurrency 10 retry_limit 1 timeout 10 rate 100 </match>
"host"がリクエストを投げる先。
フィルタを設定
どうもrequest methodに"-"が入っていると止まっちゃうみたい。
フィルタを書きます。このフィルタを通り抜けたのもだけ、match(出力)に流れます。
<filter http_shadow.example> @type grep <regexp> key method pattern /(GET|PUT|POST|HEAD|OPTIONS)/ </regexp> </filter>
これでなんとなく動作しているんだけど、全部リクエストが行っているような気がしない。ちょっと(いや、だいぶ)端折られているような。
まだ調整が必要