今日のアプリケーション開発における最もフラストレーションのたまる課題の 1 つが、環境のパリティです。 近年、Vagrant や Docker などの仮想化およびコンテナー化ツール (および ActiveState 自身の State Tool) は、アプリケーションのインフラストラクチャを動かすオペレーティング システムと依存関係が環境間で一貫していることを保証できますが、外部依存関係は非生産環境で複製することはほとんど不可能です。

サード パーティ依存関係がほぼすべてのソフトウェア プロジェクトのコア ビジネス ロジックと不可逆的に絡まっている世界においては、開発、ステージング、生産環境を互いに一貫させておくことがますます困難になってきています。 Amazon S3 に対する Minio のようなセルフホスティングのそっくりさんを持ついくつかの製品は、1 つのサービスの複数のデプロイメントを管理する痛みを軽減しますが、環境間の構成管理の課題を軽減することはほとんどありません。

Production, Staging, Development, Bob のローカル コンピューター、および QE 環境が、与えられたサービスの異なるデプロイメントを必要とするとき、構成ファイルを前後に渡したり、特定の環境がどのデプロイメントと話すべきかを決める複雑な条件文に頼ったりして、ますます非実際的になっています。 柔軟性の必要性は、大規模な環境におけるこれらのソリューションの難しさも浮き彫りにしています。 たとえば、Bob のローカル マシンがステージング環境用に予約されたサービスに一時的に応答する必要がある場合はどうでしょうか。

Environment Variables in Python

Cross-environment configuration は面倒ですが、幸いにも、上記の問題は近年では十分に一般化し、ほとんど解決されました。 オープンソース コミュニティのサポートと 12 ファクター アプリケーションのようなベストプラクティスの伝道のおかげで、近年、ファイルベースのアプリケーション設定管理から環境変数ベースの設定管理へとシフトしてきました。 より簡単に言えば、与えられたプロセスのコンテキスト外で管理される、アプリケーションに依存しない変数です。 環境変数を使用する主な利点は、開発者がコード行を変更せずに、アプリケーションがどのように実行されるかを定義できることです。

たとえば、Bob のローカル マシンが Staging 環境用に予約されている CDN サービスに話す必要がある場合、管理対象のコードには一切触れずに、Stage で定義されているものを反映するために CDN_URL 環境変数を変更することが可能です。 さらに重要なことに、これによって Bob は、ユニットテストおよび統合テストで使用するためのモックまたは内部サービスを定義することができ、すべて追加のコードを 1 行も書く必要がありません。

環境変数の定義

環境変数の定義行為は、一般に OS 依存ですが、大部分のプログラミング言語は、Python の dotenv プロジェクトなどの開発パッケージを使ってこれらの違いを抽象化しています。 たとえば、OS レベルで API_USER 環境変数を定義するのではなく、ローカルで gitignored された .env ファイルによって、開発環境間で環境変数を維持することができます。 これにより、開発者は環境変数の設定にローカルで管理された設定ファイルを利用でき、同時に非開発環境では「真の」環境変数による設定を可能にします。

例として、開発者がローカル環境で使用する単純な .env ファイルを示します。

環境変数の取得

環境変数がどのように定義されるかに関係なく、それらは常に os.getenv() メソッドを使用して Python で取得することができます。

Getting Started with Secrets

さて、環境変数は環境間で異なる設定を管理するための優れたソリューションですが、銀の弾丸ではありません。 今日の開発環境では、セキュリティは最優先事項であり、機密データは安全な方法で保管されなければなりません。

残念ながら、環境変数はそれ自体では安全ではありません。 環境変数は設定データを格納するのに優れた働きをしますが、パスワード、API キー、および暗号化キーのようなより機密性の高いデータを定義する方法は、より注意を払う必要があります。 そこで登場するのがシークレットだ。 シークレットは暗号化された状態で保存され、必要に応じて1回だけ実行されるため、データ漏洩の可能性を低くすることができます。 このようにして、ホスティング プロバイダーが危険にさらされたとしても、機密情報は厳重にロックされているので安心です。

作成する & State ツールで秘密を管理する

では、秘密を作成および管理するにはどうすればよいのでしょうか。 この問題に取り組むにはさまざまな方法がありますが、ActiveState の State Tool は Python 言語向けの優れたソリューションです。 virtualenvpipenvと同様に、State Toolは仮想環境管理インターフェースで、プロジェクト間でPythonのインストールや設定の相互汚染を防ぐことができます。 他の仮想環境管理ツールとの違いは、ActiveState プラットフォームとの統合により、環境構成と、そう、秘密を管理するための中央インターフェイスを可能にすることです。

State Tool の秘密管理機能を利用する前に、まず State Tool を使用して、プロジェクト ディレクトリ内に仮想環境をセットアップする必要があります。 これを行うには、まず、作業するActiveStateプロジェクトを特定します(このチュートリアルでは、無料のActiveState Platformアカウントを持っている限り、私のプロジェクトzachflower/envs-vs-secrets-demoを使用できますし、自分で作成することも可能です)。 次に、指定したプロジェクトに対して state activate コマンドを実行します。

$ state activate zachflower/envs-vs-secrets-demo Where would you like to checkout zachflower/envs-vs-secrets-demo? /home/zach/Projects/miscellaneous/activestate-variables/zachflower/envs-vs-secrets-demoActivating state: zachflower/envs-vs-secrets-demoThe State Tool is currently in beta, we are actively changing and adding features based on developer feedback.Downloading required artifactsDownloading 1 / 1 Installing 0 / 1 0 %You are now in an 'activated state', this will give you a virtual environment to work in that doesn't affect the rest of your system.Your 'activated state' allows you to define scripts, events and constants via the activestate.yaml file at the root of your project directory.To expand your language and/or package selection, or to define client-side encrypted secrets, please visit https://platform.activestate.com/zachflower/envs-vs-secrets-demo.To try out scripts with client-side encrypted secrets we've created a simple script for you in your activestate.yaml, try it out by running 'helloWorld'

ご覧のように、activate コマンドは ActiveState プロジェクトで定義されたとおりに仮想環境を設定します。 プロジェクトがまだ設定されていない場合は、デフォルトのパラメーターが設定されたシンプルなプロジェクトが作成され、すべてがどのように組み合わされるかの例が提供されます。 この設定は、プロジェクト・ディレクトリのルートにあるactivestate.yamlというファイルに保存されます。

秘密の設定ファイル & More

activestate.yaml ファイルは、アプリケーションが実行される開発ランタイムを定義します。 たとえば、デフォルトでは、secret を使用するシンプルなスクリプトと、定義されたイベントが発生するたびにアクションを実行するいくつかのイベント リスナーが定義されています:

project: https://platform.activestate.com/zachflower/envs-vs-secrets-demoscripts:# This script uses a secret. Note that you can define your own secrets at# https://platform.activestate.com/zachflower/envs-vs-secrets-demo/scripts - name: helloWorld value: echo ${secrets.user.world}events: # This is the ACTIVATE event, it will run whenever a new virtual environment is created (eg. by running `state activate`) # On Linux and macOS this will be ran as part of your shell's rc file, so you can use it to set up aliases, functions, environment variables, etc. - name: ACTIVATE constraints: os: macos,linux value: | echo "You are now in an 'activated state', this will give you a virtual environment to work in that doesn't affect the rest of your system." echo "" echo "Your 'activated state' allows you to define scripts, events and constants via the activestate.yaml file at the root of your project directory." echo "" echo "To expand your language and/or package selection, or to define client-side encrypted secrets, please visit https://platform.activestate.com/zachflower/envs-vs-secrets-demo." echo "" echo "To try out scripts with client-side encrypted secrets we've created a simple script for you in your activestate.yaml, try it out by running 'helloWorld'"

ここには特に画期的なものはありませんが、このファイルの潜在的なパワーはすぐに明らかになるはずです。 たとえば、次のスクリプトは、設定ファイルで secret を使用する方法の基本的な例です。

scripts:# This script uses a secret. Note that you can define your own secrets at# https://platform.activestate.com/zachflower/envs-vs-secrets-demo/scripts - name: helloWorld value: echo ${secrets.user.world}

helloWorld コマンドが (activated 状態から) 実行されると、user.world secret の値を表示し、その secret がまだ定義されていない場合は値を要求します。

$ helloWorldThe action you are taking uses a secret that has not been given a value yet.Name: worldDescription: - (This secret has no description, you can set one via the web dashboard)Scope: user (Only you can access the value) Please enter a value for secret "world": ******

Using Secrets

この例は比較的単純化されていますが、secret の真の価値は活性化イベントから得られるものです。 スクリプトのコンテキスト内で秘密の値を取得する代わりに、取得した秘密を使用して環境変数を定義することができ、この安全な環境の外部にそれらの秘密を決して公開することはありません。

project: https://platform.activestate.com/zachflower/envs-vs-secrets-demo?commitID=5fd1c161-c5a4-480c-8aba-29d8ab361b42events: - name: ACTIVATE constraints: os: macos,linux value: | export WORLD=${secrets.user.world}

さて、もし user.world シークレットが定義されていれば、WORLD 環境変数が定義され、他の環境変数と同様に取得することができます:

$ echo $WORLDworld!

しかし、もし定義されていなければ、ユーザーは ActiveState 仮想環境のアクティブ化時にそれを定義するかどうかを尋ねられるでしょう:

The action you are taking uses a secret that has not been given a value yet.Name: helloDescription: - (This secret has no description, you can set one via the web dashboard)Scope: user (Only you can access the value) Please enter a value for secret "world": ******

素晴らしいでしょう?

さらに詳しく

アプリケーション開発における構成管理は、ほとんどの場合、解決された問題ですが、機密管理はまだです。 バージョン コントロール リポジトリに機密データをチェックしたプロジェクトの数は驚異的で、非常に尊敬されている企業でさえ行っていることですが、適切なセキュリティ衛生と ActiveState の State Tool のような製品の使用により、機密の構成データを安全かつセキュアに保つことは、日に日に容易になってきています。

  • ActiveState Platformの無料アカウントを作成し、秘密管理を簡素化するState Toolをダウンロードして、ご自身で試してみてください。
  • State Tool を使用して共有シークレットを管理する方法についての Web セミナーもご覧ください

関連ブログ:

The Secret to Manage Shared Secrets

開発者はセキュリティを犠牲にせずに迅速かつ簡単にシークレットの共有ができる

コメントを残す

メールアドレスが公開されることはありません。