こんにちは、hiroshiです。
みなさん、Pythonで開発するとき、環境変数の管理はどうしていますか?
やっぱり python-dotenv を使って .env ファイルから読み込むのが一般的ですよね。
でも、.env ファイルって Gitにコミットできない のが地味に面倒じゃないですか?
チーム開発で「あ、.env 共有するの忘れてた」「Slackで送るね(セキュリティ的に微妙…)」みたいなやり取り、一度は経験があるはず。
そんな悩みを解決してくれるかもしれない、次世代の環境変数管理ツール が登場しました。 その名も dotenvx です!
なんとこれ、あの有名な dotenv ライブラリの作者が作ったツールなんです。
今回は、この dotenvx を Python プロジェクトで実際に使ってみて、何がすごいのか、どう便利なのかを紹介したいと思います。
ちなみにdotenvxは、Node.js, Go, Rust, PHP... あらゆる言語、あらゆるフレームワーク で使えますが、今回はPythonで実際に使ってみることにします。
公式サイトには "A secure dotenv" と書かれています。 主な特徴は以下の通り。
.env ファイルを暗号化して、安全に Git 管理できる(!?)。特に「暗号化してGit管理できる」というのは革命的ですね。
では早速、Python で使ってみましょう。
今回は python-dotenv ライブラリを使わずに、dotenvx の CLI ツールだけで環境変数を扱ってみます。
まずは dotenvx をインストールします。
macOS なら Homebrew で一発です。
brew install dotenvx/brew/dotenvx
他のOSや npm 経由でのインストール方法は 公式サイト をチェックしてください。
次に、環境変数を表示するだけの簡単な Python スクリプト main.py を用意します。
import os
# 従来の load_dotenv() は不要!
# os.environ から直接取得します
api_key = os.environ.get("API_KEY")
db_host = os.environ.get("DB_HOST")
print(f"API_KEY: {api_key}")
print(f"DB_HOST: {db_host}")
見てください、from dotenv import load_dotenv も load_dotenv() もありません。
コードがめちゃくちゃスッキリしましたね!
プロジェクトルートに .env ファイルを作成します。
API_KEY=secret_12345
DB_HOST=localhost
さて、ここからが dotenvx の出番です。
普通に python main.py と実行しても、環境変数は読み込まれません。
$ python main.py
API_KEY: None
DB_HOST: None
代わりに、dotenvx run コマンドを経由して実行します。
$ dotenvx run -- python main.py
[dotenvx] injecting env (2) from .env
API_KEY: secret_12345
DB_HOST: localhost
おおー!ちゃんと読み込まれています!
[dotenvx] injecting env (2) from .env というログが出て、環境変数が注入されたことがわかります。
単に load_dotenv を書かなくて済むだけ? いえいえ、真骨頂はここからです。
これが一番の目玉機能です。
dotenvx encrypt コマンドを実行すると…
$ dotenvx encrypt
[dotenvx] encrypted .env (.env.keys)
すると、.env ファイルの中身が書き換わります。
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
#/ public-key encryption for .env files /
#/ [how it works](https://dotenvx.com/encryption) /
#/----------------------------------------------------------/
DOTENV_PUBLIC_KEY="030f58358b82eee8521ce7e715d93cd6ffbf7fdf8790e4176fcfde83664533f604"
# .env
API_KEY=encrypted:BFYkVG72tvq0DXi1ZjI4dKDT3muD3NSTRrC7F48NKX9Tiv+tcupVtrx+5cZcN2ZDcF1wZrpDpYqrNWQLVGqCC9PlKJQic9nSAsT3NmXutFKKu6i0Xm+o2bULB026YX64SQVI8lpo2FmcIZoHZA==
DB_HOST=encrypted:BPVoTb8xKKPASxQ6RBXQvz9NuY3wUpMBweweILL+BDN7vlAhaNj/6+G3q0rTYHtQHbeQ3nLLg320KGfl7lkWX6Wm6L83ila4s0Ax9+qtCmyEhB4fUz04Q1RMLGQ/XCRsWYbjdF2My5Qwog==
中身が暗号化されました!
そして、復号するための鍵が含まれた .env.keys というファイルが生成されます。
#/------------------!DOTENV_PRIVATE_KEYS!-------------------/
#/ private decryption keys. DO NOT commit to source control /
#/ [how it works](https://dotenvx.com/encryption) /
#/----------------------------------------------------------/
# .env
DOTENV_PRIVATE_KEY=30b898037...
⚠️ 超重要: .env.keys は絶対にコミットしてはいけません! ⚠️
この .env.keys は、暗号化された .env を復号するための「鍵」です。これが漏れると暗号化の意味がありません。
必ず .gitignore に追加されていることを確認してください。
逆に、暗号化された .env ファイルは、Git にコミットしても大丈夫 です。
これで「.env ファイルの共有どうする問題」が一気に解決しますね。
他のメンバーがリポジトリをクローンしたり、プルしたりした後は、どうすればいいでしょうか?
.env.keys ファイルを受け取る。.env.keys を配置する。dotenvx run -- python main.py を実行する。これだけです!
dotenvx が自動的に .env.keys を見つけて、暗号化された .env を復号し、環境変数を注入してくれます。
これ、思いますよね。「.env を配るか、.env.keys を配るかの違いだけで、手間は変わらないのでは?」と。
しかし、運用コストと安全性 に決定的な違いがあります。
更新時の手間がゼロになる
.env 送るね」と配り直す必要がありました。.env.keys を共有してしまえば、その後環境変数がいくら追加・変更されても、メンバーは git pull するだけ。鍵は変わらないので、再配布の必要がありません。これが本当に楽です。変更履歴が Git に残る
.env はコミットできないため、「いつの間にか設定が変わってて動かない」「誰が変えたかわからない」ということが起きがちでした。dotenvx なら暗号化されたファイルとしてコミットされるので、「誰が」「いつ」「どの変数を」変更したか が Git の履歴としてしっかり残ります。開発が進んで、新しい環境変数を追加したくなることもありますよね。
その場合は、dotenvx set コマンドを使います。
dotenvx set NEW_SECRET "my_new_secret_value"
これを実行すると、.env ファイルに新しい変数が 暗号化された状態で 追加されます。
手動で .env を編集して平文で追記してから dotenvx encrypt を再実行してもOKですが、set コマンドの方が楽ちんです。
本番環境、ステージング環境などで変数を変えたい場合も、
.env.production などのファイルを作って、-f オプションで指定するだけ。
dotenvx run -f .env.production -- python main.py
dotenvx、使ってみると想像以上に便利でした。
.env を暗号化してリポジトリ管理できる。dotenvx run -- を付けるだけ。特に新規プロジェクトなら、最初から dotenvx を導入しない手はないんじゃないでしょうか。
既存のプロジェクトでも、load_dotenv() を消して dotenvx 経由で実行するように変えるだけなので、移行も簡単そうです。
みなさんもぜひ試してみてください!
参考:
可茂IT塾ではFlutter/Reactのインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More可茂IT塾ではFlutter/Reactのインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More