【Python】脱dotenv!次世代の環境変数管理ツール「dotenvx」を使ってみた

image

こんにちは、hiroshiです。

みなさん、Pythonで開発するとき、環境変数の管理はどうしていますか? やっぱり python-dotenv を使って .env ファイルから読み込むのが一般的ですよね。

でも、.env ファイルって Gitにコミットできない のが地味に面倒じゃないですか? チーム開発で「あ、.env 共有するの忘れてた」「Slackで送るね(セキュリティ的に微妙…)」みたいなやり取り、一度は経験があるはず。

そんな悩みを解決してくれるかもしれない、次世代の環境変数管理ツール が登場しました。 その名も dotenvx です!

なんとこれ、あの有名な dotenv ライブラリの作者が作ったツールなんです。 今回は、この dotenvx を Python プロジェクトで実際に使ってみて、何がすごいのか、どう便利なのかを紹介したいと思います。

ちなみにdotenvxは、Node.js, Go, Rust, PHP... あらゆる言語、あらゆるフレームワーク で使えますが、今回はPythonで実際に使ってみることにします。

dotenvx とは?

公式サイトには "A secure dotenv" と書かれています。 主な特徴は以下の通り。

  1. Run Anywhere: 言語に依存せず、コマンド一つで環境変数を注入できる。
  2. Encryption: .env ファイルを暗号化して、安全に Git 管理できる(!?)。
  3. Multiple Environments: 環境ごとの設定切り替えが簡単。

特に「暗号化してGit管理できる」というのは革命的ですね。

Python で使ってみる

では早速、Python で使ってみましょう。 今回は python-dotenv ライブラリを使わずに、dotenvx の CLI ツールだけで環境変数を扱ってみます。

1. インストール

まずは dotenvx をインストールします。 macOS なら Homebrew で一発です。

brew install dotenvx/brew/dotenvx

他のOSや npm 経由でのインストール方法は 公式サイト をチェックしてください。

2. Python コードの準備

次に、環境変数を表示するだけの簡単な 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_dotenvload_dotenv() もありません。 コードがめちゃくちゃスッキリしましたね!

3. .env ファイルの作成

プロジェクトルートに .env ファイルを作成します。

API_KEY=secret_12345
DB_HOST=localhost

4. 実行!

さて、ここからが 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 というログが出て、環境変数が注入されたことがわかります。

ここがすごいよ dotenvx

単に load_dotenv を書かなくて済むだけ? いえいえ、真骨頂はここからです。

.env を暗号化して Git にコミットできる!

これが一番の目玉機能です。 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 ファイルの共有どうする問題」が一気に解決しますね。

チームメンバーが git pull した後は?

他のメンバーがリポジトリをクローンしたり、プルしたりした後は、どうすればいいでしょうか?

  1. 共有された(安全な場所にある).env.keys ファイルを受け取る。
  2. プロジェクトルートに .env.keys を配置する。
  3. dotenvx run -- python main.py を実行する。

これだけです! dotenvx が自動的に .env.keys を見つけて、暗号化された .env を復号し、環境変数を注入してくれます。

「結局 .env.keys を共有するなら、今までと同じじゃない?」

これ、思いますよね。「.env を配るか、.env.keys を配るかの違いだけで、手間は変わらないのでは?」と。

しかし、運用コストと安全性 に決定的な違いがあります。

  1. 更新時の手間がゼロになる

    • 従来: 環境変数が1つ増えるたびに、全員に「新しい .env 送るね」と配り直す必要がありました。
    • dotenvx: 一度 .env.keys を共有してしまえば、その後環境変数がいくら追加・変更されても、メンバーは git pull するだけ。鍵は変わらないので、再配布の必要がありません。これが本当に楽です。
  2. 変更履歴が 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、使ってみると想像以上に便利でした。

  • コードが汚れない: Python コードから環境変数読み込みのロジックを排除できる。
  • セキュア: .env を暗号化してリポジトリ管理できる。
  • 簡単: コマンドの前に dotenvx run -- を付けるだけ。

特に新規プロジェクトなら、最初から dotenvx を導入しない手はないんじゃないでしょうか。 既存のプロジェクトでも、load_dotenv() を消して dotenvx 経由で実行するように変えるだけなので、移行も簡単そうです。

みなさんもぜひ試してみてください!


参考:

お知らせ

可茂IT塾ではFlutter/Reactのインターンを募集しています!(募集停止中)

可茂IT塾ではFlutter/Reactのインターンを募集しています!(募集停止中)

可茂IT塾ではFlutter/Reactのインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More

関連の記事

タグ

Flutter (124)初心者向け (32)イベント (19)Google Apps Script (17)可茂IT塾 (12)Nextjs (12)AI (8)React (8)riverpod (7)デザイン (7)Firebase (7)Figma (6)VSCode (6)JavaScript (6)ChatGPT (5)新卒 (4)就活 (4)Slack (4)Dart (4)TypeScript (4)お知らせ (4)FlutterWeb (3)経験談 (3)Prisma (3)NestJS (3)アプリ開発 (3)tailwindcss (3)ワーケーション (3)インターン (3)Web (2)Obsidian (2)設計 (2)線型計画法 (2)事例 (2)Git (2)CSS (2)Freezed (2)Image (2)File (2)Material Design (2)会社員 (2)画像 (2)iOS (2)React Hooks (2)社会人 (2)大学生 (2)RSS (1)Google (1)CodeRunner (1)NotebookLM (1)個人開発 (1)Android (1)Unity (1)WebView (1)Twitter (1)フルリモート (1)TextScaler (1)textScaleFactor (1)学生向け (1)supabase (1)Java (1)Spring Boot (1)shell script (1)正規表現 (1)table (1)テーブル (1)hooks (1)パワーポイント (1)ブックマーク (1)Pocket (1)ブクマク (1)MCPサーバー (1)OpenAI (1)Supabase (1)ベクトル検索 (1)趣味 (1)モンスターボール (1)SCSS (1)Swift (1)MapBox (1)Cupertino (1)gpt-oss (1)生成AI (1)llama.cpp (1)LLM (1)ListView (1)secretmanager (1)postgresql (1)nextauth (1)prisma (1)typescript (1)cloudrun (1)gcp (1)nextjs (1)kamoit (1)就活浪人 (1)既卒 (1)保守性 (1)iPad (1)シェアハウス (1)スクレイピング (1)PageView (1)画面遷移 (1)dotenvx (1)dotenv (1)Python (1)flutter_hooks (1)Gmail (1)GoogleWorkspace (1)ShaderMask (1)google map (1)Google Places API (1)GCPコンソール (1)Google_ML_Kit (1)Vercel (1)Google Domains (1)DeepLeaning (1)深層学習 (1)Google Colab (1)Firebase Analytics (1)Gemini AI (1)コード生成 (1)GitHub Copilot (1)GitHub Actions (1)gemini (1)オンラインオフィス (1)html (1)オブジェクト指向 (1)クラスの継承 (1)ポリモーフィズム (1)LINE Messaging API (1)LINE Notify (1)LINE (1)Bitcoin (1)bitFlyer (1)コミュニティー (1)文系エンジニア (1)build_runner (1)ヒーター (1)作業効率 (1) (1)Flutter実践開発 (1) (1)permission_handler (1)flutter_local_notifications (1)markdown (1)GlobalKey (1)ValueKey (1)Key (1)アイコン (1)go_router (1)FireStorage (1)debug (1)datetime_picker (1)Apple Store Connect (1)FlutterGen (1)デバッグ (1)Widget Inspector (1)VRChat (1)API (1)検索機能 (1)ローディング (1)Skeletonizer (1)Simmer (1)Shader (1)SharedPreferences (1)オフラインサポート (1)Navigator (1)メール送信 (1)FlutterFlow (1)Firebase App Distribution (1)Fastlane (1)Dio (1)CustomClipper (1)ClipPath (1)video_player (1)IMA (1)カスタム認証 (1)アニメーション (1)Arduino (1)ESP32 (1)フリーランス (1)会社設立 (1)mac (1)csv (1)docker (1)GithubActions (1)Dialog (1)BI (1)sora2 (1)Gemini CLI (1)Claude Code (1)LifeHack (1)ショートカット (1)Chrome (1)高校生 (1)キャリア教育 (1)非同期処理 (1)生体認証 (1)BackdropFilter (1)レビュー (1)Antigravity (1)getAuth (1)クローズドテスト (1)PlayConsole (1)Algolia (1)コンサルティング (1)Symbol (1)

お知らせ

可茂IT塾ではFlutter/Reactのインターンを募集しています!(募集停止中)

可茂IT塾ではFlutter/Reactのインターンを募集しています!(募集停止中)

可茂IT塾ではFlutter/Reactのインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More