アプリの構成の概念を確認する

完了

分散環境用のマイクロサービスを作成することは、大きな課題となります。 クラウドでホストされるマイクロサービスは、多くの場合、さまざまなリージョンの複数のコンテナーで実行されます。 各サービスのコードを構成から分離するソリューションを実装すると、すべての環境で問題のトリアージが容易になります。

このユニットでは、ASP.NET Core と Docker の構成機能を Azure App Configuration と統合して、効果的な方法でこの課題に取り組む方法について説明します。

次のことを確認します。

  • ASP.NET Core 構成インフラストラクチャ
  • Kubernetes 構成の抽象化 - ConfigMap。
  • Azure App Configuration サービス。
  • .NET 機能管理ライブラリ。
  • アプリに実装されている機能フラグ コンポーネント。

ASP.NET Core の構成

ASP.NET Core プロジェクトの構成は、1 つ以上の .NET 構成プロバイダーに含まれています構成プロバイダーは、JSON ファイルなどの特定の構成ソースに対する抽象化です。 構成ソースの値は、キーと値のペアのコレクションとして表されます。

ASP.NET Core アプリでは、複数の構成プロバイダーを登録して、さまざまなソースから設定を読み取ることができます。 既定のアプリケーション ホストでは、複数の構成プロバイダーが自動的に登録されます。 次の構成ソースは、一覧の順序で使用できます。

  1. JSON ファイル (appsettings.json)
  2. JSON ファイル (appsettings.{environment}.json)
  3. ユーザー シークレット
  4. 環境変数
  5. コマンドライン

各構成プロバイダーは、独自のキー値を提供できます。 さらに、任意のプロバイダーは、それ自体よりも前にチェーンに登録されたプロバイダーからの値をオーバーライドできます。 上記の一覧の登録順序を指定すると、 UseFeatureManagement コマンド ライン パラメーターは UseFeatureManagement 環境変数をオーバーライドします。 同様に、UseFeatureManagement内のappsettings.json キーは、UseFeatureManagementに格納されているappsettings.Development.json キーによってオーバーライドできます。

構成キー名は階層を記述できます。 たとえば、eShop:Store:SeasonalSale という表記は、eShop アプリの Store マイクロサービス内の SeasonalSale 機能を指します。 この構造体は、構成値をオブジェクト グラフまたは 配列にマップすることもできます。

重要

一部のプラットフォームでは、環境変数名のコロンがサポートされていません。 クロスプラットフォームの互換性を確保するために、キーを区切るためにコロン (__) の代わりに二重アンダースコア (:) が使用されます。 たとえば、 eShop__Store__SeasonalSale は、 eShop:Store:SeasonalSaleのクロスプラットフォームの同等の表記です。

ASP.NET Core では 、ConfigurationBinder を使用して、構成値をオブジェクトと配列にマップします。 キー名へのマッピングでは、大文字と小文字は区別されません。 たとえば、ConnectionStringconnectionstring は同等のキーとして扱われます。 詳細については、 キーと値を参照してください。

Docker の構成

Docker では、キーと値のペアのコレクションとして構成を処理するための抽象化の 1 つは、コンテナーの YAML ファイルの環境変数セクションです。 次のスニペットは、アプリの docker-compose.yml ファイルからの抜粋です。

services: 

  frontend:
    image: storeimage
    build:
      context: .
      dockerfile: DockerfileStore
    environment: 
      - ProductEndpoint=http://backend:8080
      - ConnectionStrings:AppConfig=Endpoint=https://eshop-app-features.azconfig.io;Id=<ID>;Secret=<SECRET>
    ports:
      - "32000:8080"
    depends_on: 
      - backend

ファイル スニペットでは、次のものが定義されています。

  • 前のスニペットで強調表示されているように、YAML ファイルの environment セクションに格納されている変数。
  • コンテナー化されたアプリに環境変数として表示されます。
  • マイクロサービス アプリで .NET 構成値を保持するメカニズム。

環境変数は、Docker コンテナーでホストされているアプリにランタイム構成を提供するためのクロスプラットフォーム メカニズムです。

Azure App Configuration

一元化された構成サービスは、マイクロサービス アプリやその他の分散アプリで特に役立ちます。 このモジュールでは、構成値 (特に機能フラグ) を一元的に管理するためのサービスとしての Azure App Configuration を導入します。 このサービスを使用すると、アプリを使用して構成をデプロイするときに発生するエラーのトラブルシューティングが容易になります。

App Configuration は、保存時と転送中の両方でキー値を暗号化するフル マネージド サービスです。 それに格納されている構成値は、アプリを再デプロイまたは再起動しなくても、リアルタイムで更新できます。

ASP.NET Core アプリでは、Azure App Configuration が構成プロバイダーとして登録されます。 プロバイダーの登録とは別に、アプリは App Configuration ストアについて認識しません。 構成値は、.NET の構成抽象化である IConfiguration インターフェイスを介してそれから取得できます。

機能管理ライブラリ

機能管理ライブラリには、アプリ内の機能フラグを管理するための標準化された .NET API が用意されています。 ライブラリは、 Microsoft.FeatureManagementMicrosoft.FeatureManagement.AspNetCore という名前の 2 つの異なるパッケージの形式で NuGet 経由で配布されます。 後者のパッケージは、ASP.NET Core プロジェクトの Razor ファイルで使用するためのタグ ヘルパーを提供します。 タグ ヘルパーが不要な場合や、ASP.NET Core プロジェクトで使用しない場合は、前のパッケージで十分です。

ライブラリは、 IConfigurationの上に構築されています。 このため、Azure App Configuration のプロバイダーを含むすべての .NET 構成プロバイダーと互換性があります。 ライブラリは Azure App Configuration から切り離されているため、構成プロバイダーを介して 2 つの統合が可能になります。 このライブラリと Azure App Configuration を組み合わせることで、サポート インフラストラクチャを実装せずに機能を動的に切り替えることができます。

Azure App Configuration との統合

Azure App Configuration と Feature Management ライブラリの統合を理解するには、ASP.NET Core プロジェクトの Program.cs ファイルからの次の抜粋を参照してください。

string connectionString = builder.Configuration.GetConnectionString("AppConfig");

// Load configuration from Azure App Configuration
builder.Configuration.AddAzureAppConfiguration(options => {
  options.Connect(connectionString)
    .UseFeatureFlags();
});

上記のコード フラグメントでは、次のようになります。

  • アプリの builder.Configuration メソッドは、Azure App Configuration ストアの構成プロバイダーを登録するために呼び出されます。 構成プロバイダーは、 AddAzureAppConfigurationの呼び出しによって登録されます。
  • Azure App Configuration プロバイダーの動作は、次のオプションで構成されます。
    • Connect メソッド呼び出しに渡された接続文字列を使用して、対応する Azure サービスに対して認証します。 接続文字列は、 connectionString 変数から取得されます。 登録された構成ソースは、 builder.Configurationを介して使用できるようになります。
    • UseFeatureFlagsの呼び出しを使用して、機能フラグのサポートを有効にします。
  • Azure App Configuration プロバイダーは、他の構成プロバイダーより後に登録されるため、他のすべての登録済み構成プロバイダーよりも優先されます。

ヒント

ASP.NET Core プロジェクトでは、configBuilder.Sources内の ConfigureAppConfiguration プロパティを分析することで、登録済みプロバイダーの一覧にアクセスできます。