Azure Service Bus のトピックとサブスクリプションの概要 (.NET)
このクイックスタートでは、Azure.Messaging.ServiceBus .NET ライブラリを使用して、Service Bus トピックにメッセージを送信し、トピックへのサブスクリプションからメッセージを受信する方法について説明します。
このクイックスタートでは、次の手順を実行します。
- Azure Portal を使用して Service Bus 名前空間を作成する。
- Azure Portal を使用して Service Bus トピックを作成する。
- そのトピックに対する Service Bus サブスクリプションを Azure Portal で作成する。
- トピックに一連のメッセージを送信するための .NET コンソール アプリケーションを作成する。
- それらのメッセージをサブスクリプションから受信する .NET コンソール アプリケーションを作成する。
Note
このクイック スタートでは、メッセージのバッチを Service Bus トピックに送信し、それらのメッセージをトピックのサブスクリプションから受信するという単純なシナリオを実装する手順を説明します。 その他のシナリオや高度なシナリオのサンプルについては、GitHub の Service Bus .NET サンプルを参照してください。
- このクイック スタートでは、Azure Service Bus に接続する 2 つの方法である、接続文字列とパスワードレスについて説明します。 1 番目のオプションとして、接続文字列を使用して Service Bus 名前空間に接続する方法について説明します。 2 番目のオプションは、Microsoft Entra ID のセキュリティ プリンシパルとロールベースのアクセス制御 (RBAC) を使用して Service Bus 名前空間に接続する方法を示しています。 コードや構成ファイル、または Azure Key Vault などのセキュリティで保護されたストレージに、ハードコーディングされた接続文字列を含める心配はありません。 Azure を初めて使用する場合は、接続文字列オプションの方が理解しやすいかもしれません。 実際のアプリケーションと運用環境では、パスワードレス オプションを使用することをお勧めします。 詳細については、「認証と承認」を参照してください。
前提条件
このサービスを初めて使用する場合は、このクイックスタートを実行する前に、
- Azure サブスクリプション。 Azure Service Bus など、Azure の各種サービスを使用するには、サブスクリプションが必要です。 Azure アカウントを持っていない場合、無料試用版でサインアップできます。
- Visual Studio 2022. サンプル アプリケーションでは、C# 10 で導入された新機能を利用しています。 前のバージョンの C# 言語で Service Bus クライアント ライブラリを使用することもできますが、構文は異なる場合があります。 最新の構文を使用するには、.NET 6.0 以降をインストールし、言語バージョンを
latest
に設定することをお勧めします。 Visual Studio を使用している場合、Visual Studio 2022 より前のバージョンには、C# 10 プロジェクトをビルドするために必要なツールとの互換性がありません。
Azure Portal での名前空間の作成
Azure の Service Bus メッセージング エンティティを使用するには、Azure 全体で一意となる名前を備えた名前空間を最初に作成しておく必要があります。 名前空間により、ご利用のアプリケーション内に Service Bus リソース (キュー、トピックなど) 用のスコープ コンテナーが提供されます。
名前空間を作成するには:
Azure portal にサインインします。
[すべてのサービス] ページに移動します。
左側のナビゲーション バーで、カテゴリの一覧から [統合] を選択し、[Service Bus] 上にマウス ポインターを置き、[Service Bus] タイルの [+] ボタンを選択します。
[名前空間の作成] ページの [基本] タブで、こちらの手順を実行します。
[サブスクリプション] で、名前空間を作成する Azure サブスクリプションを選択します。
[リソース グループ] で、名前空間を追加する既存のリソース グループを選択するか、新しいリソース グループを作成します。
名前空間の名前を入力します。 名前空間名は次の名前付け規則に従う必要があります。
- この名前は Azure 全体で一意である必要があります。 その名前が使用できるかどうかがすぐに自動で確認されます。
- 名前の長さは 6 ~ 50 文字である。
- この名前には、文字、数字、ハイフン "-" のみを含めることができます。
- 名前の先頭は文字、末尾は文字または数字にする必要があります。
- 名前の末尾は “-sb“ または “-mgmt“ にはできません。
[場所] で、名前空間をホストするリージョンを選択します。
[価格レベル] で、名前空間の価格レベル (Basic、Standard、Premium) を選択します。 このクイック スタートでは、 [Standard] を選択します。
重要
トピックとサブスクリプションを使用する場合は、Standard または Premium を選択してください。 Basic 価格レベルでは、トピックとサブスクリプションはサポートされていません。
[Premium] 価格レベルを選択した場合は、メッセージング ユニットの数を指定します。 Premium レベルでは、各ワークロードが分離した状態で実行されるように、CPU とメモリのレベルでリソースが分離されます。 このリソースのコンテナーをメッセージング ユニットと呼びます。 Premium 名前空間には、少なくとも 1 つのメッセージング ユニットがあります。 Service Bus の Premium 名前空間ごとに、1 個、2 個、4 個、8 個、または 16 個のメッセージング ユニットを選択できます。 詳細については、Service Bus の Premium メッセージングに関するページをご覧ください。
ページ下部にある [確認と作成] を選択します。
[確認および作成] ページで、設定を確認し、 [作成] を選択します。
リソースのデプロイが成功したら、デプロイ ページで [リソースに移動] を選択します。
Service Bus 名前空間のホーム ページが表示されます。
Azure Portal を使用したトピックの作成
[Service Bus 名前空間] ページで、左側のメニューの [トピック] を選択します。
ツール バーの [+ トピック] を選択します。
トピックの名前を入力します。 他のオプションは既定値のままにしてください。
[作成] を選択します。
トピックに対するサブスクリプションの作成
前のセクションで作成したトピックを選択します。
[Service Bus トピック] ページで、ツール バーの [+ サブスクリプション] を選択します。
[サブスクリプションの作成] ページで、次の手順に従います。
サブスクリプションの名前として「S1」と入力します。
[最大配信数] に「3」と入力します。
次に、 [作成] を選択してサブスクリプションを作成します。
Azure に対してアプリを認証する
このクイック スタートでは、Azure Service Bus に接続する 2 つの方法である、パスワードレスと接続文字列について説明します。
最初のオプションでは、Microsoft Entra ID とロールベースのアクセス制御 (RBAC) でセキュリティ プリンシパルを使用して Service Bus 名前空間に接続する方法を示します。 コードや構成ファイル、または Azure Key Vault などのセキュリティで保護されたストレージに、ハードコーディングされた接続文字列を含める心配はありません。
2 番目のオプションでは、接続文字列を使用して Service Bus 名前空間に接続する方法を示します。 Azure を初めて使用する場合は、接続文字列オプションの方が理解しやすいかもしれません。 実際のアプリケーションと運用環境では、パスワードレス オプションを使用することをお勧めします。 詳細については、「認証と承認」を参照してください。 パスワードレス認証の詳細については、概要ページを参照してください。
Microsoft Entra ユーザーにロールを割り当てる
ローカルでの開発時には、Azure Service Bus に接続するユーザー アカウントに正しいアクセス許可があることを確認してください。 メッセージを送受信するには、Azure Service Bus データ所有者ロールが必要です。 このロールを自分に割り当てるには、ユーザー アクセス管理者ロール、または Microsoft.Authorization/roleAssignments/write
アクションを含む別のロールが必要です。 Azure portal、Azure CLI、または Azure PowerShell を使用して、ユーザーに Azure RBAC ロールを割り当てることができます。 ロールの割り当てに使用できるスコープの詳細は、スコープの概要ページを参照してください。
次の例では、ユーザー アカウントに、Azure Service Bus Data Owner
ロールを割り当てます。これにより、Azure Service Bus リソースへのフル アクセスが提供されます。 実際のシナリオでは、より安全な運用環境を実現するため、最小限の特権の原則に従って、必要な最小限のアクセス許可のみをユーザーに付与します。
Azure Service Bus 用の Azure 組み込みロール
Azure Service Bus の場合、名前空間およびそれに関連するすべてのリソースの Azure portal および Azure リソース管理 API による管理は、Azure RBAC モデルを使って既に保護されています。 Azure では、Service Bus 名前空間へのアクセスを承認するための次の Azure 組み込みロールが提供されています。
- Azure Service Bus データ所有者:Service Bus 名前空間とそのエンティティ (キュー、トピック、サブスクリプション、およびフィルター) へのデータ アクセスが可能です。 このロールのメンバーは、キューまたはトピックやサブスクリプションとの間でメッセージを送受信できます。
- Azure Service Bus データ送信者: このロールを使用して、Service Bus 名前空間とそのエンティティへの送信アクセスを許可します。
- Azure Service Bus データ受信者: このロールを使用して、Service Bus 名前空間とそのエンティティへの受信アクセスを許可します。
カスタム ロールを作成する場合は、Service Bus 操作に必要な権限に関するページを参照してください。
Microsoft Entra ユーザーを Azure Service Bus 所有者ロールに追加する
Microsoft Entra ユーザー名を、Service Bus 名前空間レベルの Azure Service Bus データ所有者ロール に追加します。 これにより、ユーザー アカウントのコンテキストで実行されているアプリがキューまたはトピックにメッセージを送信し、キューまたはトピックのサブスクリプションからメッセージを受信できるようになります。
重要
ほとんどの場合、ロールの割り当てが Azure に反映されるまでの時間は 1、2 分です。 まれに、最大 8 分かかる場合があります。 初めてコードを実行したときに認証エラーを受け取る場合は、しばらく待ってから再試行してください。
Azure portal で Service Bus 名前空間ページが開いていない場合は、メイン検索バーまたは左側のナビゲーションを使用して Service Bus 名前空間を見つけます。
概要ページで、左側のメニューから [アクセス制御 (IAM)] を選択します。
[アクセス制御 (IAM)] ページで、[ロールの割り当て] タブを選びます。
上部のメニューから [+ 追加] を選択し、次に結果のドロップダウン メニューから [ロールの割り当ての追加] を選択します。
検索ボックスを使って、結果を目的のロールに絞り込みます。 この例では、
Azure Service Bus Data Owner
を検索して一致する結果を選択します。 [次へ] を選びます。[アクセスの割り当て先] で、[ユーザー、グループ、またはサービス プリンシパル] を選び、[+ メンバーの選択] を選びます。
ダイアログで、自分の Microsoft Entra ユーザー名 (通常は user@domain メール アドレス) を検索し、ダイアログの下部にある [選択] を選びます。
[レビューと割り当て] を選んで最終ページに移動し、もう一度 [レビューと割り当て] を行ってプロセスを完了します。
Visual Studio を起動して Azure にサインインする
次の手順を使用して、Service Bus 名前空間へのアクセスを承認できます。
Visual Studio を起動します。 [作業の開始] ウィンドウが表示されたら、右側のウィンドウで [コードなしで続行] リンクを選択します。
Visual Studio の右上隅にある [サインイン] ボタンを選びます。
以前にロールを割り当てた Microsoft Entra アカウントを使用してサインインします。
トピックにメッセージを送信する
このセクションでは、Service Bus トピックにメッセージを送信する .NET コンソール アプリケーションを作成する方法を示します。
Note
このクイック スタートでは、メッセージのバッチを Service Bus トピックに送信し、それらのメッセージをトピックのサブスクリプションから受信するという単純なシナリオを実装する手順を説明します。 その他のシナリオや高度なシナリオのサンプルについては、GitHub の Service Bus .NET サンプルを参照してください。
コンソール アプリケーションの作成
- Visual Studio で、[ファイル] ->[新規作成] ->[プロジェクト] メニューを選択します。
** [新しいプロジェクトの作成]** ダイアログ ボックスで、次の手順に従います。このダイアログ ボックスが表示されない場合は、メニューで** [ファイル]** 、** [新規]** 、** [プロジェクト]** の順に選択します。プログラミング言語として
** [C#]** を選択します。アプリケーションの種類として [コンソール] を選択します。
結果の一覧から [コンソール アプリ] を選択します。
次に、 [次へ] を選択します。
- プロジェクト名に「
** TopicSender** 」、ソリューション名に「** ServiceBusTopicQuickStart** 」と入力し、** [次へ]** を選択します。 - [追加情報] ページで、 [作成] を選択してソリューションとプロジェクトを作成します。
NuGet パッケージをプロジェクトに追加する
メニューから [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。
次のコマンドを実行して、Azure.Messaging.ServiceBus NuGet パッケージをインストールします。
Install-Package Azure.Messaging.ServiceBus
次のコマンドを実行して、Azure.Identity NuGet パッケージをインストールします。
Install-Package Azure.Identity
トピックにメッセージを送信するためのコードを追加する
Program.cs の内容を次のコードに置き換えます。 重要な手順の概要をこのセクションに示します。コード コメントに追加情報が記載されています。
DefaultAzureCredential
オブジェクトを使用して ServiceBusClient オブジェクトを作成します。DefaultAzureCredential
によって、Visual Studio サインインの資格情報が自動的に検出および使用されて、Azure Service Bus に対する認証が行われます。`ServiceBusClient` オブジェクトで[ CreateSender](/dotnet/api/azure.messaging.servicebus.servicebusclient.createsender) メソッドを呼び出して、特定の Service Bus トピックに対して[ ServiceBusSender](/dotnet/api/azure.messaging.servicebus.servicebussender) オブジェクトを作成します。[ ServiceBusSender.CreateMessageBatchAsync](/dotnet/api/azure.messaging.servicebus.servicebussender.createmessagebatchasync) を使用して[ ServiceBusMessageBatch](/dotnet/api/azure.messaging.servicebus.servicebusmessagebatch) オブジェクトを作成します。- ServiceBusMessageBatch.TryAddMessage を使用して、メッセージをバッチに追加します。
[ ServiceBusSender.SendMessagesAsync](/dotnet/api/azure.messaging.servicebus.servicebussender.sendmessagesasync) メソッドを使用して、メッセージのバッチを Service Bus トピックに送信します。
重要
コード スニペット内のプレースホルダー値 (
<NAMESPACE-NAME>
と<TOPIC-NAME>
) を、Service Bus の名前空間とトピックの名前に置き換えて更新します。using System.Threading.Tasks; using Azure.Messaging.ServiceBus; using Azure.Identity; // the client that owns the connection and can be used to create senders and receivers ServiceBusClient client; // the sender used to publish messages to the topic ServiceBusSender sender; // number of messages to be sent to the topic const int numOfMessages = 3; // The Service Bus client types are safe to cache and use as a singleton for the lifetime // of the application, which is best practice when messages are being published or read // regularly. //TODO: Replace the "<NAMESPACE-NAME>" and "<TOPIC-NAME>" placeholders. client = new ServiceBusClient( "<NAMESPACE-NAME>.servicebus.windows.net", new DefaultAzureCredential()); sender = client.CreateSender("<TOPIC-NAME>"); // create a batch using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync(); for (int i = 1; i <= numOfMessages; i++) { // try adding a message to the batch if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}"))) { // if it is too large for the batch throw new Exception($"The message {i} is too large to fit in the batch."); } } try { // Use the producer client to send the batch of messages to the Service Bus topic await sender.SendMessagesAsync(messageBatch); Console.WriteLine($"A batch of {numOfMessages} messages has been published to the topic."); } finally { // Calling DisposeAsync on client types is required to ensure that network // resources and other unmanaged objects are properly cleaned up. await sender.DisposeAsync(); await client.DisposeAsync(); } Console.WriteLine("Press any key to end the application"); Console.ReadKey();
プロジェクトをビルドし、エラーがないことを確認します。
プログラムを実行し、確認メッセージが表示されるまで待ちます。
A batch of 3 messages has been published to the topic
重要
ほとんどの場合、ロールの割り当てが Azure に反映されるまでの時間は 1、2 分です。 まれに、最大で 8 分かかる場合があります。 初めてコードを実行したときに認証エラーを受け取る場合は、しばらく待ってから再試行してください。
Azure portal で次の手順を実行します。
自分の Service Bus 名前空間に移動します。
** [概要]** ページ中央下のペインで、** [トピック]** タブに切り替えてから、Service Bus トピックを選択します。 次の例では、`mytopic` になっています。** [Service Bus トピック]** ページ下部の** [Metrics](メトリック)** セクションの** [メッセージ]** グラフで、トピックに 3 つの受信メッセージがあることがわかります。 値が表示されない場合は、数分待ってページを最新の情報に更新すると、最新のグラフが表示されます。下のペインでサブスクリプションを選択します。 次の例では、
** S1** になっています。** [Service Bus Subscription](Service Bus サブスクリプション)** ページには、** [アクティブなメッセージ数]** が** 3** と表示されます。 トピックに送信した 3 つのメッセージはサブスクリプションで受信されています。しかし、それらはどの受信者によっても取り出されていません。
サブスクリプションからメッセージを受信する
このセクションでは、サブスクリプションから Service Bus トピックへのメッセージを受信する .NET コンソール アプリケーションを作成します。
Note
このクイック スタートでは、メッセージのバッチを Service Bus トピックに送信し、それらのメッセージをトピックのサブスクリプションから受信するという単純なシナリオを実装する手順を説明します。 その他のシナリオや高度なシナリオのサンプルについては、GitHub の Service Bus .NET サンプルを参照してください。
受信側のプロジェクトを作成する
- ソリューション エクスプローラー ウィンドウで、
** [ServiceBusTopicQuickStart]** ソリューションを右クリックし、** [追加]** をポイントして、** [新しいプロジェクト]** を選択します。 ** [コンソール アプリケーション]** を選択し、** [次へ]** を選択します。** [プロジェクト名]** に「** SubscriptionReceiver** 」と入力し、** [次へ]** を選択します。** [追加情報]** ページで** [作成]** を選択します。** ソリューション エクスプローラー** ウィンドウで、** [SubscriptionReceiver]** を右クリックし、** [Set as a Startup Project](スタートアップ プロジェクトとして設定)** を選択します。
NuGet パッケージをプロジェクトに追加する
メニューから [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。
[既定のプロジェクト] ドロップダウン リストで [SubscriptionReceiver] を選択します。
次のコマンドを実行して、Azure.Messaging.ServiceBus NuGet パッケージをインストールします。
Install-Package Azure.Messaging.ServiceBus
次のコマンドを実行して、Azure.Identity NuGet パッケージをインストールします。
Install-Package Azure.Identity
サブスクリプションからメッセージを受信するコードを追加する
このセクションでは、サブスクリプションからメッセージを取得するコードを追加します。
Program.cs
の既存の内容を次のプロパティとメソッドに置き換えます。using System.Threading.Tasks; using Azure.Messaging.ServiceBus; using Azure.Identity; // the client that owns the connection and can be used to create senders and receivers ServiceBusClient client; // the processor that reads and processes messages from the subscription ServiceBusProcessor processor; // handle received messages async Task MessageHandler(ProcessMessageEventArgs args) { string body = args.Message.Body.ToString(); Console.WriteLine($"Received: {body} from subscription."); // complete the message. messages is deleted from the subscription. await args.CompleteMessageAsync(args.Message); } // handle any errors when receiving messages Task ErrorHandler(ProcessErrorEventArgs args) { Console.WriteLine(args.Exception.ToString()); return Task.CompletedTask; }
Program.cs
の末尾に次のコードを追加します。DefaultAzureCredential
オブジェクトを使用して ServiceBusClient オブジェクトを作成します。DefaultAzureCredential
によって、Visual Studio サインインの資格情報が自動的に検出および使用されて、Azure Service Bus に対する認証が行われます。ServiceBusClient
オブジェクトで CreateProcessor メソッドを呼び出し、指定した Service Bus トピックに対して ServiceBusProcessor オブジェクトを作成します。`ServiceBusProcessor` オブジェクトの[ ProcessMessageAsync](/dotnet/api/azure.messaging.servicebus.servicebusprocessor.processmessageasync) および[ ProcessErrorAsync](/dotnet/api/azure.messaging.servicebus.servicebusprocessor.processerrorasync) イベントのハンドラーを指定します。`ServiceBusProcessor` オブジェクトで[ StartProcessingAsync](/dotnet/api/azure.messaging.servicebus.servicebusprocessor.startprocessingasync) を呼び出して、メッセージの処理を開始します。- ユーザーがキーを押して処理を終了すると、
`ServiceBusProcessor` オブジェクトで[ StopProcessingAsync](/dotnet/api/azure.messaging.servicebus.servicebusprocessor.stopprocessingasync) が呼び出されます。
重要
コード スニペット内のプレースホルダー値 (
<NAMESPACE-NAME>
、<TOPIC-NAME>
、<SUBSCRIPTION-NAME>
) を、Service Bus の名前空間、トピック、サブスクリプションの名前に置き換えて更新します。詳細については、コードのコメントを参照してください。
// The Service Bus client types are safe to cache and use as a singleton for the lifetime // of the application, which is best practice when messages are being published or read // regularly. // // Create the clients that we'll use for sending and processing messages. // TODO: Replace the <NAMESPACE-NAME> placeholder client = new ServiceBusClient( "<NAMESPACE-NAME>.servicebus.windows.net", new DefaultAzureCredential()); // create a processor that we can use to process the messages // TODO: Replace the <TOPIC-NAME> and <SUBSCRIPTION-NAME> placeholders processor = client.CreateProcessor("<TOPIC-NAME>", "<SUBSCRIPTION-NAME>", new ServiceBusProcessorOptions()); try { // add handler to process messages processor.ProcessMessageAsync += MessageHandler; // add handler to process any errors processor.ProcessErrorAsync += ErrorHandler; // start processing await processor.StartProcessingAsync(); Console.WriteLine("Wait for a minute and then press any key to end the processing"); Console.ReadKey(); // stop processing Console.WriteLine("\nStopping the receiver..."); await processor.StopProcessingAsync(); Console.WriteLine("Stopped receiving messages"); } finally { // Calling DisposeAsync on client types is required to ensure that network // resources and other unmanaged objects are properly cleaned up. await processor.DisposeAsync(); await client.DisposeAsync(); }
Program.cs
は次のようになります。using System; using System.Threading.Tasks; using Azure.Messaging.ServiceBus; using Azure.Identity; // the client that owns the connection and can be used to create senders and receivers ServiceBusClient client; // the processor that reads and processes messages from the subscription ServiceBusProcessor processor; // handle received messages async Task MessageHandler(ProcessMessageEventArgs args) { string body = args.Message.Body.ToString(); Console.WriteLine($"Received: {body} from subscription."); // complete the message. messages is deleted from the subscription. await args.CompleteMessageAsync(args.Message); } // handle any errors when receiving messages Task ErrorHandler(ProcessErrorEventArgs args) { Console.WriteLine(args.Exception.ToString()); return Task.CompletedTask; } // The Service Bus client types are safe to cache and use as a singleton for the lifetime // of the application, which is best practice when messages are being published or read // regularly. // // Create the clients that we'll use for sending and processing messages. // TODO: Replace the <NAMESPACE-NAME> placeholder client = new ServiceBusClient( "<NAMESPACE-NAME>.servicebus.windows.net", new DefaultAzureCredential()); // create a processor that we can use to process the messages // TODO: Replace the <TOPIC-NAME> and <SUBSCRIPTION-NAME> placeholders processor = client.CreateProcessor("<TOPIC-NAME>", "<SUBSCRIPTION-NAME>", new ServiceBusProcessorOptions()); try { // add handler to process messages processor.ProcessMessageAsync += MessageHandler; // add handler to process any errors processor.ProcessErrorAsync += ErrorHandler; // start processing await processor.StartProcessingAsync(); Console.WriteLine("Wait for a minute and then press any key to end the processing"); Console.ReadKey(); // stop processing Console.WriteLine("\nStopping the receiver..."); await processor.StopProcessingAsync(); Console.WriteLine("Stopped receiving messages"); } finally { // Calling DisposeAsync on client types is required to ensure that network // resources and other unmanaged objects are properly cleaned up. await processor.DisposeAsync(); await client.DisposeAsync(); }
プロジェクトをビルドし、エラーがないことを確認します。
受信側アプリを実行します。 受信メッセージが表示されます。 任意のキーを押して、受信側とアプリケーションを停止します。
Wait for a minute and then press any key to end the processing Received: Message 1 from subscription: S1 Received: Message 2 from subscription: S1 Received: Message 3 from subscription: S1 Stopping the receiver... Stopped receiving messages
もう一度ポータルを確認します。
次のステップ
次のドキュメントおよびサンプルを参照してください。
- .NET 用の Azure Service Bus クライアント ライブラリ - Readme
[ GitHub にある Azure Service Bus 用の .NET サンプル](https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/servicebus/Azure.Messaging.ServiceBus/samples) - .NET API リファレンス