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

完了

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

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

次のことを確認します。

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

ASP.NET Core 構成

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

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

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

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

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

重要

環境変数名でコロンを使用することがサポートされていないプラットフォームもあります。 クロスプラットフォームの互換性を確保するには、キーを区切るためにコロン (:) ではなく 2 つのアンダースコア (__) を使用します。 たとえば、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=QWQy;Secret=V/4r/rhg/0tdy2L/AmMfBUcgTrYC4krRC7uFqbjRvDU=
    ports:
      - "32000:8080"
    depends_on: 
      - backend

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

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

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

Azure App Configuration

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

App Configuration は、保存時と転送中の両方でキー値を暗号化するフル マネージド サービスです。 それと共に格納されている構成値はリアルタイムで更新することができ、アプリの再デプロイや再起動は必要ありません。

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

Feature Management ライブラリ

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

このライブラリは IConfiguration 上に構築されています。 このため、Azure App Configuration 用のプロバイダーを含む、すべての .NET 構成プロバイダーと互換性があります。 このライブラリは Azure App Configuration から切り離されているので、構成プロバイダーを使用して両者を統合することができます。 このライブラリと 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 プロジェクトでは、ConfigureAppConfiguration 内の configBuilder.Sources プロパティを分析することで、登録されているプロバイダーの一覧にアクセスできます。