はじめに
- 環境変数
- .envファイル
など聞くけど、なぜ必要なの?
面倒なことせずに、プログラムに埋め込めば良いんじゃないの?
そういった疑問を持つ方がいたので、環境変数などがなぜ重要か説明します。
環境による切り替えが必要な理由
開発環境(prd) /ステージング環境(stg) / 本番環境(dev) によって扱う設定が異なり
環境固有に設定したい値が存在するから必要になります。
その場合、設定をハードコーディング(プログラムに埋め込む)するのではなく、
プログラムの
外から環境ごとで切り替えられる仕組み
が必要となる
環境変数とは
- プログラムの実行時などに必要となる、利用者やコンピュータごとに内容が異なる設定値などを記録するために使用する
- OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの
利用するメリット
- 誤ってリポジトリに機密情報を混入する可能性が低くなる
機密情報を設定する場合
- Systems Manager - Parameter Storeを使用する
- GitHub ActionsのEnvironments ( 環境ごとに異なるシークレットを定義)
.envファイル
機密情報の扱いには注意する
- .gitignore
- git-secrets
- Secret Scanning
- コードレビュー
環境ごとの.envファイルを準備する(サンプル)
開発環境 ( .env.dev)
DB_DATABASE = dev
DB_USER = dev
DB_PASSWORD = dev
ステージング環境( .env.stg)
DB_DATABASE = stg
DB_USER = stg
DB_PASSWORD = stg
本番環境( .env.prd)
DB_DATABASE = prd
DB_USER = prd
DB_PASSWORD = prd
設定に関する注意事項
開発環境(prd) /ステージング環境(stg) / 本番環境(dev) それぞれリポジトリを作成すると反映漏れが発生する可能性が高くなります。
従って、コードの外から環境固有の値を切り替えできるようにすることが重要と言えます。
良い例(サンプル)
env = os.environ.get('ENV')
with open(f'./config.{env}.json') as f:
config = json.load(f)
sample = config['sample']
- 環境固有の値を変更するだけで良くなる
- コードがシンプルになる
悪い例(サンプル)
env = os.environ.get('ENV')
if env == 'prd':
sample = 'prd-xxx'
elif env == 'stg':
sample = 'stg-xxx'
else:
sample = 'dev-xxx'
このコードには以下のような問題があります。
- 環境固有の値に変更がある都度、ソースコードの修正 + デプロイが必要になる
- prd / stg / dev 以外に環境を用意した場合、分岐を増やす必要がある
(上記だと、else が dev になるので、prd, stg 以外の環境は全て dev になる) - 環境固有の値が増えたらその都度if分の中で定義しないといけない