次の方法で共有


Azure に Orleans アプリをデプロイしてスケーリングする

このクイックスタートでは、Azure Container Apps に Orleans URL 短縮アプリをデプロイしてスケーリングします。 ユーザーは完全な URL をアプリに送信できます。これにより、他のユーザーと共有できる短縮バージョンが返され、それらのユーザーが元のサイトにリダイレクトされます。 Orleans と Azure には、URL 短縮機能など、トラフィックの多いアプリをホストするために必要なスケーラビリティ機能が用意されています。 Orleans は、.NET をサポートする他のホスティング サービスとも互換性があります。

このクイックスタートの最後には、URL 短縮機能を提供するために、Azure で実行されるスケーラブルなアプリが用意されます。 学習内容は次のとおりです。

  • Azure Developer CLI テンプレートをプルする
  • Orleans アプリを Azure にデプロイする
  • アプリを複数のインスタンスにスケーリングする

前提条件

サンプル アプリケーションを取得してデプロイする

サンプル アプリケーションは、Azure Developer CLI テンプレートとして使用できます。 このクイック スタートでは、テンプレート アプリケーションをプルし、テンプレートとサンプル コードを Azure にデプロイし、テンプレートを変更して必要に応じた永続化グレインを実装し、必要なリソースをデプロイしてから、最終的なアプリケーションをデプロイします。

  1. 空のディレクトリでターミナルを開きます。

  2. azd auth login を使って Azure Developer CLI に対して認証します。 ツールによって指示された手順に従って、任意の Azure 資格情報を使って CLI に対して認証します。

    azd auth login
    
  3. AZD テンプレート orleans-url-shortenerazd init コマンドを使用してサンプル アプリケーションを取得します。

    azd init --template orleans-url-shortener
    
  4. 初期化中に、一意の環境名を構成します。

    ヒント

    この環境名は、ターゲット リソース グループ名としても使用されます。 このクイックスタートでは、msdocs-orleans-url-shortener の使用を検討してください。

  5. azd up を使って、Azure Cosmos DB for NoSQL アカウントをデプロイします。 Bicep テンプレートは、サンプル Web アプリケーションもデプロイします。

    azd up
    
  6. プロビジョニング プロセス中に、サブスクリプションと目的の場所を選択します。 プロビジョニングとデプロイのプロセスが完了するまで待ちます。 このプロセスには 5 分ほどかかる可能性があります。

  7. Azure リソースのプロビジョニングが完了すると、実行中の Web アプリケーションへの URL が出力に含まれます。

    Deploying services (azd deploy)
    
      (✓) Done: Deploying service web
    - Endpoint: <https://[container-app-sub-domain].azurecontainerapps.io>
    
    SUCCESS: Your application was provisioned and deployed to Azure in 5 minutes 0 seconds.
    
  8. コンソールで URL を使って、ブラウザーで Web アプリケーションに移動します。

    実行中の URL 短縮 Web アプリケーションのスクリーンショット。

  9. ブラウザーのアドレス バーに /shorten?url=https://www.microsoft.com のような URL パスを追加して、shorten エンドポイントをテストします。 ページが再読み込みされ、末尾に短縮パスを含む新しい URL が提供されます。 新しい URL をクリップボードにコピーします。

    {
      "original": "https://www.microsoft.com",
      "shortened": "http://<container-app-name>.<deployment-name>.<region>.azurecontainerapps.io:<port>/go/<generated-id>"
    }
    
  10. 短縮された URL をアドレス バーに貼り付け、Enter キーを押します。 ページが再読み込みされ、指定した URL にリダイレクトされます。

追加のサービスをデプロイする

元のデプロイでは、URL 短縮アプリをホストするために必要な最小限のサービスのみがデプロイされました。 グレイン永続化のために Azure データ サービスを使用するには、まず、優先サービスをデプロイするようにテンプレートを構成する必要があります。

  1. ターミナルを使って、azd env set を実行して DEPLOY_AZURE_TABLE_STORAGE 環境変数を構成し、Azure Cosmos DB for NoSQL のデプロイを有効にします。

    azd env set DEPLOY_AZURE_TABLE_STORAGE true
    
  1. ターミナルを使って、azd env set を実行して DEPLOY_AZURE_COSMOS_DB_NOSQL 環境変数を構成し、Azure Cosmos DB for NoSQL のデプロイを有効にします。

    azd env set DEPLOY_AZURE_COSMOS_DB_NOSQL true
    
  1. azd provision を実行して、新しい構成でアプリケーション アーキテクチャを再デプロイします。 プロビジョニング プロセスが完了するまで待ちます。 このプロセスには 2 分ほどかかる場合があります。

    azd provision
    

    ヒント

    または、azd up をもう一度実行して、アーキテクチャのプロビジョニングとアプリケーションの再デプロイの両方を行うことができます。

NuGet パッケージのインストール

グレインを使用する前に、対応する Microsoft.Orleans.Clustering.* および Microsoft.Orleans.Persistence.* の NuGet パッケージをインストールする必要があります。 これらのサービスは、パスワードレス認証用にロールベースのアクセス制御を使用しているため、Azure.Identity の NuGet パッケージもインポートする必要があります。

  1. 現在の作業ディレクトリを ./src/web/ に変更します。

    cd ./src/web
    
  2. dotnet add package を使用して NuGet から Azure.Identity パッケージをインポートします。

    dotnet add package Azure.Identity --version 1.*
    
  3. Microsoft.Orleans.Clustering.AzureStorage および Microsoft.Orleans.Persistence.AzureStorage パッケージをインポートします。

    NuGet パッケージ
    クラスタリング Microsoft.Orleans.Clustering.AzureStorage
    永続化 Microsoft.Orleans.Persistence.AzureStorage
    dotnet add package Microsoft.Orleans.Clustering.AzureStorage --version 8.*
    dotnet add package Microsoft.Orleans.Persistence.AzureStorage --version 8.*
    
  1. dotnet add package を使用して NuGet から Azure.Identity パッケージをインポートします。

    dotnet add package Azure.Identity --version 1.*
    
  2. Microsoft.Orleans.Clustering.Cosmos および Microsoft.Orleans.Persistence.Cosmos パッケージをインポートします。

    NuGet パッケージ
    クラスタリング Microsoft.Orleans.Clustering.Cosmos
    永続化 Microsoft.Orleans.Persistence.Cosmos
    dotnet add package Microsoft.Orleans.Clustering.Cosmos --version 8.*
    dotnet add package Microsoft.Orleans.Persistence.Cosmos --version 8.*
    

サンプル アプリを構成して再デプロイする

サンプル アプリは現在、localhost クラスターを作成し、メモリにグレインを保持するように構成されています。 Azure でホストされている場合、Orleans は、Azure のデータ サービスを使用して、よりスケーラブルで一元化された状態を使用するように構成できます。

  1. 次の using ディレクティブを追加します。

    using Azure.Identity;
    using Orleans.Configuration;
    
  2. src/web/Program.cs ファイルで現在の builder 構成コードを見つけて削除します。

    builder.Host.UseOrleans(static siloBuilder =>
    {
        siloBuilder
            .UseLocalhostClustering()
            .AddMemoryGrainStorage("urls");
    });
    
  1. builder 構成を次の例に置き換えます。これは次の主要な概念を実装します。

    • ローカル開発シナリオと、Azure でホストされるシナリオの両方でアプリが正しく実行されるように、条件付き環境チェックが追加されます。
    • UseAzureStorageClustering メソッドにより、Azure Table Storage を使用するように Orleans クラスターが構成され、DefaultAzureCredential クラスを使用して認証が行われます。
    • Orleans クラスターに ID を割り当てるには、Configure メソッドを使用します。
      • ClusterID は、クライアントとサイロが相互に通信するためのクラスターの一意の ID です。
      • ClusterID は、デプロイ間で変更される可能性があります。
      • ServiceID は、Orleans によって内部的に使用されるアプリケーションの一意の ID であり、デプロイ間で一貫性を保つ必要があります。
    if (builder.Environment.IsDevelopment())
    {
        builder.Host.UseOrleans(static siloBuilder =>
        {
            siloBuilder
                .UseLocalhostClustering()
                .AddMemoryGrainStorage("urls");
        });
    }
    else
    {
        builder.Host.UseOrleans(siloBuilder =>
        {
            var endpoint = new Uri(builder.Configuration["AZURE_TABLE_STORAGE_ENDPOINT"]!);
            var credential = new DefaultAzureCredential();
    
            siloBuilder
                .UseAzureStorageClustering(options =>
                {
                    options.ConfigureTableServiceClient(endpoint, credential);
                })
                .AddAzureTableGrainStorage(name: "urls", options =>
                {
                    options.ConfigureTableServiceClient(endpoint, credential);
                })
                .Configure<ClusterOptions>(options =>
                {
                    options.ClusterId = "url-shortener";
                    options.ServiceId = "urls";
                });
        });
    }
    
  1. builder 構成を次の例に置き換えます。これは次の主要な概念を実装します。

    • ローカル開発シナリオと、Azure でホストされるシナリオの両方でアプリが正しく実行されるように、条件付き環境チェックが追加されます。
    • UseCosmosClustering メソッドにより、Azure Cosmos DB for NoSQL を使用するように Orleans クラスターが構成され、DefaultAzureCredential クラスを使用して認証が行われます。
    • Orleans クラスターに ID を割り当てるには、Configure メソッドを使用します。
      • ClusterID は、クライアントとサイロが相互に通信するためのクラスターの一意の ID です。
      • ClusterID は、デプロイ間で変更される可能性があります。
      • ServiceID は、Orleans によって内部的に使用されるアプリケーションの一意の ID であり、デプロイ間で一貫性を保つ必要があります。
    if (builder.Environment.IsDevelopment())
    {
        builder.Host.UseOrleans(static siloBuilder =>
        {
            siloBuilder
                .UseLocalhostClustering()
                .AddMemoryGrainStorage("urls");
        });
    }
    else
    {
        builder.Host.UseOrleans(siloBuilder =>
        {
            var endpoint = builder.Configuration["AZURE_COSMOS_DB_NOSQL_ENDPOINT"]!;
            var credential = new DefaultAzureCredential();
    
            siloBuilder
                .UseCosmosClustering(options =>
                {
                    options.ConfigureCosmosClient(endpoint, credential);
                })
                .AddCosmosGrainStorage(name: "urls", options =>
                {
                    options.ConfigureCosmosClient(endpoint, credential);
                })
                .Configure<ClusterOptions>(options =>
                {
                    options.ClusterId = "url-shortener";
                    options.ServiceId = "urls";
                });
        });
    }
    
  1. azd deploy を実行して、アプリケーション コードを Docker コンテナーとして再デプロイします。 デプロイ プロセスが完了するまで待ちます。 このプロセスには 1 分ほどかかる場合があります。

    azd deploy
    

    ヒント

    または、azd up をもう一度実行して、アーキテクチャのプロビジョニングとアプリケーションの再デプロイの両方を行うことができます。

アプリの動作を確認する

再デプロイしたアプリケーションをもう一度使用し、データが格納される場所を確認して、更新したコードが動作することを検証します。

  1. ブラウザーのアドレス バーに /shorten?url=https://learn.microsoft.com/dotnet/orleans のような URL パスを追加して、shorten エンドポイントをもう一度テストします。 ページが再読み込みされ、末尾に短縮パスを含む新しい URL が提供されます。 新しい URL をクリップボードにコピーします。

    {
      "original": "https://learn.microsoft.com/dotnet/orleans",
      "shortened": "http://<container-app-name>.<deployment-name>.<region>.azurecontainerapps.io:<port>/go/<generated-id>"
    }
    
  2. 短縮された URL をアドレス バーに貼り付け、Enter キーを押します。 ページが再読み込みされ、指定した URL にリダイレクトされます。

必要に応じて、クラスターと状態データが、作成したストレージ アカウントに想定どおりに格納されていることを確認できます。

  1. Azure portal で、このクイックスタートでデプロイしたリソース グループに移動します。

    重要

    このクイック スタートで前に指定した環境名は、ターゲット リソース グループ名でもあります。

  1. Azure ストレージ アカウントの概要ページに移動します。

  2. ナビゲーションで、[ストレージ ブラウザー] を選択します。

  3. [テーブル] ナビゲーション項目を展開すると、Orleans によって作成された 2 つのテーブルが表示されます。

    • OrleansGrainState: このテーブルには、URL リダイレクトを処理するためにアプリケーションによって使用される永続状態グレイン データが格納されます。

    • OrleansSiloInstances: このテーブルは、Orleans クラスターの重要なサイロ データを追跡します。

  4. [OrleansGrainState] テーブルを選択します。 このテーブルには、テスト中にアプリによって永続化されたすべての URL リダイレクトの行エントリが保持されます。

    Azure Table Storage の Orleans データを示すスクリーンショット。

  1. Azure Cosmos DB for NoSQL アカウントの概要ページに移動します。

  2. ナビゲーションで、[データ エクスプローラー] を選択します。

  3. このガイドで前に作成した次のコンテナーを確認します。

    • OrleansStorage: このテーブルには、アプリケーションで URL リダイレクトを処理するために使用される永続的な状態グレイン データが格納されます。

    • OrleansCluster: このテーブルは、Orleans クラスターの重要なサイロ データを追跡します。

アプリをスケーリングする

Orleans は、分散アプリケーション向けに設計されています。 URL 短縮機能のような単純なアプリでも、Orleans のスケーラビリティの恩恵を受けることができます。 次の手順を使用して、複数のインスタンスにわたってアプリをスケーリングおよびテストすることができます。

  1. このクイック スタートでデプロイしたリソース グループに戻ります。

  2. Azure Container Apps アプリの概要ページに移動します。

  3. ナビゲーションで、[スケール] を選択します。

  4. [編集とデプロイ] を選択し、[スケール] タブに切り替えます。

  5. スライダー コントロールを使用して、レプリカの最小値と最大値を 4 に設定します。 この値により、アプリが複数のインスタンスで実行されるようになります。

  6. [作成] を選択して、新しいリビジョンをデプロイします。

    Azure Container Apps アプリをスケーリングする方法を示すスクリーンショット。

  7. デプロイが完了したら、前のセクションのテスト手順を繰り返します。 アプリは複数のインスタンスで引き続き想定どおりに動作し、より多くの要求を処理できるようになりました。

次のステップ