There's an echo in my head

日々のメモ。

ローカル開発環境用のクレデンシャルを 1Password で管理してコマンド実行時にラッパースクリプトで流し込む

趣味で Go のアプリケーションを開発しているときに、ローカルの開発環境用の環境変数の管理について次のようなことを悩んでいた。

悩んだ結果、次のようなことをやってみた。

  • クレデンシャルは 1Password で管理する
  • make 経由でのコマンド実行時には、 1Password から読み込んだクレデンシャルを export してくれるラッパーをかませる

具体例として、まずラッパーはこんな感じ。ファイル名は 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ファイルを環境変数に読み出す」が参考になる。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。