ほとんどの場合、次のように、開発アプリケーションの構成をプロジェクトのルートディレクトリに保存します。
app
|-- config.json
しかし、この設定はバージョン管理システムに保存されるため、これは最善のアプローチではないようです。ユーザー名、パスワードなどの機密情報が漏洩する可能性があります。
12 Factor App ガイドでは、構成ファイルをすべて削除し、構成設定に環境変数を使用することを推奨しています。
...設定を環境変数に保存します。環境変数は、コードを変更せずにデプロイ間で簡単に変更できます。構成ファイルとは異なり、誤ってコードリポジトリにチェックインされる可能性はほとんどありません。カスタム構成ファイル、またはJavaシステムプロパティ)などの他の構成メカニズムとは異なり、言語やOSに依存しない標準です。
それは私には本当にいいように聞こえますが、ソース環境にチェックインせずに、環境変数をどこに保存しますか?また、これらの変数をアプリに渡すためにどのツールを使用できますか?何十もの設定オプションが存在する可能性があり、アプリを起動するたびに手動で入力するのはいいことではありません。そのため、これらのファイルはある種のファイルに保存する必要があります。したがって、上記のファイルはソース管理になり、元の場所に戻ります。
構成オプションを処理する一般的に受け入れられている方法はありますか?ローカル制御をソース管理に保存するリスクがありませんか?
おそらくこれに対する良い答えはありません。このデータはいつか災害復旧の目的で必要になるため、安全な場所に保管する必要があるようです。これは、環境変数を設定するプロパティファイルとスクリプトにも同様に適用されます。
現在、この問題の解決策を検討しており、アクセスが制限されたコードリポジトリを利用しています。このリポジトリには、構成データのみが含まれます。他の人が共有する経験がありますか?
問題と考えられる解決策を検討する際に、方法を使用するのに役立ちます Jeff Atwoodによって人気が高くなります :神が機密の構成情報を保存する方法を作成するとしたら、彼はそれをどのように実行しますか?
まあ、彼は誰が設定情報を必要としているかを知っていて、それをそれらの人々にだけ与えるでしょう、そしてその情報は他の誰からもアクセスされることが決してできなかったでしょう。
最初の部分はすでに処理されているはずです。ソース管理システムがユーザーを認証する必要があります。そして、このアプローチは、 トロイハントのソース管理の10の戒め 、「依存関係はソース管理にある必要がある」の#10に従って有効性も与えられます。
しかし、もしそれが漏洩した場合、それを安全に保つには?まあ、プレーンテキストで保存する必要はありません。 暗号化を使用します。.NETでは、 設定ファイルの接続文字列データを暗号化するために実行できる手順があります 。選択した特定のテクノロジでこれを行うには、同等の方法を見つける必要があります。
多くの人々はソースコードと一緒に通常のファイルに設定を保存することを批判しますが、私の経験では、これは実際にはかなり良い解決策です:
そのため、多くの場合、コードとともにソース管理に格納されているテキスト構成が適切な出発点です。
分散システムを使用している場合、またはアプリケーションを再デプロイせずに構成をホットスワップできるようにしたい場合は、構成サーバーを中心にしたソリューションが見つかるかもしれません。 Spring Cloudには このようなメカニズムのサポート があり、バックエンドのサービス構成はgitリポジトリまたは Eureka にすることができます。また、たとえば、 Zookeeper 。これらのアプローチのいずれかを使用すると、ソフトウェアを再構築して再展開する必要なく、多くのサーバーで一貫した構成を管理して構成を更新することが容易になります。もちろん、これにはコストがかかります。これには、構成サーバーと、それをアプリケーションから使用する方法と、デプロイおよび保守する別のシステムが含まれます。
私は私が働いているのと同じ問題と闘っています。現在、すべての構成はファイルベースであり、それらを使用する個々のアプリケーションでソース管理されています。これは複製につながり、開発者は開発だけでなく本番/ QAパスワードにアクセスできます。
そうは言っても、これからは良い解決策を考え出したと思います。設定ファイルを別のgitリポジトリ(config repoというラベル)に移動しています。次に、渡されたプロファイルに基づいて構成リポジトリからファイルを提供するだけのspring-cloud-config(Java)サーバーを設定します。これは、Javaアプリケーションに最適です。PHP/ Java以外のアプリの場合、ファイルを直接プルダウンします(理想的ではありません)。 PHPアプリケーションが独自に設定をダウンロードしてどこかにキャッシュできるようにする何かを書くかもしれませんが、最初の実行では優先度は高くありません。この解決策は設定- 12要素のアプリの推奨事項に明示的に違反しないサービスとして。
私はzookeeperも同じように使用できると思います(kubernetes + zookeeperを使用した設定を見ました)ので、その答えが上記の-1になった理由はよくわかりません。
リンク:
構成全体を1つのファイルに保存する代わりに、複数のファイルに保存します。
README*
以外のすべてのファイルは、構成ファイルとして解釈されます。01-logging.json
。 02-database.json
など.最寄りのLinuxボックスで、/etc/sudoers.d
または/etc/nginx/conf.d
をご覧ください。同じパターンを示しています。
秘密の管理は別の獣です。あなたは小さい間、あなたはそれらを手動のステップとして管理することができます。 Zookeeperなどを使用できます。 シークレットをVCSにチェックインする暗号化された形式 で、展開手順としてそれらを復号化することもできます。他にもいくつかのオプションがあります。
(また、意見の一部:コメントを許可しないため、JSONは良い構成ファイル形式ではありません。コメントは非常に重要です。TOML、YAML、さらにはINI形式のほうが実用的です。 )
あなたのオプションはあなたが展開しているOSによってある程度定義されていると思います
はい、値をソース管理に入れます。ただし、「dev」バージョンのみ。ソースコードをコンパイルして動作させたい!余分な秘密の手順を含まない
ビルドとデプロイのプロセスでは、デプロイメント中にこれらの値を環境ごとに交換する必要があります。 (タコはこの種のモデルを持っています)
Apache zookeeperは、分散システムのアプリケーション構成を保存するための素晴らしいオプションを提供します。飼育係で行われた変更は、アプリケーション側に学芸員または飼育係のリスナーを置くことで、キャプチャおよび処理できます。