dotenvをやめてVarlockに移行した理由

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00これはValorです。環境変数を管理するためのオープンソースツールで、これを使えば
00:00:04平文のシークレットを二度とディスクに保存する必要がなくなります。環境変数を
00:00:10ローカル、または1Password、Bitwarden、AWSなどのパスワードマネージャーを通じて解決し、
00:00:16型安全なスキーマを使用して、実行時にシークレットをアプリケーションに注入します。これにより
00:00:21.envファイルはAIに対しても安全になり、GitHubで公開しても大丈夫です。でも、実際にはどう機能し、
00:00:27この独特な構文は何なのでしょうか? チャンネル登録して、詳しく見ていきましょう。
00:00:31新しい開発プロジェクトに参加して、コードを入手し、ローカルで実行しようとしたとき、
00:00:39動かなくて、実は他の開発者からもらうか、暗号化ストレージから取得すべき
00:00:45.envファイルが足りなかったと気づいたことは何度ありますか? そして、その
00:00:50.envファイルが更新されるたびに、同じプロセスを繰り返さなければなりません。Valorはこの問題を解決し、
00:00:56プロンプトインジェクションを受けたAIエージェントが、アクセスすべきでないシークレットを取得する問題も修正します。
00:01:02仕組みを見てみましょう。これは私が作っている小さなプロジェクトで、OpenAIのWhisperで動画を文字起こしし、
00:01:06Claudeを使ってTwitterの動画から記事を生成するものです。
00:01:12まずは簡単なことから始めましょう。Valorを使ってポート番号を変更してみます。Valorが
00:01:17インストールされているので、現在は空の .env.schema ファイルがあるはずです。これが
00:01:23すべての環境変数の信頼できる唯一の情報源(Source of Truth)となり、公開リポジトリにコミットできます。
00:01:28まず、単純な「appenv」という環境変数を追加し、値を「testing」に設定します。
00:01:33新しいタブを作成して「varlock load」を実行し、スキーマを検証します。
00:01:39環境変数が読み込まれ、「sensitive(機密)」に設定されているのがわかります。
00:01:43これは、Valorのすべての環境変数がデフォルトで機密に設定されているためですが、変更可能です。
00:01:48このファイルに最初のデコレータを追加します。ファイル内のすべての環境変数に影響する
00:01:52ルートデコレータを追加し、「default sensitive」を「false」に設定します。
00:01:56構文の先頭にハッシュ記号(#)があることに注目してください。通常、ルート変数は区切り線で分けられます。
00:02:02このファイル全体は、Varlockチームが作成した「mspec」というドメイン固有言語(DSL)を使用しています。
00:02:08再度スキーマを検証すると、機密設定が解除されたため、環境変数の値が実際に表示されます。
00:02:14スキーマファイル内では、環境変数に型を指定するなど、他にも便利なことができます。
00:02:19「string」型を指定してみます。これなら問題なく動作しますが、もし
00:02:24「number」に変更すると、文字列が渡されているためエラーが表示されます。
00:02:29「required」デコレータを指定してテキストを削除することもできます。そうすると、
00:02:33値が期待されているため、ファイルを確認した際にエラーが発生します。
00:02:39これらはアイテムデコレータと呼ばれます。利用可能なデコレータや型の全リストは、
00:02:44Varlockのドキュメントで確認できます。では、別の環境変数を追加しましょう。
00:02:50今回は「port」という名前で、値を「3002」にします。型には「port」を指定し、
00:02:55さらに上の方でこれを機密に設定し、ここを文字列に戻します。
00:03:01両方の環境変数が認識されましたが、機密設定にしたため値は隠されています。
00:03:05では、これらの値をどうやってアプリケーションに取り込むのでしょうか?
00:03:10「varlock run」の後に、アプリを実行するためのスクリプトを続けるだけです。package.jsonを
00:03:15確認すると、フロントエンドの実行には「vite」コマンドが必要だとわかります。
00:03:21「varlock run vite」を実行すると、設定が読み込まれ、解決され、
00:03:27環境変数に注入されます。その通りになりました。ポートは3002になっています。
00:03:33コード内では、まずVarlockによって注入されたポート環境変数をチェックしているからです。
00:03:38Varlockはあらゆるプロジェクトで動作するため、JavaScriptファイルである必要はありません。
00:03:43Python、Go、Rustなど、何でも期待通りに動作します。npmでインストールしたくない場合は、
00:03:48同様に動作するVarlock CLIも用意されています。ローカルの環境変数についてはこれで十分ですが、
00:03:54次はOpenAIやAnthropicのAPIキーなどを、シェルのローカル変数の代わりに
00:03:591Passwordから取得するプロセスを説明します。
00:04:05私は普段1Passwordを使っていませんが、この動画のためにトライアルに登録しました。
00:04:11新しい「ヴォルト(保管庫)」を作成しました。これが非常に重要である理由は後で説明します。
00:04:16このヴォルトには、OpenAIとAnthropicのAPIキーという2つのアイテムがあります。
00:04:24これらは完全に架空のものなので、公開しても構いません。これらは本物のキーではありません。
00:04:30これらの値をVarlockスキーマに取り込むには、まず1Passwordプラグインをインストールする必要があります。
00:04:36Varlockのプラグインは独自のルートデコレータやアイテムデコレータを追加できるため、
00:04:42ドキュメントにないもの(例:init-1password)が表示されることがあります。
00:04:49「varlock-1password」をインストール後、プラグインを含むルートデコレータを読み込み、
00:04:55「init-1password」デコレータを実行します。ここで必要なのはトークンだけで、
00:05:01ここから読み込めます。このトークンを取得するには、個人のヴォルトではなく、
00:05:06新しいヴォルトに接続する必要があります。「Developer Service Account」から手順に従い作成してください。
00:05:11この動画の後にトークンとアカウントは削除するので、お見せしても大丈夫です。
00:05:15型にはプラグイン提供の「1password-service-token」を指定し、機密に設定します。
00:05:21お気づきかもしれませんが、このファイルには構文ハイライトがありません。これは、
00:05:26VarlockチームがVS Codeプラグインを作成して対応していますが、
00:05:32Neovim用はまだないためです。将来自分で作るか、Claudeに作らせるかもしれません。
00:05:37さて、「openai_api_key_id」という新しい環境変数を作成します。
00:05:431Passwordから取得するには、1Password関数を実行し、特定のプロトコルに続けて
00:05:49ヴォルト名(ここでは「test」)、アイテム名(「openai」)、
00:05:55そしてフィールド名を入力します。確認すると、フィールド名は「credential」です。
00:06:02これも機密に設定できます。そして「varlock load」を実行すると、数秒後に
00:06:081PasswordからAPIキーを取得します。動作確認のためにここの値を
00:06:14「1234」などに変更して再度「varlock load」を実行すると、正しい値が取得されます。
00:06:20これで、環境変数のスキーマファイルはコミットできる状態になりました。しかし、
00:06:25「1Passwordトークンを公開して安全なのか」と疑問に思うでしょう。正直なところ、
00:06:31ローカル開発で1Passwordを使っているなら、デスクトップアプリやCLIが
00:06:38インストールされているはずです。その場合は、トークンの代わりに指紋認証で解除する設定も可能です。
00:06:43VarlockはAWS、GCP、Bitwardenなどの他のプラグインもサポートしています。
00:06:52さらにVite、Next.js、Cloudflare Workersなどの統合も多数あります。他にも、
00:06:57スキーマからTypeScriptの型を生成したり、他のファイルから環境変数をインポートしたり、
00:07:03ログや送信HTTPレスポンスから機密情報を隠したりする機能など、紹介しきれないほどあります。
00:07:08これは非常に素晴らしい配慮です。また、コーディングエージェントが自動的に
00:07:15スキーマを設定するのを助けるMCPサーバーや、CI/CDプロセスで
00:07:21環境変数を読み込み検証するGitHub Actionもあります。ただ、これほどクールなVarlockにも
00:07:27いくつか課題があります。例えばオフラインでは使えないため、空港などで
00:07:32コーディングする場合はハードコードされた環境変数を使う必要があります。もっとも、ネットなしで開発する人は稀でしょうが。
00:07:37インターネットといえば、別のプロバイダーからパスワードを取得する際に
00:07:41少し遅延が発生するため、スクリプトの起動に少し時間がかかります。
00:07:46また、Dashlaneなどのプロバイダーが不足しています。さらに、スキーマ内の名前が
00:07:53ローカルシェルの環境変数と同じだと、1Passwordよりローカルの変数が優先されるというバグに遭遇しました。
00:07:59しかし、Varlockは活発に開発されており、これらは将来的に
00:08:05解決されるはずです。いずれにせよ、現状でもこの製品は私にとって
00:08:10非常に有用であり、今後のすべてのサイドプロジェクトで使っていくと思います。
00:08:16可能であれば、ローカルのシェルファイルもすべてVarlockのスキーマに置き換えたいですね。
00:08:21AIエージェントに情報をスクレイピングされたくないですから。

Key Takeaway

Varlockは、従来の.envファイルに代わって環境変数を型安全かつセキュアに管理し、外部マネージャーとの統合やAI時代のリスク管理を可能にする次世代ツールです。

Highlights

Varlockは環境変数を平文で保存せず、実行時に安全に注入するオープンソースツールである

.env.schemaファイルを信頼できる唯一の情報源(Source of Truth)としてGit管理できる

1Password、AWS、Bitwardenなどの外部パスワードマネージャーとの連携が可能

型安全なスキーマ定義(mspec DSL)により、環境変数の検証やエラー検知が行える

AIエージェントによるシークレットの誤取得(プロンプトインジェクション)を防止する

JavaScript、Python、Go、Rustなど、あらゆるプロジェクトと言語で動作する

オフラインでの利用不可や外部プロバイダー連携時の起動遅延などの課題も存在する

Timeline

Varlockの概要と.envファイルの課題解決

スピーカーはVarlockを、環境変数を平文でディスクに保存するリスクを排除するためのオープンソースツールとして紹介しています。従来の開発現場では、プロジェクト参加時に必要な.envファイルが不足していたり、更新のたびに共有が必要だったりする非効率なプロセスが課題でした。Varlockは実行時にシークレットをアプリケーションに直接注入することで、これらの管理上の手間を大幅に削減します。また、AIエージェントによる意図しない秘密情報の漏洩を防止するセキュリティ上の利点についても強調されています。これにより、設定ファイル自体をGitHubなどの公開リポジトリで安全に共有できるようになります。

スキーマ定義と基本的な使用方法

実際のプロジェクトでの活用例として、ポート番号の変更を例に基本的な操作手順が説明されています。信頼できる唯一の情報源となる「.env.schema」ファイルを作成し、「mspec」という独自のドメイン固有言語(DSL)を用いて設定を記述します。デコレータを使用して環境変数が機密情報かどうかを制御したり、型(string, number, portなど)を指定してバリデーションを行ったりする様子がデモされます。不適切な型や必須項目の欠落がある場合にはエラーが表示されるため、実行前に設定ミスを確実に防ぐことができます。これらの機能により、開発者は堅牢な環境変数管理システムをローカル環境に構築できます。

アプリケーションへの注入と多言語対応

定義した環境変数をアプリケーションに読み込ませるには、「varlock run」コマンドの後に実行コマンドを続けるだけで完了します。動画ではViteを使用したフロントエンドプロジェクトでの動作が示され、指定したポート番号が正しく反映されることが確認されています。Varlockの大きな特徴は、特定の言語に依存せずJavaScript、Python、Go、Rustなど幅広い開発環境で利用できる汎用性にあります。npm経由でのインストールのほか、スタンドアロンのCLIも用意されているため、プロジェクトの要件に合わせて柔軟に導入可能です。これにより、既存のプロジェクト構成を大きく変えることなく、セキュアな変数管理へ移行できます。

1Password等の外部マネージャーとの連携

より高度な機能として、APIキーなどの機密情報を1Passwordから直接取得するプラグインの設定方法が解説されています。特定のヴォルト(保管庫)に保存されたアイテムを、スキーマファイル内の関数呼び出しを通じて動的に参照する仕組みです。1Password以外にもAWS、GCP、Bitwardenといった主要なクラウドサービスやパスワードマネージャーのプラグインがサポートされています。指紋認証などの生体認証を利用してアクセス権限を解除する設定も可能で、セキュリティと利便性の両立が図られています。この方法を使えば、ローカルマシンに一切シークレットを置かずに開発を進めることが可能になります。

高度な機能、課題、および今後の展望

Varlockには、TypeScriptの型生成、CI/CD用のGitHub Action、ログからの機密情報マスキングなど、実務で役立つ豊富な機能が備わっています。一方で、オフライン環境での使用が制限される点や、外部プロバイダー経由の取得による起動の遅延といった現在の課題についても正直に述べられています。また、一部のパスワードマネージャーへの未対応や、ローカルシェル変数との優先順位に関するバグについても言及されています。しかし、活発な開発が続いていることから、スピーカーはこれらの問題が将来的に解決されることに期待を寄せています。最終的に、サイドプロジェクトを含む今後のすべての開発においてVarlockを積極的に採用していく意向を示して締めくくっています。

Community Posts

View all posts