使って、WebUI付きの開発用DNSサーバを作ってみました。作ったのは、オレオレDNSという開発用DNSサーバです。最初にそのアプリの機能や目的から説明しますが、ActionCableに興味がある方は、後半の「実装について」のところまで飛ばして読んでください。ActionCableとreact-railsを使うことで、従来の静的なページ中心のアプリのノウハウを活用しながら、SPA的な動的なアプリに段階的に移行していくことができます。それがどんな感じになるのか確かめるのにちょうどいいサイズのアプリだと思います。複数の設定を内部に持ち、次のようなWebUIで切り替えられるDNSサーバです。ローカルのDocker配下で起動して、開発時に、指定のURLを本来と別のサーバに向かわせることと、同じURLで複数のサーバに切り替えてアクセスすることを目的としています。Webアプリでそれを管理します。ベースのDNSサーバを起動します。本来のDNSサーバと違うウソの情報でクライアントを騙すので「オレオレDNS」という名前にしました。解決しようとしている問題DNSサーバの設定情報を切り替える必要があるのは、ステージングサーバ上でのテストのためです。やっているので、stagingサーバが二台あります。リリースまでには、本番用のサーバを含めて、3台のサーバを切り替えて動作確認する必要があります。依存しているので、ホスト名を変えて接続先サーバを切り替える方法では充分なテストができません。ように、リクエストヘッダは本番用のままで、実際にアクセスするサーバのアドレスを切り替えることが、日常的に必要になっています。このためには、DNSレベルでブラウザをだます必要があります。使って、テスト用のDNSを起動し、テストするマシンのDNSリゾルバにこのサーバのアドレスを設定して切り替えていました。テスト用のDNSサーバを複数台運用するのも大変だし、切り替えるのも面倒です。Dnsmasqには、CNAMEレコードが設定できないという制限があって、これをELBに対して使うには、常時変化しているIPアドレスに追随しなければいけないという問題もあります。そこで、自分たちのニーズに合うような簡易DNSサーバを開発して、これをローカルで起動して対応することにしました。Upstreamサーバに転送します。stagingサーバのアドレスを返答します。設定情報はDBに保存して、この内容から、RubyDNSのスクリプトを動的に生成して、別プロセスでDNSサーバとして起動します。現在の所は、設定できる内容は、我々のステージングテストに特化したものになっていますが、設定項目を増やし、Bindのような普通のDNSサーバに合わせて行けば、RubyDNSの機能の範囲内で、普通にDNSサーバとして機能をサポートするように改良できると思います。今後、リクエストがあれば、そのような改良を検討したいと思います。公開しているので、Dockerから起動するのが一番簡単です。Dockerをインストールして、下記のコマンドを実行してください。以下、Macを前提として説明しますが、他のOSでもほぼ同様に使用できると思います。quay.io/essa/ore_ore_dnsore_ore_dns/dbのところは、適当な空のディレクトリを指定してください。実行すると、ここに、sqlite3のDBファイルができて、DNS設定情報が保存されます。