趣味で Go のアプリケーションを開発しているときに、ローカルの開発環境用の環境変数の管理について次のようなことを悩んでいた。
- 環境変数の定義が Makefile や .env に散らばっている
- .env にクレデンシャルを書きたくない
- .gitignore に追加しているとはいえ、なにかの拍子に変な方法で漏えいさせてしまいそう
- make で環境変数を読み込むのにてこずった
悩んだ結果、次のようなことをやってみた。
- クレデンシャルは 1Password で管理する
- make 経由でのコマンド実行時には、 1Password から読み込んだクレデンシャルを export してくれるラッパーをかませる
- 1Password からの読み込みには 1Password CLI を使う
具体例として、まずラッパーはこんな感じ。ファイル名は local_exec.sh
とする。
#!/usr/bin/env bash set -e # 直接書けるものは直接書く export PORT=8080 # 1Password に格納されているクレデンシャルは CLI の `op read` コマンドで取り出す # 引数に渡しているのはフィールドごとに割り当てられている secret reference という URL # ref: https://developer.1password.com/docs/cli/reference/commands/read export YOUR_CREDENTIAL=$(op read "op://myvault/myapp/secret/key") exec "$@"
そして Makefile はこんな感じ。
.PHONY: run run: ./local_exec.sh myapp
実行方法は普段の make と同じ。
$ make run
ただし、1Password へのアクセスが要求されていることの確認ダイアログに同意する必要がある点に注意が必要。最初の1回だけでなく、どうやら一定時間ごとに要求されるようになっているらしい。
以上のようにすることで、クレデンシャルは 1Password に一元管理したうえで、コマンド実行時の export の処理も他の環境変数同様にラッパーに集約することができた。
ただ、これを行うには、他の人とソースコードを共有するときに次のような前提が必要となる。
- 1Password が導入されていること
- 共通の secret reference にクレデンシャルが設定されていること
これらは結構大きなハードルになるので、複数人が参加するプロジェクトでは導入は難しそう。
メモ
.env から環境変数を読み込む場合には Songmu さんの「bashでdotenvファイルを環境変数に読み出す」が参考になる。