そもそもなにそれ
概要
半年ほど前に作成したgem(Rackミドルウェア)です。そのときの記事はこちら↓。
Rubygemsのページは
Githubリポジトリは
です。
改めて説明すると、次のようなことが実現できます。(以下Webサービスという言葉が出てきますが、Rackミドルウェアである以上Rackを利用しているRuby製アプリのことです。)
- Webサービスを特定のIPアドレスからのアクセスに対してだけ公開する
- インターネット上に公開されているWebサービスに増やした新機能(ルーティング, API)だけを社内限定公開にする
- Webサービスに不具合が起きたとき、一時的にアクセスしてもメンテナンス画面が出るようにする。APIもそれ用のレスポンスを返すようにする。
機能
特定のパスへのリクエストに対して、次のRackミドルウェア/Rackアプリケーションにリクエストを渡さずに静的なHTMLやJSONを返せるようにする、というのが基本機能です。
そういうのってnginxとかがやるもんじゃないの?と思う人も多いでしょう。Rackミドルウェアにすることによって、
- 設定が柔軟にできる
- 有効かどうか切り替えがかんたん
といったメリットを得られます。
また、対象となるパスへのアクセスではあるが条件を満たしていたら対象外とするという仕組みを備えています。あらかじめ設定してあるブロックの評価した結果を利用するので、Rubyで条件を記述することができます。
このときに使えるヘルパーメソッドとして、よく使われるんじゃないか(というか自分のケースで必要だった)
- リクエスト元IPアドレスが事前に定義したリスト上にあるか
- リクエスト先がパスが無視するパスリスト上にあるか
の2つを用意していました。もちろん、判定を行うブロックは自由に書けるので"毎時0~10分の間だけ通す"みたいな判定も可能です。
今回の変更
適用条件判定に使えそうなヘルパーとして、HTTPヘッダが特定の値を持っているかどうかを見るメソッドを追加しました。
このメソッドは X-RACK-TRAFFIC-SIGNAL
というキーの値が特定の値を持っているかどうかを判定します。
これによって、社内IPアドレスからのアクセスかつヘッダーを適切にセットしている場合のみリクエストを通すことが可能になります。社内でも特定の人にしかアクセスさせない、といったことが可能になりますね。
ヘッダーの追加はブラウザ拡張でかんたんに行うことができます。
https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj