0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

環境ごとの .env で同じ値を何回も直している ── 環境を 1 つの project にまとめ、共通の値は Common に 1 つ置く

0
Posted at

環境ごとの .env で同じ値を何回も直している ── 環境を 1 つの project にまとめ、共通の値は Common に 1 つ置く

上原正吉(EarthLink Network Co., Ltd.)。AI会社・AI社員による業務自動化と、人の逐次介入なしに24時間自動開発を回す仕組みを自社で実践しています。開発ノウハウと具体的な設定方法、運用して分かった改善点を公開しています。

環境ごとの .env で同じ値を何回も直している ── 環境を 1 つの project にまとめ、共通の値は Common に 1 つ置く

この記事は、連載「dotvault の使い方 ── .env を手で配るのをやめ、CI・チーム・AI エージェントに 1 コマンドで配るまで」の第 3 回です。この連載が終わる時に、dotvault を誰でも無料で使える形で公開する予定です。

私は、npm script に環境ごとの起動コマンドを書いて、実行の仕方で環境を分けていました。値は環境ごとに別々の .env にあり、development・staging・production と、環境の数だけ置き場所が分かれます。

困るのは、全環境で同じ値です。外部サービスの公開キーや、メールの送信元のアドレスのように、どの環境でも同じ値を使う key は、環境の数だけ書くことになります。その値を変える時は、全部の置き場所を直す必要があります。1 つ直し忘れると、その環境だけ古い値のまま動きます。

この回では、環境ごとの値を dotvault の 1 つの project にまとめます。dotvault では、環境ごとに分かれていた .env が、1 つの project の中の development・staging・production の環境としてまとまり、管理コンソールの 1 か所で、環境を切り替えて値を見られます。全環境で同じ値は、Common という場所に 1 つだけ置けます。Common に置いた値は、どの環境を pull しても .env に入るので、変える時は 1 か所を直すだけです。2 回目で作った demo-app を、そのまま使います。

結論

  • 環境ごとに分かれていた .env は、1 つの project の中の development・staging・production の環境としてまとまります。 環境ごとの値は、管理コンソールの Keys タブで環境を切り替えて、1 か所で管理できます。自分で名前を付けた環境(この回では preview)も、Settings タブから足せます。
  • 全環境で同じ値は、Common(_shared)に 1 つだけ置きます。 Common の値はどの環境の pull にも入るので、同じ値を 2 か所で直さなくて済みます。環境ごとに違う値が要る時は、その環境に同じ名前の key を置けば、環境側の値が勝ちます。
  • 環境どうしの差分は Compare envs… で見比べ、足りない key はその場で写せます。 すでに環境に入っている key は、Promote to Common で、選んだ環境の値を Common の値にして 1 つにまとめられます。標準の 3 つの環境にあった同じ名前の key は消え、Common に 1 つだけ残ります。自分で足した環境の key は残ります。
  • CLI では -E → DOTVAULT_ENV(無ければ APP_ENV)→ project-config.json の defaultEnv の順で環境が決まります。
  • 使い終わった project は、管理コンソールで Archive してから Delete します。

本文(読了 約10分)

前提と注意

  • 読者。 2 回目の「ローカルで直した値が CI に反映されていない ── どの環境でも dotvault pull 1 回で同じ .env をそろえる」で、demo-app に 3 つの key を入れて dotvault pull まで通した状態から続けます。2 回目を読んでいなくても、画面の流れは追えます。
  • 版と環境。 画面は、本番の app.dotvault.io と CLI 0.15.7 で撮りました。端末は 2 回目と同じ Node 20 の Linux コンテナです。0.15.8 からは、.env に書かれる区切りの行が # BEGIN: dotvault (managed by dotvault) になります。この回の環境の指定(-E・DOTVAULT_ENV・defaultEnv)の動きは、0.15.8 でも同じだと確かめました。
  • 端末の画面は再構成です。 実際の出力を文字どおりに写し、見やすい形に組み直しています。生の出力はそのまま保存しています。終了コードは、記録した値を echo $? の行の形で示しています。
  • 画面は英語です。 管理コンソールの表示言語は、2 回目の付録の手順で日本語にできます。
  • デモのアカウントです。 project 名、key の名前、値は、この連載のために作ったデモのものです。値は本物ではありません。
  • 用語。 この記事では、API キーやパスワードのように外に出してはいけない値をまとめて「secret」と書きます。「環境」は、development・staging・production のように、同じ key に別の値を持たせる単位です。「key」は、.env の 1 行の 名前=値 の名前のほうです。

1. 環境ごとの .env を、1 つの project の中の環境としてまとめる

環境ごとに分かれていた .env は、dotvault では 1 つの project の中の環境になります。2 回目で作った demo-app には、development・staging・production の 3 つの環境があります。これは dotvault の標準の環境で、消すことはできません。Keys タブの上に環境の切り替えが並び、押した環境の key の一覧が出ます。環境ごとの値を、この 1 つの画面で見て、直せます。

demo-app の Keys タブ(英語 UI)。環境の切り替えに development・staging・production・preview・Common (_shared) の 5 つが並び、preview が選ばれている。一覧には API_BASE_URL・DATABASE_URL・SMTP_PASSWORD の 3 行。右側は Selected key の空状態。

この画面には、標準の 3 つに加えて、この回の途中で足す preview と、全環境で同じ値を置く Common (_shared) が写っています。順に作っていきます。

2. 環境どうしの差分を見比べて、足りない key を写す

環境を 1 つの project にまとめると、環境どうしを並べて見比べられます。2 回目の時点では、3 つの key は development にしか入っていません。staging や production にも同じ名前の key が要るかどうかは、見比べないと分かりません。Keys タブの「⇄ Compare envs…」を押すと、右側に 2 つの環境を選ぶ引き出しが出ます。

Compare environments の引き出し(英語 UI)。左に production、右に development を選んだ状態で「production ⇄ development · 0 in both」と出て、Only in development (2) の下に DATABASE_URL と SMTP_PASSWORD が並ぶ。見出しの右に「Copy all to production →」、各行の右に「Copy to production」のボタン。

「Only in development」の下に、development にしか無い key が並びます。1 つずつ写すなら各行の Copy to、全部なら見出しの横の Copy all to です。この記事では、先に staging に Copy all to で 3 つを写しました。写した後に staging と development で見比べると、差分が無いことが 1 行で出ます。

この 2 枚は、次の節で API_BASE_URL を Common に移した後に撮りました。Common に移した key は見比べに出ないので、key は 2 つ(DATABASE_URL と SMTP_PASSWORD)と出ています。

Compare environments の引き出しで staging と development を選んだ状態(英語 UI)。「staging ⇄ development · 2 in both」の下に「No differences — both hold the same keys.」と 1 行だけ出ている。

写すのは key の名前と、その時点の値です。写した後に development 側の値を変えても、staging には伝わりません。環境ごとに別の値を持たせるための仕組みなので、これは意図した動きです。全環境で同じ値にしておきたい key は、写すのではなく、次の節の Common に置きます。

3. 全環境で同じ値の key は Common に 1 つだけ置く

この記事のデモでは、API_BASE_URL をどの環境でも同じ値の key として扱います。実際の project では、冒頭で挙げた外部サービスの公開キーや、メールの送信元のアドレスのような key を置く場所です。環境ごとに同じ値を書くと、変える時に全部の環境で変えることになります。そのための場所が Common(画面では Common (_shared)、CLI では _shared)です。Common に置いた key は、どの環境を pull しても一緒に書き出されます。値は Common の 1 つだけなので、変える時も 1 か所を直すだけです。

すでに環境に入っている key は、key を選んで右側の「⬆ Promote to Common (_shared)」を押すと Common に移せます。押すと確認の画面が出ます。

Promote to Common (_shared) の確認画面(英語 UI)。「Promote API_BASE_URL to Common (_shared) using development's value.」の下に、緑の帯で「development's value becomes the Common value — it underlies every env from now on.」、赤の帯で「The key is deleted from staging. Those envs' current values are lost.」、続けて「To keep an env-specific value later, re-add an override in that env (env wins over Common).」の説明。Cancel と「Promote & delete from other envs」のボタン。

確認画面に書いてあるとおり、development の値が Common の値になります。標準の 3 つの環境(development・staging・production)にあった同じ名前の key は消えて、Common に 1 つだけ残ります。自分で足した環境の key は消えずに残り、Common より優先されます。実際に押した後の development と Common を見ると、こうなります。

Promote の後の development(英語 UI)。一覧は DATABASE_URL と SMTP_PASSWORD の 2 行になり、API_BASE_URL は無い。

Promote の後の Common (_shared) タブ(英語 UI)。一覧に API_BASE_URL の 1 行だけがあり、更新日時は Promote を押した時刻。

development の一覧から API_BASE_URL が無くなったのは、そのためです。pull した .env には、Common の値として今までどおり入ります(5 節で確かめます)。

環境ごとに別の値が要る時は、その環境で同じ名前の key を足します。環境側の値が Common より優先されます。これも 5 節で、preview に別の値を置いて確かめます。

Common がまとめるのは、1 つの project の中で、環境に共通の値です。project をまたぐ共通の値は、6 回目の Global Keys で扱います。

4. 自分で名前を付けた環境を足す

標準の 3 つで足りない時は、同じ project の中に環境を足します。足した環境も、ほかの環境と同じ画面で並べて管理できます。Settings タブの Environments で足します。名前は小文字の英数字とハイフンで、先頭は英字、32 文字までです。足す時に「Copy keys from an existing env」で既存の環境を選ぶと、その環境の key がそのまま写ります。この記事では preview を、development から写して足しました。

Settings タブの Environments(英語 UI)。development・staging・production(Standard)、preview(Rename と Delete のボタン付き)、_shared(Cannot be deleted or renamed・Common)の 5 行の表。表の下に環境名の入力欄(e.g. preview, qa-2)と Add environment のボタン、Copy keys from an existing env の選択。さらに下に Danger zone と Archive this project のボタン。

足した環境には Rename と Delete が付きます。標準の 3 つと _shared には付きません。Rename を押すと、新しい名前を入れる画面が出ます。説明に「この環境名を参照する key と権限は、すべて新しい名前に書き換えられる」とあります。

Rename "preview"… の画面(英語 UI)。「Every key and permission that references this env name is rewritten to the new name.」の説明と New name の入力欄(e.g. preview-2)、Cancel と Rename のボタン。

key か権限が残っている環境は消せません。preview に key が入ったまま Delete を押して確認すると、「This environment still has keys or permissions. Remove those first.」と出て、消えません。消したい時は、先にその環境の key を全部消し、その環境に付けた権限も外します。

preview の Delete を押して確認した後の Environments(英語 UI)。表の上に赤い帯で「This environment still has keys or permissions. Remove those first.」と出て、preview の行はそのまま残っている。

この後、preview に API_BASE_URL を別の値(https://preview.example.com/v1)で足しました。Common の値と環境の値のどちらが勝つかを、次の節で見るためです。

5. CLI で環境を指定する

管理コンソールの 1 か所にまとめた値を、端末では環境の名前を指定して取り出します。dotvault list demo-app で、環境ごとの key の数が出ます。自分で足した preview も表に出ます。

dotvault list demo-app の端末画面(再構成)。project=demo-app の下に env・file・keys・last_modified の表。development 3・preview 3・production 1・staging 3 で、どれも file は .env。

production に key を入れた覚えが無いのに 1 と出ています。これが Common の数え方です。Common に置いた API_BASE_URL が、どの環境にも入って数えられています。

環境を指定して pull するには -E(--env)を付けます。指定せず、後で書く環境変数も無い時は、project-config.json の defaultEnv(2 回目の init で development)が使われます。

dotvault pull
dotvault pull -E preview
dotvault pull -E production

dotvault pull・dotvault pull -E preview・dotvault pull -E production と、最初の 2 つの後の cat .env の端末画面(再構成)。development の pull では API_BASE_URL が https://api.example.com/v1、preview の pull では https://preview.example.com/v1 で、他の 2 つの key は同じ。production の pull は「✓ Wrote 1 keys … env=production」で 1 つだけ書く。

見てほしいのは 3 点です。

  1. development の pull に API_BASE_URL が入っています。 development の一覧からは消えましたが、Common の値として入っています。Common の 1 つの値が、どの環境の .env にも入るということです。
  2. preview の pull では API_BASE_URL が preview の値です。 環境に同じ名前の key があれば、環境側が Common に勝ちます。
  3. 書き出した .env には、どの環境から取ったかは書かれません。 結果の行には毎回 env=… が出ます。作業を始める前に、使う環境で pull し直すのが確実です。

環境は環境変数 DOTVAULT_ENV でも指定できます。CI や npm script のように、コマンドを変えずに環境だけ切り替えたい時に使います。-E と両方ある時は -E が勝ちます。DOTVAULT_ENV が無い時は、環境変数 APP_ENV も環境の指定として読みます。アプリが自分の設定に APP_ENV を使っていると、-E も DOTVAULT_ENV も無い時に、defaultEnv ではなくその値の環境が pull されます。dotvault の環境は DOTVAULT_ENV で指定するのが確実です。

DOTVAULT_ENV=staging dotvault pull・DOTVAULT_ENV=staging dotvault pull -E preview・2 回目の dotvault init の端末画面(再構成)。環境変数だけなら env=staging、-E を付けると env=preview で書き出される。init は「✖ VALIDATION_ERROR: project-config.json already exists. Use --force to overwrite.」で終了コード 6。

優先順をまとめると、-E → DOTVAULT_ENV(無ければ APP_ENV)→ project-config.json の defaultEnv です。defaultEnv が使われるのは、-E も 2 つの環境変数も無い時だけです。同じ画面の最後に、dotvault init をもう一度打った時の出力も載せました。project-config.json があるフォルダでは上書きせずに止まり、作り直したい時だけ --force を付けます。

指定 書き方 向いている場面
コマンドの引数 dotvault pull -E staging 手元で一時的に別の環境を見る
環境変数 DOTVAULT_ENV=staging dotvault pull CI や起動スクリプトで、コマンドを変えずに切り替える
設定ファイル project-config.json の defaultEnv そのフォルダの普段の環境。init の既定は development

defaultEnv に書けるのは、development・staging・production のどれかです。preview のように自分で足した環境は、毎回 -E(か DOTVAULT_ENV)で指定します。

6. 使い終わった project を片付ける

環境と値をまとめた project は、使い終わったら project ごと片付けます。Settings タブのいちばん下に Danger zone があります。Archive this project を押すと確認が出て、承認すると project は管理画面の一覧から消えます。Archive は元に戻せます。Delete は、Archive した後にだけできます。

一覧の絞り込みを「Archived only」にすると、Archive した project が出て、Unarchive と Delete… のボタンが付きます。

project 一覧で Archived only を選んだ画面(英語 UI)。demo-app の行に archived の印と、Unarchive・Delete… の 2 つのボタン。

Delete… を押すと、project の名前を打ち込む画面が出ます。名前が一致するまで Delete permanently のボタンは押せません。消えるのは、今の値だけでなく、4 回目で扱う値の履歴も含めた全部です。

Delete "scratch-app" permanently の画面(英語 UI)。「This permanently deletes the project and ALL its secrets — current values and full version history. This cannot be undone.」の説明と、Type "scratch-app" to confirm: の入力欄に scratch-app と入れた状態。Cancel と Delete permanently のボタン。

この画面は、demo-app を消さないために、別に作った scratch-app で撮りました。Delete permanently を押すと、「All (incl. archived)」で見ても一覧から無くなります。demo-app は Unarchive して、4 回目でも使います。

project の archive と delete は、管理コンソールで行います。CLI の dotvault project にあるのは create と list です。

まとめ

環境ごとに別々に持っていた .env は、dotvault では 1 つの project の中の環境としてまとまり、管理コンソールの 1 か所で管理できます。全環境で同じ値は Common に 1 つだけ置けば、どの環境の pull にも入るので、同じ値を 2 か所で直さなくて済みます。

次回

4 回目は「値を間違えて上書きしてしまった ── key を書く・取り出す・版を戻す」です。key を画面と CLI の両方から書き、値を取り出し、版の一覧から前の版に戻すところまでを、画面と一緒に進めます。


dotvault は、.env や設定ファイルの secret をサーバー側に置き、権限のある人・CI・AI エージェントが 1 コマンドで受け取るサービスです(https://dotvault.io)。この連載が終わる時に、dotvault を誰でも無料で使える形で公開する予定です。公開したら、この連載の手順どおりに使い始められます。

興味のある方は、ぜひ「いいね」と記事の購読をお願いいたします。

自社プロダクトは https://www.eln.ne.jp/products にまとめています。

筆者について

上原正吉。EarthLink Network Co., Ltd. 代表。AI社員に日々の業務を任せ、開発では人が逐一指示しなくても作業が進むHOOTL(Human Out Of The Loop)の仕組みを自社で実践しています。このブログでは、業務自動化と24時間自動開発のノウハウ、具体的な設定方法、日々の運用で見つかった問題と改善を共有します。

また、AIで業務や開発を組み替えたい会社・チーム向けに、AI活用のコンサルティングも受け付けています。ご相談は www.eln.ne.jp からどうぞ。


EarthLink Network は、会社の全業務を AI で回すために、必要になったものを自社で作っています。いま作っているプロダクトの一覧と概要は、こちらにまとめています。

→ EarthLink Network が自社でつくっている18のプロダクト

会社と各プロダクトの詳細は、公式サイト www.eln.ne.jp をご覧ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?