🧿

direnvと環境変数の解説

2021/12/11に公開

結論

プロジェクトのシークレット情報は、環境変数で渡そう。
そのための環境変数の管理、読み込みはdirenvが便利です。

環境変数とは

https://ja.wikipedia.org/wiki/環境変数

オペレーティングシステム (OS) が提供するデータ共有機能の一つ。OS上で動作するタスク(プロセス)がデータを共有するための仕組みである。特にタスクに対して外部からデータを与え、タスクの挙動・設定を変更するために用いる。

新しくプロセスを立てるとき、プロセスの外から内に設定を渡したいとき、環境変数経由で渡せます。

Tweleve-Factor App 曰く

https://12factor.net/ja/

Tweleve-Factor Appとは、良い感じのwebアプリケーションを作るための方法を列挙したものです。
全部ためになるので読んで実践するとよいですが、今回参照するのはこの12項目のうちの「設定」の項目を見ましょう。

https://12factor.net/ja/config

設定を環境変数で渡すと良いよ、と言ってます。

ただし、デプロイ(ステージング、本番、開発環境など)ごとに異なる設定のことを指していて、アプリケーション内部の、デプロイ間で変わらない設定は別だと言っています。

補足:合わせて読みたい

Tweleve-Factor Appは2012年の文章なので、後に時代の変化に合わせてより洗練したものを別の人が
beyond tweleve factor appとして本を書いています。これも見ておくと良いでしょう。(とはいえ、この本も2016年のものですが)

direnv

ローカル開発環境においても環境変数を扱いたいわけですが、それを管理するのにdirenvがおすすめです。
Tweleve-Factor Appでも述べられてますが、(環境変数経由で渡すべき)設定はコードベースに入れるべきではないので、開発開始時に責任者から直接チャット経由等でもらうことになります。(AWSのキーなど)

このとき、この環境変数はどこに保存するべきでしょう?direnvはこの問題を解決してくれます。

https://direnv.net/

具体的には、フォルダの中に.envrcというファイルを作成すると、このフォルダより下にcdで移動したときにだけ、.envrcから環境変数をloadして、このフォルダよりも外に移動したときは、自動的にunloadしてくれます。

これのおかげで、複数プロジェクトをgit cloneしてる際も、リポジトリの下に入っているときにだけ、そのプロジェクトで使う環境変数を読み込むことができ、プロジェクト間で間違ってシークレット情報を交差させたり、プロジェクト外で間違って使ったりしてしまうリスクを減らせます。

動作例

このようなフォルダ構成とします。

% tree -a .
.
├── project-A
│   ├── .envrc
│   └── sub-dir
└── project-B
    └── .envrc

project-Aとproject-Bにcdした際に、SOME_SECRETという環境変数が自動で読み込まれてるのを確認してください。

Image from Gyazo

インストールや使い方

に関しては、公式ドキュメントはもちろんですが、検索すればいくらでも日本語記事が見つけられると思いますので、割愛します。

https://qiita.com/kompiro/items/5fc46089247a56243a62

https://qiita.com/RyoMa_0923/items/6ef1a339772916e80d01

direnvのその他の機能

https://blog.p1ass.com/posts/direnv-dotenv/

この記事の紹介されているdotenvのように、.envrc上で動作するコマンドなども用意されています。これはdirenv-stdlibとして提供されていて、設定抜きですぐに使えます。詳しくは公式ドキュメントを見てください。各種言語であると便利なコマンドもあるので、さっと眺めておくと良さそうです。

読者に質問:Windowsではどうしてますか

direnvはMacやLinuxでは動作しますが、Windowsはサポートされてません。逆に聞きたいのですが、WindowsでWSLも使っていない場合、環境変数の管理ってどうしてますか?自分はこんなふうにやってるよ等コメント頂けると幸いです。

Discussion