開発環境の環境変数を管理するプラットフォームを作った
作ったものと作った理由
作ったやつ
デバイス間での環境変数の共有やチーム間での環境変数の共有が面倒だったので作ってみました。
.env.example
を cp して値を入れてだったり、何か環境変数を加えたりしたときに .env.example
にキーを加えたりするのが個人的に煩わしかったので、チーム間、デバイス間で安全にかつ簡単に共有できるものを作りました。
俗に言う f○ck 駆動開発 (俗に言わない)
もちろん他人の環境変数へのアクセスや組織外のアカウントのアクセスはできないようになってるので安心してください。
実際に https://envassador.com/project/enva-dev でこのプロダクト自体の開発用の環境変数を管理しています。皆さんのブラウザからは 404 となっているはずですがおそらくログインしてないのでログイン画面にとんじゃいます。私のアカウントでログインした状態だとこのように映ります。
着想から今に至るまでちょうど 2 ヶ月くらいかかりました。
一応簡単な紹介動画も作ってみたのでこれを見るとイメージしやすいかもです。
機能の紹介
簡単に紹介します。
CLI ありきなのでブラウザの説明は適当です。
ブラウザ
ログインするとヘッダーの右上に+
ボタンが出るのでそれを押すとプロジェクトを作成できます。
あとはプロジェクトのページで環境変数を CRUD できます。
このページで自分のプロジェクト一覧が見られます
CLI
これを使わないと正直旨味がありません。
バイナリをこちらでダウンロードし、解凍、パスを通します。
パスワード
認可が必要なコマンドでは email と cli 用パスワードの入力が求められます。
※ログインする時に必要なパスワードとは別物です。
こちらのページで cli 用のパスワードを取得します。忘れてしまったら再度生成してください。何度でも生成できます。
セットアップ
enva set
プロジェクト名は、環境変数の出力先等を聞かれるので入力していきます。
プロジェクト名と環境変数だけ必須で残りはオプショナルです。
こんな感じの形式になります。
{
"file": ".envrc",
"project": "sample1",
"org": "my_org",
"pre": "echo 'GOOD MORNING!'\nPATH_add ./bin",
"suf": "echo 'OK'"
}
対応拡張子は .envrc
, .json
, .yaml(.yml)
でそれ以外は .env
と同じように key = value
の形式になります。
プロジェクトの開始
init コマンドでプロジェクトを開始できます。もちろんブラウザ上からもできます。
enva init
もしenva.json
に記載されているプロジェクトが既に存在すればそのプロジェクトにenva.json
に記載されているファイルから環境変数がインサートされます。
逆にenva.json
に記載されているプロジェクトがまだ作成されていなければ、プロジェクトを作成するか cli 上で聞かれます。作成するを選択した場合、プロジェクトの作成後、上記と同じようにenva.json
に記載されているファイルから環境変数がインサートされます。
このコマンドは強力なので既にプロジェクトに環境変数が登録されている場合は使えないようになっています。
ですので、enva.json
で指定しているプロジェクトが空もしくはプロジェクトがまだない場合のみ有効です。
その他
その他にもありますが長くなっちゃうので控えます。
こちらのページにコマンドの説明があります。
もしくは以下のコマンドで使い方を出力できます。
enva help
技術スタック
細かいテクニックとかも別々に記事にしたい。
API
go
CLI
go
Front
Next.js (typescript)
mui, recoil, swr
セットアップが楽なので next にしました。SSR も SG も使ってません
DB
PostgreSQL
Infra
予算は半分無視して自分への投資だと割り切ってます。
nat gateway が高い 💦
AWS (ECS, Fargate, ECR, RDS, cognito)
Vercel
IaC
Terraform
CI/CD 及び自動化、コード生成等
go + github actions
アーキテクチャ
クリーンアーキテクチャ
その他
sentry
工夫した点
今回は自動化をたくさんしました。
理由としては単に自分が物臭だからです。
API に関しては API に影響するコードが変更されていたら、docker のイメージをビルドして、それを ECR にプッシュしてイメージタグを指定している terraform のコードを更新するところまでやっています。
apply はプルして手動でしています。
他にもバイナリの配布の部分はバージョンアップしたいタイミングでバージョン情報の載った json を編集すると github actions でフックしてバイナリを生成、tar に圧縮し、こちらのページ(https://envassador.com/cli)が勝手に更新されるようにしています。
CLI のコマンドの説明等も基本自動生成にしてます。
今後やること
- UI のブラッシュアップ
- 機能の追加、ブラッシュアップ
- 課金プランの開始 (チーム開発でこそ効果を発揮するので急ぎたい)
- RDB にあんまりハッスルして欲しくないのと swr を使ってる都合上、ElastiCache とか導入するかも
- OSS 的にコードを公開するかは迷い中(CLI は優先的に公開してもいいかも)
参考にしたものとか
AWS 系
こちらがわかりやすくて非常に助かりました。
あとは、terraform や aws の公式ドキュメントで大体事足りた
CLI
こちらをフォークして使っています。あとは go の極標準的なパッケージくらいしか使ってません。
現職
現職で学ぶことが非常に大きいです。
やっと go と ts である程度まともなコードが書けるようになってきた気がしています。
Discussion