クイック スタート: .NET を使用して Azure Event Hubs との間でイベントを送受信する
このクイックスタートでは、Azure.Messaging.EventHubs .NET ライブラリを使用して、イベント ハブにイベントを送信し、そのイベント ハブからそれらのイベントを受信する方法を学習します。
Note
クイックスタートは、サービスに対する準備をすばやく行うためのものです。 サービスに既に慣れている場合は、GitHub の .NET SDK リポジトリで Event Hubs の .NET サンプル (GitHub の Event Hubs サンプル、GitHub のイベント プロセッサ サンプル) を確認できます。
前提条件
Azure Event Hubs を初めて使用する場合は、このクイックスタートを実行する前に Event Hubs の概要を参照してください。
このクイック スタートを完了するには、次の前提条件を用意しておく必要があります。
- Microsoft Azure サブスクリプション。 Azure Event Hubs を含む Azure サービスを使用するには、サブスクリプションが必要です。 既存の Microsoft Azure アカウントをお持ちでない場合は、アカウントを作成する際に、無料試用版にサインアップするか、MSDN サブスクライバー特典を利用できます。
- Microsoft Visual Studio 2022。 Azure Event Hubs クライアント ライブラリでは、C# 8.0 で導入された新機能を利用しています。 以前のバージョンの C# 言語でライブラリを使うこともできますが、新しい構文は使用できません。 完全な構文を使用するには、
[ .NET Core SDK](https://dotnet.microsoft.com/download) 3.0 以上で、[ 言語バージョン](/dotnet/csharp/language-reference/configure-language-version#override-a-default) を`latest` に設定してコンパイルすることをお勧めします。 Visual Studio を使用している場合、Visual Studio 2022 より前のバージョンは、C# 8.0 プロジェクトをビルドするために必要なツールと互換性がありません。 無料の Community エディションを含む Visual Studio 2022 は、こちらからダウンロードできます。 - Event Hubs 名前空間とイベント ハブを作成する。 最初の手順では、Azure portal を使用して、Event Hubs 名前空間を作成し、その名前空間にイベント ハブを作成します。 その後、アプリケーションがイベント ハブと通信するために必要な管理資格情報を取得します。 名前空間とイベント ハブを作成する場合は、「クイック スタート: Azure portal を使用したイベント ハブの作成」を参照してください。
Azure に対してアプリを認証する
このクイック スタートでは、Azure Event Hubs に接続する 2 つの方法を示します。
- パスワードレス (Microsoft Entra 認証)
- 接続文字列
1 つ目のオプションでは、Azure Active Directory のセキュリティ プリンシパルとロールベースのアクセス制御 (RBAC) を使用して Event Hubs 名前空間に接続する方法を示します。 コードや構成ファイル、または Azure Key Vault などのセキュリティで保護されたストレージに、ハードコーディングされた接続文字列を含める心配はありません。
2 つ目のオプションでは、接続文字列を使用して Event Hubs 名前空間に接続する方法を示します。 Azure を初めて使用する場合は、接続文字列オプションの方が理解しやすいかもしれません。 実際のアプリケーションと運用環境では、パスワードレス オプションを使用することをお勧めします。 詳細については、「認証と承認」を参照してください。 パスワードレス認証の詳細については、概要ページを参照してください。
Microsoft Entra ユーザーにロールを割り当てる
ローカルでの開発時には、Azure Event Hubs に接続するユーザー アカウントに正しいアクセス許可があることを確認してください。 メッセージを送受信するには、Azure Event Hubs データ所有者ロールが必要です。 このロールを自分に割り当てるには、ユーザー アクセス管理者ロール、または Microsoft.Authorization/roleAssignments/write
アクションを含む別のロールが必要です。 Azure portal、Azure CLI、または Azure PowerShell を使用して、ユーザーに Azure RBAC ロールを割り当てることができます。 ロールの割り当てに使用できるスコープの詳細は、スコープの概要ページを参照してください。
次の例では、ユーザー アカウントに Azure Event Hubs Data Owner
ロールを割り当てます。これにより、Azure Event Hubs リソースにフル アクセスできます。 実際のシナリオでは、より安全な運用環境を実現するため、最小限の特権の原則に従って、必要な最小限のアクセス許可のみをユーザーに付与します。
Azure Event Hubs の Azure の組み込みロール
Azure Event Hubs の場合、Azure portal および Azure リソース管理 API による名前空間とそれに関連するすべてのリソースの管理は、Azure RBAC モデルを使用して既に保護されています。 Azure では、Event Hubs 名前空間へのアクセス権を付与するために、次の Azure 組み込みロールが提供されています。
- Azure Event Hubs データ所有者: Event Hubs 名前空間とそのエンティティ (キュー、トピック、サブスクリプション、フィルター) へのデータ アクセスが可能です。
- Azure Event Hubs データ送信者: このロールを使用して、Event Hubs 名前空間とそのエンティティへのアクセス権を送信者に付与します。
- Azure Event Hubs データ受信者: このロールを使用して、Event Hubs 名前空間とそのエンティティへのアクセス権を受信者に付与します。
カスタム ロールを作成する場合は、Event Hubs 操作に必要な権限に関するページを参照してください。
重要
ほとんどの場合、ロールの割り当てが Azure に反映されるまでの時間は 1、2 分です。 まれに、最大 8 分かかる場合があります。 初めてコードを実行したときに認証エラーを受け取る場合は、しばらく待ってから再試行してください。
Azure portal で、メインの検索バーまたは左側のナビゲーションを使用して Event Hubs 名前空間を見つけます。
概要ページで、左側のメニューから [アクセス制御 (IAM)] を選択します。
[アクセス制御 (IAM)] ページで、[ロールの割り当て] タブを選びます。
上部のメニューから [+ 追加] を選択し、次に結果のドロップダウン メニューから [ロールの割り当ての追加] を選択します。
検索ボックスを使って、結果を目的のロールに絞り込みます。 この例では、
Azure Event Hubs Data Owner
を検索して一致する結果を選択します。 [次へ] を選びます。[アクセスの割り当て先] で、[ユーザー、グループ、またはサービス プリンシパル] を選び、[+ メンバーの選択] を選びます。
ダイアログで、自分の Microsoft Entra ユーザー名 (通常は user@domain メール アドレス) を検索し、ダイアログの下部にある [選択] を選びます。
[レビューと割り当て] を選んで最終ページに移動し、もう一度 [レビューと割り当て] を行ってプロセスを完了します。
Visual Studio を起動して Azure にサインインする
次の手順を使用して、Service Bus 名前空間へのアクセスを承認できます。
Visual Studio を起動します。 [作業の開始] ウィンドウが表示されたら、右側のウィンドウで [コードなしで続行] リンクを選択します。
Visual Studio の右上隅にある [サインイン] ボタンを選びます。
以前にロールを割り当てた Microsoft Entra アカウントを使用してサインインします。
イベント ハブにイベントを送信する
このセクションでは、作成したイベント ハブにイベントを送信する .NET Core コンソール アプリケーションの作成方法を示します。
コンソール アプリケーションの作成
Visual Studio 2022 を既に開いている場合は、メニューの [ファイル] を選択し、[新規] を選んでから、[プロジェクト] を選択します。 それ以外の場合は、Visual Studio 2022 を起動し、ポップアップ ウィンドウが表示された場合は [新しいプロジェクトの作成] を選択します。
** [新しいプロジェクトの作成]** ダイアログ ボックスで、次の手順に従います。このダイアログ ボックスが表示されない場合は、メニューで** [ファイル]** 、** [新規]** 、** [プロジェクト]** の順に選択します。プログラミング言語として
** [C#]** を選択します。アプリケーションの種類として [コンソール] を選択します。
結果リストから
** [コンソール アプリケーション]** を選択します。次に、 [次へ] を選択します。
プロジェクト名として「EventHubsSender」、ソリューション名として「EventHubsQuickStart」と入力してから、[次へ] を選択します。
** [追加情報]** ページで** [作成]** を選択します。
NuGet パッケージをプロジェクトに追加する
メニューから [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。
次のコマンドを実行して Azure.Messaging.EventHubs と Azure.Identity NuGet パッケージをインストールします。 Enter キーを押して 2 つ目のコマンドを実行します。
Install-Package Azure.Messaging.EventHubs Install-Package Azure.Identity
イベント ハブにイベントを送信するコードの記述
Program.cs
ファイル内の既存のコードを、次のサンプル コードに置き換えます。 その後、EventHubProducerClient
パラメーターの<EVENT_HUB_NAMESPACE>
および<HUB_NAME>
プレースホルダーの値を、Event Hubs 名前空間とイベント ハブの名前に置き換えます。 たとえば、"spehubns0309.servicebus.windows.net"
と"spehub"
などです。コードの重要な手順を次に示します。
- 名前空間と Event Hub 名を使用して EventHubProducerClient オブジェクトを作成します。
- EventHubProducerClient オブジェクトで CreateBatchAsync メソッドを呼び出して、EventDataBatch オブジェクトを作成します。
- EventDataBatch.TryAdd メソッドを使って、バッチにイベントを追加します。
- EventHubProducerClient.SendAsync メソッドを使って、メッセージのバッチをイベント ハブに送信します。
using Azure.Identity; using Azure.Messaging.EventHubs; using Azure.Messaging.EventHubs.Producer; using System.Text; // number of events to be sent to the event hub int numOfEvents = 3; // The Event Hubs client types are safe to cache and use as a singleton for the lifetime // of the application, which is best practice when events are being published or read regularly. // TODO: Replace the <EVENT_HUB_NAMESPACE> and <HUB_NAME> placeholder values EventHubProducerClient producerClient = new EventHubProducerClient( "<EVENT_HUB_NAMESPACE>.servicebus.windows.net", "<HUB_NAME>", new DefaultAzureCredential()); // Create a batch of events using EventDataBatch eventBatch = await producerClient.CreateBatchAsync(); for (int i = 1; i <= numOfEvents; i++) { if (!eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes($"Event {i}")))) { // if it is too large for the batch throw new Exception($"Event {i} is too large for the batch and cannot be sent."); } } try { // Use the producer client to send the batch of events to the event hub await producerClient.SendAsync(eventBatch); Console.WriteLine($"A batch of {numOfEvents} events has been published."); Console.ReadLine(); } finally { await producerClient.DisposeAsync(); }
プロジェクトをビルドし、エラーがないことを確認します。
プログラムを実行し、確認メッセージが表示されるまで待ちます。
A batch of 3 events has been published.
重要
パスワードレス (Azure Active Directory のロールベースのアクセス制御) 認証を使用している場合は、[ツール] を選択し、[オプション] を選択します。 [オプション] ウィンドウで、[Azure サービス認証] を展開し、[アカウントの選択] を選択します。 Event Hubs 名前空間の Azure Event Hubs データ所有者ロールに追加されたアカウントを使用していることを確認します。
Azure portal の [Event Hubs 名前空間] ページでは、[メッセージ] グラフに 3 つの受信メッセージが表示されます。 ページを更新し、必要に応じてグラフを更新します。 メッセージが受信されたことが示されるまでに数秒かかることがあります。
注意
より多くの情報を含むコメント付きの完全なソース コードについては、GitHub 上のこちらのファイルを参照してください
イベント ハブからイベントを受信する
このセクションでは、イベント プロセッサを使用してイベント ハブからイベントを受信する .NET Core コンソール アプリケーションを作成する方法について説明します。 イベント プロセッサにより、イベント ハブからのイベントの受信が簡素化されます。
Azure Storage アカウントと BLOB コンテナーを作成する
このクイックスタートでは、チェックポイント ストアとして Azure Storage を使用します。 Azure ストレージ アカウントを作成するには、次の手順に従います。
- Azure ストレージ アカウントの作成
- BLOB コンテナーを作成する
- Microsoft Entra ID (パスワードレス) 認証または名前空間への接続文字列を使用して、BLOB コンテナーに対して認証を行います。
チェックポイント ストアとして Azure Blob Storage を使用する場合は、次の推奨事項に従ってください。
- コンシューマー グループごとに個別のコンテナーを使用します。 同じストレージ アカウントを使用できますが、各グループごとに 1 つのコンテナーを使用します。
- コンテナーを他の何かに使用しないでください。また、ストレージ アカウントも他の何かに使用しないでください。
- ストレージ アカウントは、デプロイされたアプリケーションが配置されているのと同じリージョンに存在する必要があります。 アプリケーションがオンプレミスの場合は、可能な中で最も近いリージョンを選択することを試みてください。
Azure portal の [ストレージ アカウント] ページの [Blob service] セクションで、次の設定が無効になっていることを確認してください。
- 階層型名前空間
- BLOB の論理的な削除
- バージョン管理
ローカルで開発する場合は、BLOB データにアクセスするユーザー アカウントに正しいアクセス許可があることを確認します。 BLOB データの読み取りと書き込みを行うには、ストレージ BLOB データ共同作成者が必要です。 このロールを自分に割り当てるには、ユーザー アクセス管理者ロール、または Microsoft.Authorization/roleAssignments/write アクションを含む別のロールに割り当てられている必要があります。 Azure portal、Azure CLI、または Azure PowerShell を使用して、ユーザーに Azure RBAC ロールを割り当てることができます。 ロールの割り当てに使用できるスコープの詳細は、スコープの概要ページでご覧いただけます。
このシナリオでは、最小限の特権の原則に従って、ストレージ アカウントに限定したアクセス許可をユーザー アカウントに割り当てます。 この方法を使って、ユーザーに必要最小限のアクセス許可のみを与え、より安全な運用環境を作成します。
次の例では、ストレージ BLOB データ共同作成者ロールを自分のユーザー アカウントに割り当てます。これにより、そのストレージ アカウント内の BLOB データに対する読み取りと書き込みの両方のアクセス権が付与されます。
重要
ほとんどの場合、ロールの割り当てが Azure に反映されるまでの時間は 1 分から 2 分ですが、まれに 8 分程度までかかる場合があります。 初めてコードを実行したときに認証エラーを受け取る場合は、しばらく待ってから再試行してください。
Azure portal で、メインの検索バーまたは左側のナビゲーションを使ってストレージ アカウントを見つけます。
ストレージ アカウントの概要ページで、左側のメニューから [アクセス制御 (IAM)] を選びます。
[アクセス制御 (IAM)] ページで、[ロールの割り当て] タブを選びます。
上部のメニューから [+ 追加] を選択し、次に結果のドロップダウン メニューから [ロールの割り当ての追加] を選択します。
検索ボックスを使って、結果を目的のロールに絞り込みます。 この例では、ストレージ BLOB データ共同作成者を検索し、一致する結果を選び、[次へ] を選びます。
[アクセスの割り当て先] で、[ユーザー、グループ、またはサービス プリンシパル] を選び、[+ メンバーの選択] を選びます。
ダイアログで、自分の Microsoft Entra ユーザー名 (通常は user@domain メール アドレス) を検索し、ダイアログの下部にある [選択] を選びます。
[レビューと割り当て] を選んで最終ページに移動し、もう一度 [レビューと割り当て] を行ってプロセスを完了します。
受信側のプロジェクトを作成する
- ソリューション エクスプローラー ウィンドウで、 [EventHubQuickStart] ソリューションを右クリックし、 [追加] をポイントして、 [新しいプロジェクト] を選択します。
- [コンソール アプリケーション] を選択し、 [次へ] を選択します。
- [プロジェクト名] に「EventHubsReceiver」と入力し、 [作成] を選択します。
- ソリューション エクスプローラー ウィンドウで、 [EventHubsReceiver] を右クリックし、 [Set as a Startup Project](スタートアップ プロジェクトとして設定) を選択します。
NuGet パッケージをプロジェクトに追加する
メニューから [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。
[パッケージ マネージャー コンソール] ウィンドウで、 [既定のプロジェクト] に [EventHubsReceiver] が選択されていることを確認します。 そうでない場合は、ドロップダウン リストを使用して [EventHubsReceiver] を選択します。
次のコマンドを実行して Azure.Messaging.EventHubs と Azure.Identity NuGet パッケージをインストールします。 Enter キーを押して最後のコマンドを実行します。
Install-Package Azure.Messaging.EventHubs Install-Package Azure.Messaging.EventHubs.Processor Install-Package Azure.Identity
コードを更新する
Program.cs の内容を次のコードで置き換えます。
Program.cs
ファイル内の既存のコードを、次のサンプル コードに置き換えます。 その後、BlobContainerClient
URI の<STORAGE_ACCOUNT_NAME>
および<BLOB_CONTAINER_NAME>
プレースホルダーの値を置き換えます。EventProcessorClient
の<EVENT_HUB_NAMESPACE>
プレースホルダーと<HUB_NAME>
プレースホルダーの値も置き換えてください。コードの重要な手順を次に示します。
- Event Hubs 名前空間とイベント ハブ名を使用して、EventProcessorClient オブジェクトを作成します。 前に作成した Azure Storage でコンテナー用の BlobContainerClient オブジェクトを作成する必要があります。
- Eventprocessorclient オブジェクトの ProcessEventAsync および ProcessErrorAsync イベント用のハンドラーを指定します。
- EventProcessorClient オブジェクトで StartProcessingAsync を呼び出して、イベントの処理を開始します。
- EventProcessorClient オブジェクトで StopProcessingAsync を呼び出して、30 秒後にイベントの処理を停止します。
using Azure.Identity; using Azure.Messaging.EventHubs; using Azure.Messaging.EventHubs.Consumer; using Azure.Messaging.EventHubs.Processor; using Azure.Storage.Blobs; using System.Text; // Create a blob container client that the event processor will use // TODO: Replace <STORAGE_ACCOUNT_NAME> and <BLOB_CONTATINAER_NAME> with actual names BlobContainerClient storageClient = new BlobContainerClient( new Uri("https://<STORAGE_ACCOUNT_NAME>.blob.core.windows.net/<BLOB_CONTAINER_NAME>"), new DefaultAzureCredential()); // Create an event processor client to process events in the event hub // TODO: Replace the <EVENT_HUBS_NAMESPACE> and <HUB_NAME> placeholder values var processor = new EventProcessorClient( storageClient, EventHubConsumerClient.DefaultConsumerGroupName, "<EVENT_HUB_NAMESPACE>.servicebus.windows.net", "<HUB_NAME>", new DefaultAzureCredential()); // Register handlers for processing events and handling errors processor.ProcessEventAsync += ProcessEventHandler; processor.ProcessErrorAsync += ProcessErrorHandler; // Start the processing await processor.StartProcessingAsync(); // Wait for 30 seconds for the events to be processed await Task.Delay(TimeSpan.FromSeconds(30)); // Stop the processing await processor.StopProcessingAsync(); Task ProcessEventHandler(ProcessEventArgs eventArgs) { // Write the body of the event to the console window Console.WriteLine("\tReceived event: {0}", Encoding.UTF8.GetString(eventArgs.Data.Body.ToArray())); Console.ReadLine(); return Task.CompletedTask; } Task ProcessErrorHandler(ProcessErrorEventArgs eventArgs) { // Write details about the error to the console window Console.WriteLine($"\tPartition '{eventArgs.PartitionId}': an unhandled exception was encountered. This was not expected to happen."); Console.WriteLine(eventArgs.Exception.Message); Console.ReadLine(); return Task.CompletedTask; }
プロジェクトをビルドし、エラーがないことを確認します。
注意
より多くの情報を含むコメント付きの完全なソース コードについては、GitHub 上のこちらのファイルを参照してください。
受信側アプリを実行します。
イベントが受信されたことを示すメッセージが表示されます。 受信したイベント メッセージが表示されたら、Enter キーを押します。
Received event: Event 1 Received event: Event 2 Received event: Event 3
これらのイベントは、前に送信側プログラムを実行してイベント ハブに送信した 3 つのイベントです。
Azure portal では、Event Hubs が受信側アプリケーションに送信した 3 つの送信メッセージがあることを確認できます。 ページを最新の情報に更新して、グラフを更新します。 メッセージが受信されたことが示されるまでに数秒かかることがあります。
Event Hubs SDK ベースのアプリケーションのスキーマ検証
Event Hubs SDK ベースのアプリケーションでデータをストリーミングする場合、Azure スキーマ レジストリを使用してスキーマを検証できます。 Event Hubs の Azure スキーマ レジストリにはスキーマ管理用に一元化されたリポジトリが用意されており、新規または既存のアプリケーションとスキーマ レジストリをシームレスに接続できます。
詳細については、「Event Hubs SDK を使用してスキーマを検証する」を参照してください。
サンプルとリファレンス
このクイック スタートでは、イベントのバッチをイベント ハブに送信し、それらを受信するというシナリオを実装する詳細な手順を示します。 その他のサンプルについては、次のリンクを選択してください。
完全な .NET ライブラリ リファレンスについては、SDK のドキュメントを参照してください。
リソースをクリーンアップする
Event Hubs 名前空間を持つリソース グループを削除するか、リソース グループを保持する場合は名前空間のみを削除します。
関連するコンテンツ
次のチュートリアルを参照してください。