Azure に Orleans アプリをデプロイしてスケーリングする
このクイックスタートでは、Azure Container Apps に Orleans URL 短縮アプリをデプロイしてスケーリングします。 ユーザーは完全な URL をアプリに送信できます。これにより、他のユーザーと共有できる短縮バージョンが返され、それらのユーザーが元のサイトにリダイレクトされます。 Orleans と Azure には、URL 短縮機能など、トラフィックの多いアプリをホストするために必要なスケーラビリティ機能が用意されています。 Orleans は、.NET をサポートする他のホスティング サービスとも互換性があります。
このクイックスタートの最後には、URL 短縮機能を提供するために、Azure で実行されるスケーラブルなアプリが用意されます。 学習内容は次のとおりです。
- Azure Developer CLI テンプレートをプルする
- Orleans アプリを Azure にデプロイする
- アプリを複数のインスタンスにスケーリングする
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
- Azure Developer CLI
- .NET 8
- Docker
サンプル アプリケーションを取得してデプロイする
サンプル アプリケーションは、Azure Developer CLI テンプレートとして使用できます。 このクイック スタートでは、テンプレート アプリケーションをプルし、テンプレートとサンプル コードを Azure にデプロイし、テンプレートを変更して必要に応じた永続化グレインを実装し、必要なリソースをデプロイしてから、最終的なアプリケーションをデプロイします。
空のディレクトリでターミナルを開きます。
azd auth login
を使って Azure Developer CLI に対して認証します。 ツールによって指示された手順に従って、任意の Azure 資格情報を使って CLI に対して認証します。azd auth login
AZD テンプレート
orleans-url-shortener
とazd init
コマンドを使用してサンプル アプリケーションを取得します。azd init --template orleans-url-shortener
初期化中に、一意の環境名を構成します。
ヒント
この環境名は、ターゲット リソース グループ名としても使用されます。 このクイックスタートでは、
msdocs-orleans-url-shortener
の使用を検討してください。azd up
を使って、Azure Cosmos DB for NoSQL アカウントをデプロイします。 Bicep テンプレートは、サンプル Web アプリケーションもデプロイします。azd up
プロビジョニング プロセス中に、サブスクリプションと目的の場所を選択します。 プロビジョニングとデプロイのプロセスが完了するまで待ちます。 このプロセスには 5 分ほどかかる可能性があります。
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.
コンソールで URL を使って、ブラウザーで Web アプリケーションに移動します。
ブラウザーのアドレス バーに
/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>" }
短縮された URL をアドレス バーに貼り付け、Enter キーを押します。 ページが再読み込みされ、指定した URL にリダイレクトされます。
追加のサービスをデプロイする
元のデプロイでは、URL 短縮アプリをホストするために必要な最小限のサービスのみがデプロイされました。 グレイン永続化のために Azure データ サービスを使用するには、まず、優先サービスをデプロイするようにテンプレートを構成する必要があります。
ターミナルを使って、
azd env set
を実行してDEPLOY_AZURE_TABLE_STORAGE
環境変数を構成し、Azure Cosmos DB for NoSQL のデプロイを有効にします。azd env set DEPLOY_AZURE_TABLE_STORAGE true
ターミナルを使って、
azd env set
を実行してDEPLOY_AZURE_COSMOS_DB_NOSQL
環境変数を構成し、Azure Cosmos DB for NoSQL のデプロイを有効にします。azd env set DEPLOY_AZURE_COSMOS_DB_NOSQL true
azd provision
を実行して、新しい構成でアプリケーション アーキテクチャを再デプロイします。 プロビジョニング プロセスが完了するまで待ちます。 このプロセスには 2 分ほどかかる場合があります。azd provision
ヒント
または、
azd up
をもう一度実行して、アーキテクチャのプロビジョニングとアプリケーションの再デプロイの両方を行うことができます。
NuGet パッケージのインストール
グレインを使用する前に、対応する Microsoft.Orleans.Clustering.*
および Microsoft.Orleans.Persistence.*
の NuGet パッケージをインストールする必要があります。 これらのサービスは、パスワードレス認証用にロールベースのアクセス制御を使用しているため、Azure.Identity
の NuGet パッケージもインポートする必要があります。
現在の作業ディレクトリを ./src/web/ に変更します。
cd ./src/web
dotnet add package
を使用して NuGet からAzure.Identity
パッケージをインポートします。dotnet add package Azure.Identity --version 1.*
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.*
dotnet add package
を使用して NuGet からAzure.Identity
パッケージをインポートします。dotnet add package Azure.Identity --version 1.*
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 のデータ サービスを使用して、よりスケーラブルで一元化された状態を使用するように構成できます。
次の
using
ディレクティブを追加します。using Azure.Identity; using Orleans.Configuration;
src/web/Program.cs ファイルで現在の
builder
構成コードを見つけて削除します。builder.Host.UseOrleans(static siloBuilder => { siloBuilder .UseLocalhostClustering() .AddMemoryGrainStorage("urls"); });
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"; }); }); }
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"; }); }); }
azd deploy
を実行して、アプリケーション コードを Docker コンテナーとして再デプロイします。 デプロイ プロセスが完了するまで待ちます。 このプロセスには 1 分ほどかかる場合があります。azd deploy
ヒント
または、
azd up
をもう一度実行して、アーキテクチャのプロビジョニングとアプリケーションの再デプロイの両方を行うことができます。
アプリの動作を確認する
再デプロイしたアプリケーションをもう一度使用し、データが格納される場所を確認して、更新したコードが動作することを検証します。
ブラウザーのアドレス バーに
/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>" }
短縮された URL をアドレス バーに貼り付け、Enter キーを押します。 ページが再読み込みされ、指定した URL にリダイレクトされます。
必要に応じて、クラスターと状態データが、作成したストレージ アカウントに想定どおりに格納されていることを確認できます。
Azure portal で、このクイックスタートでデプロイしたリソース グループに移動します。
重要
このクイック スタートで前に指定した環境名は、ターゲット リソース グループ名でもあります。
Azure ストレージ アカウントの概要ページに移動します。
ナビゲーションで、[ストレージ ブラウザー] を選択します。
[テーブル] ナビゲーション項目を展開すると、Orleans によって作成された 2 つのテーブルが表示されます。
OrleansGrainState: このテーブルには、URL リダイレクトを処理するためにアプリケーションによって使用される永続状態グレイン データが格納されます。
OrleansSiloInstances: このテーブルは、Orleans クラスターの重要なサイロ データを追跡します。
[OrleansGrainState] テーブルを選択します。 このテーブルには、テスト中にアプリによって永続化されたすべての URL リダイレクトの行エントリが保持されます。
Azure Cosmos DB for NoSQL アカウントの概要ページに移動します。
ナビゲーションで、[データ エクスプローラー] を選択します。
このガイドで前に作成した次のコンテナーを確認します。
OrleansStorage: このテーブルには、アプリケーションで URL リダイレクトを処理するために使用される永続的な状態グレイン データが格納されます。
OrleansCluster: このテーブルは、Orleans クラスターの重要なサイロ データを追跡します。
アプリをスケーリングする
Orleans は、分散アプリケーション向けに設計されています。 URL 短縮機能のような単純なアプリでも、Orleans のスケーラビリティの恩恵を受けることができます。 次の手順を使用して、複数のインスタンスにわたってアプリをスケーリングおよびテストすることができます。
このクイック スタートでデプロイしたリソース グループに戻ります。
Azure Container Apps アプリの概要ページに移動します。
ナビゲーションで、[スケール] を選択します。
[編集とデプロイ] を選択し、[スケール] タブに切り替えます。
スライダー コントロールを使用して、レプリカの最小値と最大値を 4 に設定します。 この値により、アプリが複数のインスタンスで実行されるようになります。
[作成] を選択して、新しいリビジョンをデプロイします。
デプロイが完了したら、前のセクションのテスト手順を繰り返します。 アプリは複数のインスタンスで引き続き想定どおりに動作し、より多くの要求を処理できるようになりました。
関連するコンテンツ
次のステップ
.NET