次の方法で共有


クイック スタート: .NET を使用して Azure Event Hubs との間でイベントを送受信する

このクイックスタートでは、Azure.Messaging.EventHubs .NET ライブラリを使用して、イベント ハブにイベントを送信し、そのイベント ハブからそれらのイベントを受信する方法を学習します。

クイックスタートは、サービスに対する準備をすばやく行うためのものです。 サービスに既に慣れている場合は、GitHub の .NET SDK リポジトリで Event Hubs の .NET サンプルを確認できます。 GitHub の Event Hubs サンプルGitHub のイベント プロセッサ サンプル

前提条件

Azure Event Hubs を初めて使用する場合は、このクイックスタートを実行する前に Event Hubs の概要を参照してください。

このクイック スタートを完了するには、次の前提条件を用意しておく必要があります。

  • Microsoft Azure サブスクリプション。 Azure Event Hubs を含む Azure サービスを使用するには、サブスクリプションが必要です。 Azure アカウントを持っていない場合、無料試用版でサインアップできます。
  • 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 認証)
  • 接続文字列

最初のオプションでは、Azure Microsoft Entra ID とロールベースのアクセス制御 (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 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 Event Hubs データ所有者: Event Hubs 名前空間とそのエンティティ (キュー、トピック、サブスクリプション、フィルター) へのデータ アクセスを有効にします。
  • Azure Event Hubs データ送信者: このロールを使用して、Event Hubs 名前空間とそのエンティティへのアクセス権を送信者に付与します。
  • Azure Event Hubs データ受信者: このロールを使用して、Event Hubs 名前空間とそのエンティティへのアクセス権を受信者に付与します。

カスタム ロールを作成する場合は、Event Hubs 操作に必要な権限に関するページを参照してください。

重要

ほとんどの場合、ロールの割り当てが Azure に伝達されるまでの時間は 1、2 分です。 まれに、最大 8 分かかる場合があります。 初めてコードを実行したときに認証エラーを受け取る場合は、しばらく待ってから再試行してください。

  1. Azure portal で、メインの検索バーまたは左側のナビゲーションを使用して Event Hubs 名前空間を見つけます。

  2. 概要ページで、左側のメニューから [アクセス制御 (IAM)] を選択します。

  3. [アクセス制御 (IAM)] ページで、[ロールの割り当て] タブを選びます。

  4. 上部のメニューから [ + 追加] を選択します。 次に、[ ロールの割り当ての追加] を選択します。

    ロールを割り当てる方法を示すスクリーンショット。

  5. 検索ボックスを使って、結果を目的のロールに絞り込みます。 この例では、Azure Event Hubs Data Owner を検索して一致する結果を選択します。 [次へ] を選びます。

  6. [ アクセスの割り当て] で、[ ユーザー、グループ、またはサービス プリンシパル] を選択します。 [ + メンバーの選択] を選択します

  7. ダイアログで、Microsoft Entra ユーザー名 (通常は user@___domain のメール アドレス) を検索します。 ダイアログの下部にある [選択] を 選択 します。

  8. [ 確認と割り当て] を選択して、最後のページに移動します。 [ 確認と割り当て ] をもう一度選択してプロセスを完了します。

Visual Studio を起動して Azure にサインインする

次の手順を使用して、Service Bus 名前空間へのアクセスを承認できます。

  1. Visual Studio を起動します。 [作業の開始] ウィンドウが表示されたら、右側のウィンドウで [コードなしで続行] リンクを選択します。

  2. Visual Studio の右上隅にある [サインイン] ボタンを選びます。

    Visual Studio を使って Azure にサインインするボタンを示すスクリーンショット。

  3. 以前にロールを割り当てた Microsoft Entra アカウントを使用してサインインします。

    アカウントの選択を示すスクリーンショット。

イベント ハブにイベントを送信する

このセクションでは、作成したイベント ハブにイベントを送信する .NET Core コンソール アプリケーションの作成方法を示します。

コンソール アプリケーションの作成

  1. Visual Studio 2022 を既に開いている場合は、メニューの [ファイル] を選択し、[新規] を選んでから、[プロジェクト] を選択します。 それ以外の場合は、Visual Studio 2022 を起動し、ポップアップ ウィンドウが表示された場合は [新しいプロジェクトの作成] を選択します。

  2. **[新しいプロジェクトの作成]** ダイアログ ボックスで、次の手順に従います。このダイアログ ボックスが表示されない場合は、メニューで **[ファイル]****[新規]****[プロジェクト]** の順に選択します。

    1. プログラミング言語として **[C#]** を選択します。

    2. アプリケーションの種類として [コンソール] を選択します。

    3. 結果リストから **[コンソール アプリケーション]** を選択します。

    4. 次に、 [次へ] を選択します。

      [新しいプロジェクト] ダイアログ ボックスを示す画像

  3. プロジェクト名として「EventHubsSender」、ソリューション名として「EventHubsQuickStart」と入力してから、[次へ] を選択します。

    ソリューションとプロジェクトの名前を入力するページを示す画像

  4. **[追加情報]** ページで **[作成]** を選択します。

NuGet パッケージをプロジェクトに追加する

  1. メニューから [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  2. 次のコマンドを実行して Azure.Messaging.EventHubsAzure.Identity NuGet パッケージをインストールします。 Enter キーを押して 2 つ目のコマンドを実行します。

    Install-Package Azure.Messaging.EventHubs
    Install-Package Azure.Identity
    

イベント ハブにイベントを送信するコードの記述

  1. Program.cs ファイル内の既存のコードを、次のサンプル コードに置き換えます。 その後、<EVENT_HUB_NAMESPACE> パラメーターの <HUB_NAME> および EventHubProducerClient プレースホルダーの値を、Event Hubs 名前空間とイベント ハブの名前に置き換えます。 たとえば、"spehubns0309.servicebus.windows.net""spehub" などです。

    コードの重要な手順を次に示します。

    1. 名前空間と Event Hub 名を使用して EventHubProducerClient オブジェクトを作成します。
    2. EventHubProducerClient オブジェクトで CreateBatchAsync メソッドを呼び出して、EventDataBatch オブジェクトを作成します。
    3. EventDataBatch.TryAdd メソッドを使って、バッチにイベントを追加します。
    4. 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();
    }
    
  1. プロジェクトをビルドし、エラーがないことを確認します。

  2. プログラムを実行し、確認メッセージが表示されるまで待ちます。

    A batch of 3 events has been published.
    

    Microsoft Entra 認証の使用時に "InvalidIssuer: Token issuer is invalid" というエラーが発生した場合は、間違った Microsoft Entra テナント ID が使用されていることが原因である可能性があります。 コードで、'new DefaultAzureCredential()' を 'new DefaultAzureCredentialOptions {TenantId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}) に置き換えて、Microsoft Entra テナント ID を明示的に指定します。

    重要

    パスワードレス (Microsoft Entra のロールベースのアクセス制御) 認証を使用している場合は、[ ツール] を選択し、[ オプション] を選択します。 [オプション] ウィンドウで、[Azure サービス認証] を展開し、[アカウントの選択] を選択します。 使用中のアカウントが、Azure Event Hubs データ所有者のロールにEvent Hubs 名前空間で追加されたものであることを確認してください。

  3. Azure portal の [Event Hubs 名前空間 ] ページには、[ メッセージ ] グラフに 3 つの受信メッセージが表示されます。 ページを更新し、必要に応じてグラフを更新します。 メッセージが受信されたことが示されるまでに数秒かかることがあります。

    イベント ハブでイベントが受信されたことを確認する Azure portal ページの画像

    より多くの情報を含むコメント付きの完全なソース コードについては、GitHub 上のこちらのファイルを参照してください

イベント ハブからイベントを受信する

このセクションでは、イベント プロセッサを使用してイベント ハブからイベントを受信する .NET Core コンソール アプリケーションを作成する方法について説明します。 イベント プロセッサにより、イベント ハブからのイベントの受信が簡素化されます。

Azure Storage アカウントと BLOB コンテナーを作成する

このクイックスタートでは、チェックポイント ストアとして Azure Storage を使用します。 Azure ストレージ アカウントを作成するには、次の手順に従います。

  1. Azure ストレージ アカウントの作成
  2. BLOB コンテナーを作成する
  3. 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 ロールを割り当てることができます。 詳しくは、「Azure RBAC のスコープについて」を参照してください。

このシナリオでは、ストレージ アカウントをスコープとするアクセス許可をユーザー アカウントに割り当てて、 最小限の特権の原則に従います。 この方法を使って、ユーザーに必要最小限のアクセス許可のみを与え、より安全な運用環境を作成します。

次の例では、 ストレージ BLOB データ共同作成者 ロールをユーザー アカウントに割り当てます。これによって、ストレージ アカウント内の BLOB データへの読み取りと書き込みの両方のアクセスが提供されます。

重要

ほとんどの場合、ロールの割り当てが Azure に伝達されるまでの時間は 1、2 分です。 まれに、最大 8 分かかる場合があります。 初めてコードを実行したときに認証エラーを受け取る場合は、しばらく待ってから再試行してください。

  1. Azure portal で、メインの検索バーまたは左側のナビゲーションを使ってストレージ アカウントを見つけます。

  2. ストレージ アカウント ページで、左側のメニューから [アクセス制御 (IAM)] を選択します。

  3. [アクセス制御 (IAM)] ページで、[ロールの割り当て] タブを選びます。

  4. 上部のメニューから [ + 追加] を選択します。 次に、[ ロールの割り当ての追加] を選択します。

    ストレージ アカウント ロールを割り当てる方法を示すスクリーンショット。

  5. 検索ボックスを使って、結果を目的のロールに絞り込みます。 この例では、 ストレージ BLOB データ共同作成者を検索します。 一致する結果を選択し、次に [次へ]を押します。

  6. [アクセスの割り当て先] で、[ユーザー、グループ、またはサービス プリンシパル] を選び、[+ メンバーの選択] を選びます。

  7. ダイアログで、自分の Microsoft Entra ユーザー名 (通常は user@___domain メール アドレス) を検索し、ダイアログの下部にある [選択] を選びます。

  8. [ 確認と割り当て] を選択して、最後のページに移動します。 [ 確認と割り当て ] をもう一度選択してプロセスを完了します。

受信側のプロジェクトを作成する

  1. ソリューション エクスプローラー ウィンドウで、 [EventHubQuickStart] ソリューションを右クリックし、 [追加] をポイントして、 [新しいプロジェクト] を選択します。
  2. [コンソール アプリケーション] を選択し、 [次へ] を選択します。
  3. [プロジェクト名] に「EventHubsReceiver」と入力し、 [作成] を選択します。
  4. ソリューション エクスプローラー ウィンドウで、 [EventHubsReceiver] を右クリックし、 [Set as a Startup Project](スタートアップ プロジェクトとして設定) を選択します。

NuGet パッケージをプロジェクトに追加する

  1. メニューから [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  2. [パッケージ マネージャー コンソール] ウィンドウで、 [既定のプロジェクト][EventHubsReceiver] が選択されていることを確認します。 そうでない場合は、ドロップダウン リストを使用して [EventHubsReceiver] を選択します。

  3. 次のコマンドを実行して Azure.Messaging.EventHubsAzure.Identity NuGet パッケージをインストールします。 Enter キーを押して最後のコマンドを実行します。

    Install-Package Azure.Messaging.EventHubs
    Install-Package Azure.Messaging.EventHubs.Processor
    Install-Package Azure.Identity
    

コードを更新する

Program.cs の内容を次のコードで置き換えます。

  1. Program.cs ファイル内の既存のコードを、次のサンプル コードに置き換えます。 その後、<STORAGE_ACCOUNT_NAME> URI の <BLOB_CONTAINER_NAME> および BlobContainerClient プレースホルダーの値を置き換えます。 <EVENT_HUB_NAMESPACE><HUB_NAME> プレースホルダーと EventProcessorClient プレースホルダーの値も置き換えてください。

    コードの重要な手順を次に示します。

    1. Event Hubs 名前空間とイベント ハブ名を使用して、EventProcessorClient オブジェクトを作成します。 前に作成した Azure Storage でコンテナー用の BlobContainerClient オブジェクトを作成する必要があります。
    2. Eventprocessorclient オブジェクトの ProcessEventAsync および ProcessErrorAsync イベント用のハンドラーを指定します。
    3. EventProcessorClient オブジェクトで StartProcessingAsync を呼び出して、イベントの処理を開始します。
    4. 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_CONTAINER_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;
    }
    
  1. プロジェクトをビルドし、エラーがないことを確認します。

    より多くの情報を含むコメント付きの完全なソース コードについては、GitHub 上のこちらのファイルを参照してください。

  2. 受信側アプリを実行します。

  3. イベントが受信されたことを示すメッセージが表示されます。 受信したイベント メッセージが表示されたら、Enter キーを押します。

    Received event: Event 1
    Received event: Event 2
    Received event: Event 3    
    

    これらのイベントは、前に送信側プログラムを実行してイベント ハブに送信した 3 つのイベントです。

  4. Azure portal では、Event Hubs が受信側アプリケーションに送信した 3 つの送信メッセージがあることを確認できます。 ページを最新の情報に更新して、グラフを更新します。 メッセージが受信されたことが示されるまでに数秒かかることがあります。

    イベント ハブでイベントが受信側アプリに送信されたことを確認する Azure portal ページの画像

Event Hubs SDK ベースのアプリケーションのスキーマ検証

Event Hubs SDK ベースのアプリケーションでデータをストリーミングする場合、Azure スキーマ レジストリを使用してスキーマを検証できます。 Event Hubs の Azure スキーマ レジストリにはスキーマ管理用に一元化されたリポジトリが用意されており、新規または既存のアプリケーションとスキーマ レジストリをシームレスに接続できます。

詳細については、「Event Hubs SDK を使用してスキーマを検証する」を参照してください。

サンプルとリファレンス

このクイック スタートでは、イベントのバッチをイベント ハブに送信し、それらを受信するというシナリオを実装する詳細な手順を示します。 その他のサンプルについては、次のリンクを選択してください。

完全な .NET ライブラリ リファレンスについては、SDK のドキュメントを参照してください。

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

Event Hubs 名前空間を持つリソース グループを削除するか、リソース グループを保持する場合は名前空間のみを削除します。

次のチュートリアルを参照してください。