試験のデータが本番に出た
ある自動車部品メーカーでは、工場の生産数を管理するシステムを使っています。
コードの中に、データベースの接続先が直接書いてありました。試験のときは試験用に、本番では本番用に、毎回手で書き換えていました。
ある日、試験用のまま本番に出てしまいました。工場の画面に、架空の部品の数が並びました。
このレッスンのゴール
メモ
設定をコードの外に分けて置ける。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 設定 | 動く場所によって変わる値です。 | DB_HOST |
| 環境 | アプリが動く場所の種類です。 | 開発、試験、本番 |
| 環境変数 | OS がアプリに渡す、名前付きの値です。 | |
| 既定値 | 何も指定がないときに使う値です。 | |
| シークレット | パスワードや鍵など、知られてはいけない設定です。 |
学生が入力するセルは、このプレビューでは空白です。
環境ごとに変わる値が設定
同じアプリを、開発、試験、本番の三つの環境で動かします。
コードは三つとも同じです。違うのは、接続先やログの細かさなどの値だけです。このような値を設定と呼びます。
設定をコードから外に出すと、同じコードをどの環境にもそのまま出せます。
生産管理システムの設定
| 設定の名前 | 開発 | 本番 |
|---|---|---|
| DB_HOST | localhost | db.prod.example.jp |
| LOG_LEVEL | debug | warning |
| MAIL_ENABLED | false | true |
| DB_PASSWORD | 開発用の値 | 本番用の秘密の値 |
学生が入力するセルは、このプレビューでは空白です。
設定は環境変数で渡す
設定を渡すよくある方法が、環境変数です。サーバーやコンテナを起動するときに、名前と値を渡します。
アプリはその名前で値を読みます。値がないときのために、既定値も決めておきます。
次のブロックを実行して、値の切り替わりを見ましょう。
環境変数と既定値
# 環境変数がなければ、:- の後ろの既定値を使います
echo "接続先: ${DB_HOST:-localhost}"
echo "ログの細かさ: ${LOG_LEVEL:-debug}"
# 本番用の値を環境変数で渡します
export DB_HOST=db.prod.example.jp
export LOG_LEVEL=warning
echo "接続先: ${DB_HOST:-localhost}"
echo "ログの細かさ: ${LOG_LEVEL:-debug}"
# export の行の値を書き換えて、もう一度実行してください。
# コードの他の行は、一つも変えなくてよいはずです。
シークレットは Git に入れない
パスワードやアクセスの鍵はシークレットです。ほかの設定より、さらに大事に扱います。
開発では、シークレットを .env というファイルに置くことがあります。このファイルは .gitignore に書き、Git に入れないようにします。
本番では、クラウドのシークレット管理の仕組みに預けるのが一般的です。
秘密のファイルを Git から外す
mkdir -p seisan && cd seisan
# 秘密の値は .env に置き、Git には入れません
printf 'DB_PASSWORD=practice-only\n' > .env
printf '.env\n' > .gitignore
# 見本のファイルには、名前だけを書いて共有します
printf 'DB_PASSWORD=\n' > .env.example
echo "Git に入れないファイル:"
cat .gitignore
echo "共有する見本:"
cat .env.example
よくある間違い
注意
非公開のリポジトリなら、パスワードを書いてもよいと考える人がいます。それは危険です。一度コミットした値は、消しても履歴に残ります。見られる人も、思ったより多くいます。書いてしまったら、パスワードそのものを変えましょう。