クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

設定はコードの外に置く

このレッスンのあとで: 設定をコードの外に分けて置ける。

45分のレッスンコマンドなし

試験のデータが本番に出た

ある自動車部品メーカーでは、工場の生産数を管理するシステムを使っています。

コードの中に、データベースの接続先が直接書いてありました。試験のときは試験用に、本番では本番用に、毎回手で書き換えていました。

ある日、試験用のまま本番に出てしまいました。工場の画面に、架空の部品の数が並びました。

このレッスンのゴール

メモ

設定をコードの外に分けて置ける。

キーワード

ことばいみれい
設定動く場所によって変わる値です。DB_HOST
環境アプリが動く場所の種類です。開発、試験、本番
環境変数OS がアプリに渡す、名前付きの値です。
既定値何も指定がないときに使う値です。
シークレットパスワードや鍵など、知られてはいけない設定です。

学生が入力するセルは、このプレビューでは空白です。

環境ごとに変わる値が設定

同じアプリを、開発、試験、本番の三つの環境で動かします。

コードは三つとも同じです。違うのは、接続先やログの細かさなどの値だけです。このような値を設定と呼びます。

設定をコードから外に出すと、同じコードをどの環境にもそのまま出せます。

生産管理システムの設定

設定の名前開発本番
DB_HOSTlocalhostdb.prod.example.jp
LOG_LEVELdebugwarning
MAIL_ENABLEDfalsetrue
DB_PASSWORD開発用の値本番用の秘密の値

学生が入力するセルは、このプレビューでは空白です。

設定は環境変数で渡す

設定を渡すよくある方法が、環境変数です。サーバーやコンテナを起動するときに、名前と値を渡します。

アプリはその名前で値を読みます。値がないときのために、既定値も決めておきます。

次のブロックを実行して、値の切り替わりを見ましょう。

環境変数と既定値

コード: bash
# 環境変数がなければ、:- の後ろの既定値を使います
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 から外す

コード: bash
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

よくある間違い

注意

非公開のリポジトリなら、パスワードを書いてもよいと考える人がいます。それは危険です。一度コミットした値は、消しても履歴に残ります。見られる人も、思ったより多くいます。書いてしまったら、パスワードそのものを変えましょう。

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。