1 Password CLIでローカル環境変数の管理を楽にした話
はじめに
みなさん、こんにちは。anyのエンジニアの荒川です。
ついに4月が始まりましたね!弊社にもたくさんのメンバーがジョインしてもらいました!🙌
そこで新メンバーといえば環境構築の話ですよね。
今回は環境構築をとにかく楽にするために取り組んだ施策の一つである環境変数周りの改善をご紹介します!
ローカル環境変数の管理課題
Qastのアプリケーションの大半はTurborepo
を利用したモノレポ構成で管理されており、下記のように単独で動作する複数のパッケージが存在します。
上記すべてに環境変数を個別に配置する必要があり、なおかつバッチ処理や旧アーキテクチャの別リポジトリでの管理を含めると、初期環境構築時に10個に近い環境変数を適切な位置に置く必要がありました。
これらの環境変数を、コマンドラインでバチっと楽に注入できるようにしたいという想いで、改善を走らせました。
改善したこと💪
まず、1Passwordにおける値の参照値を.env.1password
に記載します。
下記のコマンドを実行することで、.env
を1Password CLIで自動生成させることができます!
op inject -i .env.1password -o .env
そして、package.json
側でもエイリアスとしてgen:env
を作成しておきます。これを各種パッケージごとに定義します。
{
"scripts": {
"gen:env": "op inject -i .env.1password -o .env",
"gen:env:force": "op inject -f -i .env.1password -o .env"
}
}
モノレポのトップ階層にあるpackage.json
にもエイリアスを定義します。
こうすることで、apps
配下の全パッケージ一括でpnpm run gen:env
を実行させることができます。
{
"scripts": {
"gen:env": "op signin && pnpm --filter \"./apps/*\" gen:env",
"gen:env:force": "op signin && pnpm --filter \"./apps/*\" gen:env:force"
}
}
これで、pnpm run -w gen:env
を実行するだけで、全てのパッケージの環境変数が自動で生成されるようになりました!
ついでに、環境構築という観点からは、最初にダウンロードしなければならないファイルなども1Passwordに保存し、ダウンロードするようにしました💪
こちらも下記のように参照値からファイルをダウンロードしてくることができます。
$ op read "op://Dev_All/dummy/hoge_file" > ./hoge_file
選定対象
さて、今回は1Password CLIを選定した理由もご紹介します。代替案として検討したのは、下記の通りです。
-
Parameter Store / Secret Manager
AWS純正の変数管理/シークレット管理のサービスです。FargateやEC2など、いわゆるデプロイ環境の環境変数の仕組みとしてはすでに利用しています。ただし、今回はローカル開発環境の改善であり、現時点でデプロイ側のコードとの管理が混ざることによるリスク(特に編集権限の管理が複雑になる)や、値の取得単位での料金体系などによる費用感の見積もりが困難であることを鑑み、一旦1Passwordを選定することにしました。
ただ、1Passwordよりも、配布方法を工夫すれば安くつく可能性は十分あるので、選択肢としては十分ありです。 -
S3
.env
ファイルを配置して参照したいという話であれば、プリミティブにS3でもよいのですが、Key/Valueの編集の難易度が高く、シンプルに作業が面倒になるため、採用は見送りました。 -
Keeper
1Passwordの代替ソフトとして、Keeperは価格の安さがウリです。
1Password自体は機能的にリッチすぎる側面があり、$9.99/userでは全社適用におけるコストが心配でした。しかしながら、今回自動化したいCLIという観点では、KeeperであってもKeeper CommanderというCLIを利用するにはEnterprise以上のプランが必要となる模様で、少なからずエンジニアチームの環境変数改善の文脈ではコスト感が変わらないため、導入実績のあった1Passwordを採用しました。
今後の課題
op signin コマンドの認証頻度の高さ
op signinコマンドが、それなりに頻繁(30分ごと)に認証を求めてきてしまいます。セキュアである一方、もう少し長く設定できても良いのではないかと思っています😭
サーバ起動時に自動適用させたい
本来であれば、gen:env
のコマンドなしにサーバ起動時に.env
を適用させたいのですが、.env
の値のうち、個人用のものや一時的に上書きしたい値の制御が必要というニーズがあり、自動適用はしていません。
ただ、.env
に加えて、.env.local
などで上書きできる仕組みを整えるなどして、早いうちに対応できたら嬉しいです😉
1Passwordのコストが高め
1Passwordで$9.99/userの価値があるのかという問題です。
そもそもパスワードマネージャーとしての利用も可能なため一概には言えませんが、人数が増えていくにあたってコスト面は重要です。
これまで、環境変数の変更によってローカルが動かなくなるという事象が減ったため、不要な時間を節約できるという観点では価値はあるとは思いつつ、代替案があれば模索していきたいと考えています。
おわりに
新メンバーの環境構築の効率化という観点のみならず、既存メンバーにエンジニアの開発者体験に関するサーベイやアンケートをEM主導で行なったところ、そのうち非常に改善要望の声が多かったものの一つがローカル開発環境の環境変数問題でした!
こういった開発者体験の仕組みにも、より取り組みたいので、今後もどんどん改善していきたいと思います!それでは👋
Discussion