年中アイス

いろいろつらつら

デフォルト値の怖さ

何も設定せずに動かせることは便利ではある

様々なサーバアプリケーションや、ミドルウェアを使う場合に、設定がない場合のデフォルト値が用意されていることがあります。

広く配布して使われるアプリケーションは、様々な人達が使うこともあり、なるべく何もいじらずにとりあえず使い始める(試す)ことができるようにされていることが多いです。特にローカル環境やサーバ1台でとりあえず動くようになっている場合があり、これは開発者が自分のマシンで試すことを前提にしている場合があります。

これと似た様に、開発者がローカルや開発環境で動かしやすいように、設定がなければローカルや開発環境のデフォルト値を使うように実装してしまうことがあります。サンプルの設定ファイルではなく、設定がない場合に勝手に使う値として。これは開発者にとって便利な反面、事故を誘発する場合があるので、気をつける必要があります。

開発より大事な本番リリース

このデフォルト値で事故が起こるケースがあります。それは本番環境にリリースする時です。本来は本番環境向けの設定で、他のサーバに接続すべきところを、デフォルト動作があることによって、気づかずにローカルや開発環境の設定で動作してしまうケースです。

基本的に開発と本番ネットワークは分離されているべきなので、DBなどは問題ないかもしれませんが、特定の状態をローカルに持ってしまうといった動作が考えられ、冗長、分散構成を取っていると問題になる可能性があります。

例えば、以下のような、複数台で共有しなければならないものです。

  • セッション情報
  • 排他制御
  • 外部APIリクエストのリクエスト上限、並列数など

もちろん、設定の確認や動作の確認は行うべきですが、一見すると動作しているように見える場合もあるため、事故を誘発する危険性があることを理解しておく必要があります。設定ファイルを置いたつもりで、Pathや設定変数名が違い、デフォルト値で動作していたということも考えられます。きちんとチェックすべきだ!という話ではありますが、現実全てを行えない状況もままあります。

設定自体を間違えている場合はどうしようも無いですが、運用では様々な人が関わり、開発者自身が忘れてしまうことも当たり前です。そういった時に、少しでも事故の可能性を減らすようにしておくことは重要です。

動き続けることが重要か、きちんと動作することが重要か

個人的には、暗黙的なデフォルト値で動くよりは、無ければ落ちて動作させない。という方針をとっています。確実に気づくためです。また、アプリケーションのデプロイと設定の配置を別々に行うようにしています。アプリケーションと一緒にデフォルトの設定ファイルを置いて、後から本番設定に上書きするといった手順でも同じように事故を誘発します。

ちなみに、設定内容次第では、動き続けることが大事な場合もあるため、もしこういうことが起きたらどうあるべきかを考える必要があります。