
環境差で事故らない設定管理|開発・検証・本番を一人運用で
「検証環境では問題なく動いたのに、本番に出したとたんエラーになった」。
保守運用をしていると、この場面に何度も出くわします。コードは同じ。手順も同じ。なのに本番だけ落ちる。原因を探しても、プログラムのどこにもおかしいところが見つからない——。
こういうとき、犯人はたいていコードではありません。環境ごとに違う「設定」です。接続するデータベースの場所、外部サービスのAPIキー、デバッグ表示のオン・オフ、メールの送信先。これらは環境(開発・検証・本番)ごとに違って当たり前で、その違いが手元で見えていないと、リリースのたびに「今度は大丈夫だろうか」と冷や汗をかくことになります。
この記事では、環境差を「見える化」して事故を防ぐ設定管理の考え方を、一人運用でも今日から始められる形で一緒に深掘りしていきます。大がかりな仕組みは要りません。まずは「どの設定が、どの環境で、どう違うのか」を1枚に書き出すところから始めれば十分です。
結論:環境差の事故は、「設定が違うこと」ではなく「違いが見えていないこと」から起きます。防ぐためにやることは4つ。①環境ごとに変わる設定を1枚のリストに洗い出す、②設定をコードから切り離し、環境ごとに分けて管理する、③パスワードやAPIキー(秘密の情報)はコードやGitに置かない、④本番へ出す前に「本番の設定を向いているか」を必ず1回確認する。まずは自分のシステムで「環境ごとに違う設定」を書き出す、その1枚から始めましょう。
環境の構成(開発だけ/開発+本番の2つ/開発・検証・本番の3つ)や、使っているツール(.envファイル・設定ファイル・環境変数・管理画面)は現場によってさまざまです。この記事の考え方を出発点に、自分の環境のやり方に読み替えてください。本番に反映する前には、必ず検証環境や公式情報で確認しましょう。
そもそも「環境差」とは何か
まず、言葉を軽く整理しておきます。難しい話ではありません。
多くのシステムには、目的の違う「置き場所」がいくつかあります。これを環境と呼びます。
- 開発環境:自分のPCなど、作りながら試す場所。壊れても誰も困らない。
- 検証環境(ステージング):本番とできるだけ同じ条件で、出す前の最終確認をする場所。「本番のリハーサル」です。
- 本番環境:実際のお客さんが使う場所。ここが止まると影響が出る。
用語メモ:環境変数とは、プログラムの外側(OSやサーバー側)に置いておく設定値のこと。コードの中に直接書くのではなく、「この環境ではこの値を使ってね」と外から渡します。.env(ドットエンブ)ファイルは、その値をまとめて書いておくテキストファイルの通称です。どちらも「設定をコードの外に出す」ための入れ物、とだけ押さえておけば大丈夫です。
そして、これらの環境では同じコードでも設定が違います。開発では自分のPCのDBにつなぎ、本番では本番のDBにつなぐ。開発ではエラーを画面に全部出し、本番では出さない。この「同じコードなのに環境ごとに変える値」の違いが、環境差です。
環境差そのものは悪いことではありません。むしろ必要なものです。問題になるのは、その違いが管理されず、見えなくなっているときだけです。
なぜ環境差で事故が起きるのか

「気をつけているのに、なぜか環境差で事故る」。これは注意力の問題ではなく、仕組みのすき間から起きています。よくある原因はこの3つです。
- 設定がコードの中に直接書かれている(混在):接続先やキーがソースコードにベタ書きされていると、環境ごとに書き換える必要が出ます。書き換え忘れ・書き換えミスが、そのまま事故になります。「本番に出したら、接続先が開発用のDBのままだった」はこれの典型です。
- 秘密の情報があちこちに散らばっている(散らばり):パスワードやAPIキーが、コード・メモ・チャット・複数のファイルにバラバラにある。どれが最新で、どれが本番用なのか分からなくなり、古い値を使って認証エラー、という事故につながります。
- 本番の設定を確認しないまま出している(未確認):リリース手順に「本番の設定を向いているか確かめる」工程がない。検証では検証用の設定で動くので、本番だけの設定ミスはリリースの瞬間まで気づけません。
この3つに共通するのは、「設定が今どうなっているか」を人が目で確かめられない状態だということです。裏を返せば、設定をコードから切り離し、環境ごとに整理して、出す前に見比べられるようにする——これだけで、環境差の事故の大半は防げます。次から、その具体的なやり方を見ていきます。
ステップ1:環境ごとに変わる設定を「1枚に洗い出す」
最初の一歩は、ツールの導入ではありません。自分のシステムで、環境ごとに違う設定を全部書き出すことです。これが土台になります。
いきなり完璧を目指さず、思いつくものから表にしていきます。よくある「環境ごとに違う設定」は、たとえばこんなものです。
| 設定の種類 | 具体例 | なぜ環境で違うのか |
|---|---|---|
| データベース接続先 | ホスト名・DB名・ユーザー・パスワード | 環境ごとに別のDBを使うため |
| 外部サービスのキー | 決済・メール送信・地図・SMSのAPIキー | 本番と検証で別アカウント・別キーを使うため |
| ドメイン・URL | 自サイトのURL、コールバック先 | 環境ごとにアドレスが違うため |
| デバッグ設定 | エラー表示のオン・オフ、ログの詳しさ | 本番では詳細を隠す・ログを絞るため |
| メール送信先 | 通知先アドレス、送信の有効・無効 | 検証で本物の顧客に誤送信しないため |
| 各種フラグ | 新機能のオン・オフ、外部連携の有無 | 環境ごとに使う機能を変えるため |
この表を、自分のシステムに合わせて埋めていきます。列に「開発/検証/本番」を足して、それぞれの値(または「ここに書く」というメモ)を入れれば、環境差の全体像が1枚で見えるようになります。
秘密の情報(パスワード・キー)は、この一覧に実際の値そのものは書かないでください。「本番用のキーがある」という項目の存在だけを書き、値の実物は後述の安全な置き場所で管理します。一覧はあくまで「何が環境ごとに違うかの地図」です。
この地図があるだけで、リリース前に「本番だと、この6項目が変わるんだな」と目で追えるようになります。まずはここまでで、事故の多くは見通せるようになります。
ステップ2:設定を「コードから切り離す」
洗い出しができたら、次は設定をコードの外に出すことを目指します。これは、環境差の事故を根っこから減らす、いちばん効く考え方です。
なぜ切り離すのか
設定がコードの中に書いてあると、環境ごとに「コードを書き換える」必要が出ます。書き換えは、そのままミスの入口です。一方、設定をコードの外に置いておけば、コードは全環境で同じまま、外側の設定だけを環境ごとに差し替える形になります。
- コードは1つ。開発でも本番でも、まったく同じものが動く。
- 変わるのは外側の設定だけ。だから「本番用の設定に切り替える」ことだけ気をつければよい。
- 「本番なのに開発のコードを出してしまった」という混乱が起きにくい。
これは、世界中で広く参照されている設計指針(The Twelve-Factor App の「Config」の項)でも、基本原則として挙げられている考え方です。難しく捉えず、「変わるものは外へ、変わらないものはコードに」と覚えておけば十分です。
どう切り離すか(現場での形)
具体的な入れ物は、使っている技術によって変わりますが、よくあるのは次の形です。
- .env ファイル:
DB_HOST=...のように「名前=値」で設定を並べたファイル。環境ごとに中身の違うファイルを置く。PHP・Node.js・Python など多くの環境で定番。 - 環境ごとの設定ファイル:
config/developmentconfig/productionのように、環境名でファイルを分けて置く方式。フレームワークが仕組みを持っていることが多い。 - サーバーの環境変数:ファイルすら置かず、サーバー側に値を設定しておく方式。秘密情報を扱いやすい。
- レンタルサーバーの管理画面:管理画面から環境変数を登録できるサービスも増えています。
どれを使うにせよ、大事なのは「コードの中に接続先やキーを直接書かない」ことと、「環境ごとの設定は、はっきり別々に分ける」ことの2点です。今ベタ書きになっているなら、いきなり全部でなく、まずDB接続先とAPIキーだけを外に出すところから始めれば十分です。
ステップ3:秘密の情報は「コードやGitに置かない」

環境差の管理でいちばん注意したいのが、パスワード・APIキー・トークンといった「秘密の情報」の扱いです。ここは事故ると環境差だけでなく、セキュリティの問題にもなります。
守りたい原則はシンプルです。
- コードの中に秘密情報を直接書かない。
- Gitなどのバージョン管理に、秘密情報を含むファイルを入れない(
.gitignoreで.envなどを除外する)。 - 秘密情報は、.env ファイル・サーバーの環境変数・専用の保管サービスなど、コードとは別の場所で管理する。
- コード側には「どの入れ物の、どの名前を見るか」だけを書く(値そのものは書かない)。
なぜここまで気をつけるかというと、一度うっかりGitに入れた秘密情報は、後から消しても履歴に残るからです。公開リポジトリなら言うまでもなく、社内であっても、退職者のPCや古いクローンに残り続けます。「後で消せばいい」が効かない領域なので、最初から入れないのがいちばん確実です。
もし過去にコミットしてしまった疑いがあるなら、慌てて履歴だけ消すより先に、そのキー・パスワードを新しいものに切り替える(無効化する)のが本筋です。漏れた前提で作り直すのが、いちばん安全な初動です。
一人運用だと「自分しか触らないから」とつい緩みがちですが、ここだけは環境差の話を超えて、未来の自分と引き継ぐ誰かを守るための線引きです。難しく考えず、「秘密は金庫、コードには金庫の場所だけ」と覚えておきましょう。
ステップ4:本番へ出す前に「本番を向いているか」確認する
設定を切り離して整理できても、最後のひと押しが抜けると事故ります。それがリリース時の確認です。
環境差の事故は、多くが「本番に出す瞬間」に起きます。検証では検証用の設定で動くので、本番だけの設定ミスは、リリースするまで表に出てこないからです。だから、リリース手順の中に「設定の確認」を1工程として組み込んでおきます。
出す前に確認したいのは、たとえばこんな点です。
- 接続先が本番のDBを向いているか(開発・検証用のままになっていないか)。
- APIキーが本番用のキーになっているか(テスト用・サンドボックス用のままになっていないか)。
- デバッグ表示がオフになっているか(エラーの詳細やデバッグ情報が外に出ない設定か)。
- メールの送信先が本番の設定か(検証用の送り先や、送信停止のままになっていないか)。
- ステップ1で作った環境差の一覧と照らして、本番で変わる項目がすべて本番の値になっているか。
ポイントは、これを記憶や勘でなく、リストを見ながら確認することです。ステップ1の一覧が、ここでそのまま「本番リリース前チェックリスト」として効いてきます。作った地図を、出す直前にもう一度なぞる。それだけで「本番だけ設定が違った」という事故は、かなり防げます。
この確認は、リリース手順書(runbook)の中に1ブロックとして書いておくのがおすすめです。「進む手順」の前に「設定の確認」を置いておけば、忙しいときでも読むだけで抜けを防げます。
具体例:よくある3つの「環境差の事故」
現場では、こんな形で環境差の事故が起きがちです。原因と防ぎ方をセットで見てみましょう。
- 本番なのに開発のDBにつないでいた:接続先がコードにベタ書きで、本番用に書き換え忘れた。本番の更新が、なぜか本番に反映されない(実は開発DBを更新していた)。→ 接続先を設定として外に出し、リリース前に「本番DBを向いているか」を確認していれば防げました。
- 決済のテスト用キーのまま本番公開してしまった:検証用のサンドボックスキーのまま出してしまい、本番で決済が通らない。→ 環境差の一覧に「決済キーは環境で変わる」と書いておき、出す前にチェックしていれば気づけました。
- 本番でエラーの詳細が画面に丸見えになっていた:デバッグ表示をオフにし忘れ、エラー時に内部の情報(ファイルパスやDBの構造)が利用者に見えていた。→ デバッグ設定を環境ごとに分け、本番はオフを既定にしておけば防げました。
どれも「もっと注意していれば」ではなく、設定を外に出す・一覧を作る・出す前に確認するのどれかがあれば救えたものばかりです。人の注意力に頼らず、仕組みで受け止めるのがコツです。
影響:設定を整理すると、何が変わるか
環境差を管理できるようになると、目に見えるトラブルが減るだけでなく、日々の運用がぐっと楽になります。
- リリースのたびの「本番だけ落ちないだろうか」という不安が、はっきり軽くなる。確認する場所が決まっているからです。
- 「検証では動くのに本番で落ちる」の原因調査が速くなる。まず設定の違いを疑う、という当たりがつけられます。
- 新しい環境を作るとき(サーバー移行・環境の追加)が楽になる。「この設定一覧を、新しい環境用に埋めればいい」と手順化できるからです。
- 引き継ぎがしやすくなる。「環境ごとに何が違うか」が1枚にまとまっていれば、次の人がゼロから探さずに済みます。
逆に、設定がコードに混ざったまま・秘密情報が散らばったままだと、リリースのたびに神経を使い続けることになります。しかもその負担は、環境が増えるほど、時間が経つほど重くなります。早めに地図を作っておくことが、未来の自分の負担を軽くします。
明日やること:まず「環境差の一覧」を1枚つくる
いきなり全部を仕組み化しなくて大丈夫です。明日できる、いちばん小さな一歩はこれです。
- 自分のシステムで、環境ごとに違う設定を思いつくまま書き出す(DB接続先・APIキー・URL・デバッグ設定・メール送信先など)。ステップ1の表をたたき台にする。
- 表に「開発/検証/本番」の列を足し、それぞれの値(または管理している場所)を埋める。秘密の情報は、値そのものでなく「ここにある」という所在だけを書く。
- その中に、コードにベタ書きされている設定がないか探す。あれば、まずはDB接続先とAPIキーだけでも設定ファイルや環境変数に外へ出せないか検討する。
- 秘密情報がGitに入っていないかを確認する。入っていれば、
.gitignoreで除外し、必要ならキーの入れ替えを検討する。 - 作った一覧を、リリース手順書か作業メモに「本番リリース前チェック」として残す。次からは、出す前にこれをなぞる。
環境差の一覧を1枚つくるだけでも、「本番だけ設定が違うかも」という漠然とした不安が、「ここを見れば分かる」に変わります。完璧な設定管理の仕組みを一気に作ろうとせず、まずこの1枚から始めましょう。
「環境差で事故らない」チェックリスト
リリース前や、設定の棚卸しのときに使える確認項目です。コピーして、自分のシステムに当ててみてください。全部やる前提ではありません。まずは「これだけは」の3つから。
これだけは(最低ライン)
- 環境ごとに違う設定を、1枚のリストに書き出してあるか
- 接続先やAPIキーが、コードにベタ書きされていないか(外に出してあるか)
- 本番へ出す前に「本番の設定を向いているか」を1回確認しているか
余裕があるとき(任意)
- パスワード・APIキーなどの秘密情報を、Gitに入れていないか(
.gitignoreで除外しているか) - 秘密情報を、コードとは別の安全な場所(.env・環境変数・保管サービス)で管理しているか
- 開発・検証・本番の設定が、はっきり別々に分かれているか
- デバッグ表示・詳細ログが、本番ではオフ(絞る)を既定にしてあるか
- メールの送信先が、検証で誤送信しない設定になっているか
- 過去にGitへ入れてしまった秘密情報がないか、あればキーを入れ替えたか
- 環境差の一覧を、リリース手順書か作業メモに残してあるか
- 新しい環境を作るときに、この一覧を使い回せる形にしてあるか
全部に○が付かなくても大丈夫です。上の3つだけ押さえれば、まずは「本番だけ設定が違った」という事故から抜け出せます。下の項目は、設定を棚卸しするときや手が空いているときに、少しずつ足していけば十分です。
よければ、こちらも
環境差の管理は、リリース手順・本番反映前の確認・変更の記録と地続きの仕事です。あわせて整えておくと、リリースのたびの不安がぐっと減ります。
- 本番反映前チェックリスト|作業前バックアップの取り方を一人運用で:本番へ出す前の確認と備えを、設定の確認とセットで整えるための型です。
- ロールバック手順の作り方|すぐ戻せるリリース設計を一人運用で:設定を戻せる形にしておくと、環境差の事故が起きても落ち着いて戻せます。
- 変更管理台帳の付け方|いつ・誰が・何を変えたか残す:設定をいつ・どう変えたかを残しておくと、環境差の原因調査が速くなります。
- リリース手順書の作り方|最低限の項目とテンプレート:設定の確認を、手順書の中に1ブロックとして組み込むための土台です。

「検証では動いたのに」で冷や汗をかくのは、あなたの確認が甘いからではありません。環境ごとの違いが、見えるところに置かれていないだけです。設定を1枚の地図にしておけば、その違いは確かに見えてきます。 今日は、環境ごとに違う設定を書き出す——その1枚から始めれば十分です。その小さな地図が、リリースのたびの不安から、あなたを少しずつ解放してくれます。
ほかの実務ヒントは記事一覧からどうぞ。保守運用の小さな備えを、メールでも少しずつお届けしています。