次の方法で共有


チュートリアル: マルチコンテナー アプリを Azure Container Apps にデプロイする

Visual Studio を使用して、マルチコンテナー アプリを Azure Container Apps にデプロイできます。 通常は、各コンテナーを個別のコンテナー アプリ インスタンスにデプロイしますが、すべてのアプリのコンテナーを同じコンテナー アプリ環境に含め、簡単かつ安全に相互に通信できるようにします。 各コンテナー アプリは、コンテナー環境内からの要求を受け入れるか、外部トラフィックを許可するように構成できます。 Azure Container Apps は非常に柔軟で構成可能であり、可能なマイクロサービスのシナリオが多数あり、高度な監視ツールの完全なセットが可能です。 Docker Compose を使用してオンプレミスのコンテナー アプリを管理している場合は、Azure のコンテナー アプリ環境に移植することを検討してください。

このプロセスには、Visual Studio と Azure portal を使用するいくつかの手順が含まれます。 Azure CLI を使用してこれらのアクションを実行することもできますが、このチュートリアルの範囲外です。 最初に、マルチコンテナー アプリの作成を使用してビルドした アプリを使用し、 発行 プロセスを使用してデプロイします。 Visual Studio では、最初のコンテナー アプリ、コンテナー アプリ環境を作成する手順、およびコンテナー イメージを格納するコンテナー レジストリを作成する手順について説明します。 次に、他のコンテナー アプリで発行プロセスをもう一度実行します。 発行プロセスでは、特に同じコンテナー アプリ環境を選択する必要があります。 最後に、Azure Redis Cache サービスと連携するように Redis Cache を構成する必要があります。 キャッシュ構成コードを変更し、Web API を再発行します。 次に、アプリのシステム割り当てマネージド ID にキャッシュへのアクセスを許可するアクセス許可を構成します。

[前提条件]

  • Azure サブスクリプション。 無料試用版にサインアップします。
  • Azure 開発および Web 開発ワークロードがインストールされている Visual Studio 2022 以降。
  • https://github.com/MicrosoftDocs/vs-tutorial-samples フォルダー内のにある MulticontainerSample プロジェクト。 このサンプル ソリューションには、別の チュートリアルで作成した 2 つのプロジェクト (Web API バックエンドと ASP.NET Razor フロントエンド) が含まれています。 2 つのプロジェクトは、既定のテンプレートの非常に単純な変更であるため、そのチュートリアルに従って最初から作成することもできます。 Docker Compose の手順はスキップできます。

Web API バックエンドをデプロイする

  1. ソリューション エクスプローラーで、Web API プロジェクト ノードを右クリックし、[ 発行] を選択します。

  2. ターゲットの Azure を選択し、[ Azure Container Apps] を選択します。

  3. Azure サブスクリプションに関連付けられているアカウントでまだサインインしていない場合は、今すぐサインインするか、必要に応じてテナントを変更できます。

  4. コンテナー アプリを指定する画面で、[ 新規作成 ] を選択して新しいコンテナー アプリを作成します。

    発行プロセスの画面を示すスクリーンショット。Web API サービス用に既存のコンテナー アプリを指定するか、新しいコンテナー アプリを作成することを選択します。

  5. [ Azure Container App の作成 ] ページで、リソース グループなどの詳細を入力します。 この手順では、新しいリソース グループ、新しいコンテナー環境、および新しいコンテナー レジストリを作成します。

    新しいコンテナー アプリを作成する発行プロセスの画面を示すスクリーンショット。

    リソースの作成には少し時間がかかる場合があります。 完了したら、[ 次へ ] をクリックして次の手順に進みます。

  6. 次の手順では、コンテナー レジストリを作成します。 新しいコンテナー レジストリを作成する場合は、いくつかの詳細を求められます。 コンテナー アプリと同じリージョンとリソース グループを選択できます。

  7. 次の手順では、コンテナーのビルドの種類を選択するように求められます。 Dockerfile がない場合は .NET SDK を選択し、ない場合は Docker Desktop を 選択します。

    Docker Desktop が選択されているコンテナー のビルドの種類の選択を示すスクリーンショット。

  8. 展開の種類として、[ 発行] (pubxml ファイルの生成) を選択して発行プロファイルを作成します。

    デプロイの種類を選択し、pubxml ファイルに発行するオプションが選択されていることを示すスクリーンショット。

  9. [ 完了] を 選択して発行プロセスを完了し、発行プロファイルを作成します。 発行されたコンテナーにアクセスするための追加の構成に関するプロンプトが表示されたら、[ はい] を選択します。

    管理者ユーザー アクセス権を付与するかどうかを確認するメッセージが表示されます。

    Azure のアクティビティを示すページが表示され、閉じると、[発行] 画面にコンテナー アプリの情報 (Web API へのイングレスの URL など) が表示されます。

    発行プロセスが完了した後の [発行] 画面を示すスクリーンショット。

    [ 発行 ] ボタンをクリックして、Azure コンテナー アプリに発行します。 Visual Studio は、Azure リソースの作成を要求し、WebAPI コンテナー アプリの発行プロセスを開始します。

    Visual Studio では、新しいコンテナー アプリのページを読み込もうとすることがありますが、この段階では動作しません。

1 回発行したので、発行プロファイル (.pubxml ファイル) を作成したので、次回発行するときにこれらの手順を繰り返す必要はありません。 最初からやり直したり、指定した Azure リソースを変更したりする場合を除き、この画面の [ 発行 ] ボタンをクリックするだけです。

後で、Azure portal を使用してイングレスの構成を変更し、Azure Redis Cache をサポートしますが、最初に、次のセクションでは Web フロントエンドを発行します。

フロントエンドをデプロイする

  1. Index.cshtml.csのフロントエンド コード ファイルを変更して、Web API コンテナー アプリの新しい URL を参照します。 これは、[Web API 発行] 画面の [ リソース名 ] に表示される名前です。 コンテナー間通信では、完全修飾ドメイン名 (FQDN) とポート番号を指定せずに、コンテナー アプリの名前で HTTP を直接使用できます。 OnGet メソッドで、次のコードのように、Web API コンテナー アプリ名を参照するようにRequestUriを設定する既存の行を置き換えます。

     request.RequestUri = new Uri("http://<mywebapi-container-app-name>/Counter");
    
    
  2. ソリューション エクスプローラーで、Webfrontend プロジェクトのプロジェクト ノードを右クリックし、[発行] を選択 します。 次の画面で、[ 新規作成 ] を選択して新しいコンテナー アプリを作成します。

  3. [ 新しい Azure コンテナー アプリの作成 ] 画面で、Web API プロジェクトを発行したときに作成したのと同じリソース グループと同じコンテナー環境を選択します。

    Webfrontend 用に既存のコンテナーを指定するか、新しいコンテナーを作成する発行プロセスの画面を示すスクリーンショット。

  4. 重要! 前に作成したのと同じコンテナー レジストリを選択します。

    Webfrontend コンテナー アプリを作成する発行プロセスの画面を示すスクリーンショット。前に作成したのと同じコンテナー レジストリを選択してください。

  5. 他の手順で Web API に対して行ったのと同じオプションを選択します。 コンテナーのビルドの種類は Docker Desktop で、デプロイの種類は Publish (pubxml ファイルを生成) です

  6. [ 完了] を 選択して発行プロセスを完了し、発行プロファイルを作成します。 Azure でのアクティビティを示すページが表示され、それを閉じると、[発行] 画面にコンテナー アプリの情報 (Webfrontend アプリへのイングレスの URL など) が表示されるようになりました。

Azure portal でコンテナー アプリを表示して構成する

  1. Azure portal にサインインします。
  2. コンテナー アプリを検索し、先ほど作成したアプリを見つけます。
  3. [イングレス] を選択し、次のオプションを構成します。
    1. [ イングレス ] 画面で、 イングレス トラフィック[Container Apps Environment に制限] に設定します。 これは、Webfrontend のみが要求を送信できることを意味します。 発行プロセスを完了し、Visual Studio がページを読み込もうとすると、サービスにアクセスする代わりにブラウザーでエラーが発生するなど、Visual Studio でもこのサービスにアクセスできません。 これは想定されています。

    2. イングレス ポートを確認します (8080 である必要があります)。 Web API 呼び出しに HTTP を使用しており、要求 URI の名前でコンテナー アプリを直接参照できます。 Azure Container アプリによって生成される完全修飾ドメイン名 (FQDN) は HTTPS URL を使用します ( [発行 ] 画面の Visual Studio に表示されます)。ただし、内部トラフィックではそれがバイパスされる可能性があります。

    3. Webfrontend イングレスでは、既定値をそのまま使用できます。 ターゲット ポートは 8080 です。これは、イングレスが FQDN と HTTPS (または HTTP から HTTPS へのリダイレクト) を使用してすべての要求を安全に処理し、コンテナー ポート 8080 で HTTP を使用して Webfrontend に転送するためです。

Azure Redis Cache を作成する

コンテナー アプリと同じリソース グループに Azure Redis Cache を作成するには、次の手順に従います。

  1. Azure portal で、前に作成した Web API コンテナー アプリを開きます。 [Service Connector] 画面を開き、[作成] を選択します。 [ 接続の作成] セクションが表示されます。

  2. [ 接続の作成 ] 画面で、 サービスの種類 として Cache for Redis を入力し、[ 新規作成 ] を選択して新しい Redis キャッシュを作成します。

    Web API コンテナー アプリの [Service Connector] 画面を示すスクリーンショット。

  3. キャッシュを選択するか、[ 新しい作成 ] リンクに従ってキャッシュを作成します。 新しいキャッシュを作成する場合は、コンテナー アプリと Service Connector に戻り、前の手順を繰り返して接続を作成する必要があります。

  4. データベースの場合は、"0" を選択して、このキャッシュの最初の番号付きデータベースを作成します。

  5. [認証] タブに移動します。[システム割り当てマネージド ID] を選択します。 他のすべての既定値をそのまま使用し、[ 作成] を選択します。 これにより、キャッシュへの接続が作成されます。

  6. Web API コンテナー アプリの [Service Connector ] セクションに戻り、更新して新しく接続されたキャッシュ (まだ表示されていない場合) を確認し、キャッシュの横にあるチェック ボックスをオンにします。 [ 検証 ] を選択して、接続の状態を確認します。 キャッシュ ノードを展開して、その Azure キャッシュの環境変数の値を確認できます。 このチュートリアルでは、AZURE_REDIS_HOSTのみが必要ですが、他のコードは実際のコードで使用することも、より完全な構成に使用することもできます。 Web API がキャッシュに接続できるように、次のセクションで説明するように、Dockerfile で環境変数を設定するには、ここでの値を使用します。

詳細については、「 クイック スタート: Azure portal から Azure Container Apps のサービス接続を作成する」を参照してください。

マネージド ID のロールを構成する

Azure portal では、Azure Redis Cache の アクセス制御 (IAM) を使用して、コンテナー アプリのシステム割り当てマネージド ID への共同作成者アクセス権を付与します。

  1. Azure portal で、Azure Redis Cache のページを開き、 アクセス制御 (IAM) を選択します。
  2. [追加]>[ロール割り当ての追加] の順に選択します。 [ ロールの割り当ての追加] ページが開きます。
  3. [ メンバー ] タブを選択し、[ マネージド ID] を選択します
  4. [メンバーの選択] を選びます。 [ メンバーの選択] ページが開き、[ システム割り当てマネージド ID] を選択します
  5. [コンテナー アプリ] を選択し、Web API コンテナー アプリを選択します。
  6. [ ロール ] タブで、[ Redis Cache 共同作成者] を選択します。
  7. 「Review and assign」を選択します。 システムが要求を処理します。
  8. ロールの割り当てを開きRedis Cache 貢献者ロールの下にあるシステム割り当てマネージド ID を確認します。

次の手順では、 DefaultAzureCredentialを使用するように Web API クライアントのキャッシュ構成を変更します。これは、システム割り当てマネージド ID を使用するときに認証する推奨される方法です。 外部からアプリケーションにアクセスするユーザーは、この形式の ID 管理を使用してリソースにアクセスするために、特定のユーザー レベルのロールの割り当てを持っている必要はありません。 詳細については、「 Azure Redis Cache の統合 - システム割り当てマネージド ID」を参照してください。

Azure Redis Cache サービスを参照するように Web API プロジェクトを変更する

Azure で実行する Web API プロジェクトを発行する前に、Azure Redis Cache を参照するように更新し、マネージド ID を使用して安全にアクセスします。 これに対応するために、 Program.csでキャッシュ構成コードを変更できます。

Azure Redis Cache の場合は、接続情報を AZURE_REDIS_HOST 環境変数を設定し、スタートアップ コードで読み取って Azure Redis Cache に接続し、キャッシュを構成します。

Azure.Identityを使用して、マネージド ID でセキュリティで保護された認証を処理するDefaultAzureCredentialを取得します。

  1. Visual Studio の Web API プロジェクトで、NuGet パッケージの Azure IdentityMicrosoft.Azure.StackExchange.Redisへの参照を追加します。

  2. 追加したパッケージの using ディレクティブを追加します。

    using Azure.Identity;
    using Microsoft.Azure.StackExchange.Redis;
    
  3. Redis Cache の構成コードを更新します。 古いコードを削除し、次のコードに置き換えます。 後でコメントを確認し、独自のより高度なシナリオに合わせて任意のコードのコメントを解除できます。

     // Check the environment variable for the Redis cache host name
     var cacheHostName = Environment.GetEnvironmentVariable("AZURE_REDIS_HOST");
     if (string.IsNullOrEmpty(cacheHostName))
     {
         throw new InvalidOperationException("The environment variable 'AZURE_REDIS_HOST' is not set.");
     }
    
     var configurationOptions = ConfigurationOptions.Parse($"{cacheHostName}:6380");
    
     // For system-assigned identity.
     // In the Azure portal, we need to set up Redis service to grant Contributor access to the system-assigned identity
     // for the container app that hosts this Web API service.
     await configurationOptions.ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential());
    
     var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions);
    
     builder.Services.AddStackExchangeRedisCache(options =>
     {
         options.ConfigurationOptions = configurationOptions;
         options.InstanceName = "SampleInstance";
     });
    
     // Uncomment the following line if you need to use the ConnectionMultiplexer directly
     // (for example, for advanced Redis operations like Pub/Sub or working with Redis data structures).
     // builder.Services.AddSingleton<IConnectionMultiplexer>(sp =>
     //     ConnectionMultiplexer.Connect(configurationOptions));
    
    

    キャッシュ接続の作成時に前に設定した認証方法はシステム割り当てマネージド ID であるため、ここでのコードはその選択と一致します。 別の認証方法も使用する場合は、ここでコードを変更する必要があります。 「Azure Redis Cache の統合 - システム割り当てマネージド ID」を参照してください。

    Web API プロジェクトをビルドして、エラーがないことを確認します。

  4. Dockerfile がある場合は、Dockerfile の基本ステージを更新して、環境変数 AZURE_REDIS_HOSTを定義します。 ホストは、Azure portal から、Azure Redis Cache を作成するとき、またはポータルの Web API コンテナー アプリ ページの Service Connector セクションから取得します (前のセクションを参照)。

    ENV AZURE_REDIS_HOST mycache.redis.cache.windows.net
    

    (省略可能)環境変数には他の構成オプションを定義できます (通常は 6380 AZURE_REDIS_PORT など)。 わかりやすくするために、この値は環境変数を使用する代わりにハードコーディングされます。 ASPNETCORE_ENVIRONMENT開発に設定することもできます。

    .NET SDK コンテナーのビルドの種類 (Dockerfile を使用しない) を使用している場合は、の下の profiles > http で環境変数を設定できます。

     "http": {
       "commandName": "Project",
       "dotnetRunMessages": true,
       "launchBrowser": true,
       "launchUrl": "swagger",
       "applicationUrl": "http://localhost:5107",
       "environmentVariables": {
         "ASPNETCORE_ENVIRONMENT": "Development",
         "AZURE_REDIS_HOST": "cache11.redis.cache.windows.net"
       }
     }
    
  5. これらの変更を公開して確認する準備ができました。 [ 発行 ] 画面で [ 発行 ] ボタンを選択します。 Visual Studio はページの読み込みを試みますが、Web API コンテナー アプリがコンテナー アプリ環境の外部の要求にアクセスできないため、失敗します。

Azure Redis Cache でアプリケーションを実行する前に、キャッシュにアクセスするための適切なアクセス許可を持つマネージド ID を設定する必要があります。

アプリケーションをテストする

Webfrontend プロジェクトの 発行 画面に戻り、Webfrontend URL のリンクをクリックします。 ページを更新すると更新されるカウンターと共に Webfrontend アプリが表示されます。

ヒント

Azure Container Apps は、サービスのアップタイムを最大化することを目指しています。 サービスの1つに正常性プローブに失敗するなどの問題が発生した場合、Azure Container Apps はそれをアクティブなリビジョンとして設定せず、要求の処理にも使用しません。 その結果、開発とテストのプロセス中に、行った最新の変更がライブ サイトに反映されない場合があります。 Azure portal で [ リビジョンとレプリカ ] を選択し、最新の発行済みリビジョンの状態を表示します。 そこから、問題のトラブルシューティングに役立つログを開くことができます。

おめでとうございます! マルチコンテナー アプリを Azure Container Apps に発行し、コンテナー間の通信とアプリ内での Azure Redis Cache の使用を検証しました。

リソースをクリーンアップする

このチュートリアルで作成したリソースをクリーンアップするには、Azure portal に移動し、コンテナー アプリ、キャッシュ、コンテナー レジストリを含むリソース グループを削除します。

次のステップ

  • Azure Container Apps の詳細を確認します。
  • Azure の多様なリソースと統合する複雑なコンテナー化されたアプリとサービスをより簡単に開発するのに役立つテクノロジである .NET Aspire について説明します。 .NET Aspire は、開発時オーケストレーション、さまざまなサービスとの標準化された統合、および Visual Studio プロジェクト テンプレートを使用したツールサポートをサポートします。
  • Azure コマンド ライン インターフェイス (CLI) を使用して、コンテナー アプリを操作することもできます。 Azure CLI をインストールし、az containerapp up コマンドで Azure Container Apps をデプロイするに従って、Azure CLI コマンドを使用して Azure Container Apps の操作を開始します。