クイック スタート: Azure Event Grid 名前空間トピックからのメッセージの送受信 (.NET)

このクイックスタートでは、次の手順を実行します。

  1. Microsoft Azure portal を使用して Event Grid 名前空間を作成します。
  2. Microsoft Azure portal を使用して Event Grid 名前空間トピックを作成します。
  3. Microsoft Azure portal を使用してイベント サブスクリプションを作成します。
  4. トピックに一連のメッセージを送信するための .NET コンソール アプリケーションを作成する
  5. それらのメッセージをトピックから受信する .NET コンソール アプリケーションを作成する。

重要

名前空間、名前空間トピック、および名前空間トピックに関連付けられているイベント サブスクリプションは、次のリージョンでは利用できません:

  • 米国東部
  • 米国中部
  • 米国中南部
  • 米国西部 2
  • 東アジア
  • 東南アジア
  • 北ヨーロッパ
  • 西ヨーロッパ
  • アラブ首長国連邦北部

Note

このクイックスタートでは、メッセージのバッチを Event Grid 名前空間トピックに送信し、それらを受信するという簡単なシナリオを実装するステップバイステップの手順を説明します。 .NET クライアント ライブラリの概要については、「.NET 用 Azure Event Grid クライアントライブラリ」 (.NET 用 Azure Service Bus クライアント ライブラリ) を参照してください。 その他のサンプルについては、GitHub の Event Grid .NET サンプルを参照してください。

前提条件

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

  • Azure サブスクリプション。 Azure Event Grid を含む Azure サービスを使用するには、サブスクリプションが必要です。 Azure アカウントを持っていない場合、無料試用版でサインアップできます。
  • Visual Studio 2022. サンプル アプリケーションでは、C# 10 で導入された新機能を利用しています。 最新の構文を使用するには、.NET 6.0 以降をインストールし、言語バージョンを latest に設定することをお勧めします。 Visual Studio を使用している場合、Visual Studio 2022 より前のバージョンには、C# 10 プロジェクトをビルドするために必要なツールとの互換性がありません。

Azure Portal での名前空間の作成

Azure Event Grid の名前空間は、1 つ以上のトピック、クライアント、クライアント グループ、トピック空間、およびアクセス許可バインド用の論理コンテナーです。 一意の名前空間が提供されるため、同じ Azure リージョンに複数のリソースを持つことができます。 Azure Event Grid 名前空間を使用して、関連するリソースをまとめてグループ化し、Azure サブスクリプションの 1 つのユニットとして管理できるようになりました。

Azure Event Grid 名前空間を作成、表示、管理するには、次のセクションに従ってください。

名前空間を作成するには:

  1. Azure portal にサインインします。

  2. 検索ボックス「Event Grid 名前空間」と入力し、結果から [Event Grid 名前空間] を選択します。

    Screenshot showing Event Grid Namespaces in the search results.

  3. [Event Grid 名前空間] ページで、ツール バーの [+ 作成] を選択します。

    Screenshot showing Event Grid Namespaces page with the Create button on the toolbar selected.

  4. [基本] ページで、次の手順を行います。

    1. 名前空間を作成する [Azure サブスクリプション] を選択します。

    2. 既存のリソース グループを選択するか、新しいリソース グループを作成します。

    3. 名前空間の名前を入力します。

    4. 名前空間を作成するリージョンまたは場所を選択します。

    5. ページ下部にある [確認と作成] を選択します。

      Screenshot showing the Basics tab of Create namespace page.

  5. [Review + create] (確認 + 作成) タブで設定を確認し、[作成] を選択します。

  6. [デプロイメント成功] ページで、[リソースに移動] を選択して、対象の名前空間に移動します。

名前空間トピックの作成

  1. [Event Grid 名前空間] ページに表示されていない場合は、名前空間の作成、表示、管理の手順に従って、トピックの作成に使用する名前空間を表示します。

  2. [Event Grid 名前空間] ページで、左側のメニューの [イベント] セクションで [トピック] オプションを選択します。

  3. [トピック] ページで、コマンド バーの [+ トピック] ボタンを選択します。

    Screenshot showing Event Grid namespace topic creation.

  4. [トピックの作成] ページで、作成するトピックの名前を入力し、[作成] を選択します。

    Screenshot showing Event Grid namespace topic creation basics.

イベント サブスクリプションの作成

  1. Azure portal で Event Grid 名前空間の [トピック] ページを開いている場合は、トピックの一覧からトピックを選択します。 [トピック] ページを開いている場合は、名前空間トピックの作成、表示、管理の手順に従って、イベント サブスクリプションの作成に使用するトピックを特定します。

  2. [Event Gird 名前空間のトピック] ページで、左側のメニューの [エンティティ] セクションで [サブスクリプション] オプションを選択します。

  3. [サブスクリプション] ページで、コマンド バーの [+ サブスクリプション] ボタンを選択します。

    Screenshot showing Event Grid event subscription create.

  4. [基本] タブで、作成するトピックの名前を入力し、ページの下部にある [次へ: フィルター] を選択します。

    Screenshot showing Event Grid event subscription create basics.

  5. [フィルター] タブで、サブスクリプションでフィルター処理するイベントの種類の名前を追加し、サブスクリプションで使用するコンテキスト属性フィルターを追加します。 次に、ページの下部にある [次へ: 追加の機能] を選択します。

    Screenshot showing Event Grid event subscription create filters.

  6. [追加機能] タブでは、イベント リテンション期間、最大配信回数、ロック期間、配信不能設定を指定できます。

    Screenshot showing Event Grid event subscription create additional features.

  7. [作成] を選び、イベント サブスクリプションを作成します。

Azure に対してアプリを認証する

このクイック スタートでは、Azure Event Grid: 接続文字列 に接続する 2 つの方法を示します。

このドキュメントでは、接続文字列を使用して Event Grid 名前空間に接続する方法を示します。 Azure を初めて使用する場合は、接続文字列オプションの方が理解しやすいかもしれません。

新しい Event Grid 名前空間を作成すると、プライマリ キーとセカンダリ キーが自動的に生成され、あらゆる角度から名前空間を完全に制御することが可能になります。

クライアントは、接続文字列を使用して Event Grid 名前空間に接続できます。 名前空間トピックのアクセスキーをコピーするには、次の手順を実行します:

  1. [Event Grid 名前空間] ページで、[トピック] を選択します。
  2. アクセスする必要があるトピックを選択します。
  3. [アクセス キー] ページで、キー 1 または キー 2 の横にあるコピー ボタンを選択して、後で使用するためにアクセス キーをクリップボードにコピーします。 この値をメモ帳などに一時的に貼り付けます。

Visual Studio を起動する

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

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

トピックにメッセージを送信する

このセクションでは、Event Grid トピックにメッセージを送信する .NET コンソール アプリケーションを作成する方法を示します。

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

  1. Visual Studio で、[ファイル] ->[新規作成] ->[プロジェクト] メニューを選択します。

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

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

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

    3. 結果の一覧から [コンソール アプリ] を選択します。

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

      Screenshot showing the Create a new project dialog box with C# and Console selected.

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

    Screenshot showing the solution and project names in the Configure your new project dialog box.

  4. [追加情報] ページで、 [作成] を選択してソリューションとプロジェクトを作成します。

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

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

  2. 次のコマンドを実行して、Azure.Messaging.EventGrid NuGet パッケージをインストールします:

    Install-Package Azure.Messaging.EventGrid -version 4.22.0-beta.1
    

名前空間トピックにイベントを送信するコードを追加する

  1. Program.cs の内容を以下のコードに置き換えます。 重要な手順の概要を示します。コード コメントに追加情報が記載されています。

    重要

    コード スニペット内のプレースホルダー値 (<ENDPOINT><TOPIC-NAME><TOPIC-ACCESS-KEY><TOPIC-SUBSCRIPTION-NAME>) をトピック エンドポイント、トピック名、トピック キー、トピックのサブスクリプション名で更新します。

    using Azure.Messaging;
    using Azure;
    using Azure.Messaging.EventGrid.Namespaces;    
    
    // TODO: Replace the <ENDPOINT> , <TOPIC-KEY> and <TOPIC-NAME> placeholder
    
    var topicEndpoint = "<TOPIC-ENDPOINT>"; // Should be in the form: https://namespace01.eastus-1.eventgrid.azure.net. 
    var topicKey = "<TOPIC-ACCESS-KEY>";
    var topicName = "<TOPIC-NAME>";
    var subscription = "<TOPIC-SUBSCRIPTION-NAME>";
    
    // Construct the client using an Endpoint for a namespace as well as the access key
    var client = new EventGridClient(new Uri(topicEndpoint), new AzureKeyCredential(topicKey));
    
    // Publish a single CloudEvent using a custom TestModel for the event data.
    var @ev = new CloudEvent("employee_source", "type", new TestModel { Name = "Bob", Age = 18 });
    await client.PublishCloudEventAsync(topicName, ev);
    
    // Publish a batch of CloudEvents.
    
    await client.PublishCloudEventsAsync(
    topicName,
    new[] {
        new CloudEvent("employee_source", "type", new TestModel { Name = "Tom", Age = 55 }),
        new CloudEvent("employee_source", "type", new TestModel { Name = "Alice", Age = 25 })});
    
    Console.WriteLine("Three events have been published to the topic. Press any key to end the application.");
    Console.ReadKey();
    
    public class TestModel
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }    
    
    
  2. プロジェクトをビルドし、エラーがないことを確認します。

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

    Three events have been published to the topic. Press any key to end the application.
    

    重要

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

  4. Azure portal で次の手順を実行します。

    1. Event Grid 名前空間に移動します。

    2. [概要] ページには、名前空間に投稿されたイベントの数がグラフに表示されます。

      Screenshot showing the Event Grid Namespace page in the Azure portal.

トピックからメッセージをプルする

このセクションでは、トピックからメッセージを受信する .NET コンソール アプリケーションを作成します。

公開された CloudEvents を受け取るプロジェクトを作成する

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

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

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

  2. 次のコマンドを実行して、Azure.Messaging.EventGrid NuGet パッケージをインストールします。 既定のプロジェクトがまだ設定されていない場合は、EventReceiver を選択します。

    Install-Package Azure.Messaging.EventGrid -version 4.22.0-beta.1
    

    Screenshot showing EventReceiver project selected in the Package Manager Console.

トピックからイベントを受信するコードを追加する

このセクションでは、キューからメッセージを取得するコードを追加します。

  1. Program クラス内に、次のコードを追加します。

    重要

    コード スニペット内のプレースホルダー値 (<ENDPOINT><TOPIC-NAME><TOPIC-ACCESS-KEY><TOPIC-SUBSCRIPTION-NAME>) をトピック エンドポイント、トピック名、トピック キー、トピックのサブスクリプション名で更新します。

    using Azure;
    using Azure.Messaging;
    using Azure.Messaging.EventGrid.Namespaces;
    
    var topicEndpoint = "<TOPIC-ENDPOINT>"; // Should be in the form: https://namespace01.eastus-1.eventgrid.azure.net. 
    var topicKey = "<TOPIC-ACCESS-KEY>";
    var topicName = "<TOPIC-NAME>";
    var subscription = "<TOPIC-SUBSCRIPTION-NAME>";
    
    // Construct the client using an Endpoint for a namespace as well as the access key
    var client = new EventGridClient(new Uri(topicEndpoint), new AzureKeyCredential(topicKey));
    
    // Receive the published CloudEvents
    ReceiveResult result = await client.ReceiveCloudEventsAsync(topicName, subscription, 3);
    
    Console.WriteLine("Received Response");
    Console.WriteLine("-----------------");
    
    
  2. Program クラスの末尾に次のメソッドを追加します。

    // handle received messages. Define these variables on the top.
    
    var toRelease = new List<string>();
    var toAcknowledge = new List<string>();
    var toReject = new List<string>();
    
    // Iterate through the results and collect the lock tokens for events we want to release/acknowledge/result
    
    foreach (ReceiveDetails detail in result.Value)
    {
        CloudEvent @event = detail.Event;
        BrokerProperties brokerProperties = detail.BrokerProperties;
        Console.WriteLine(@event.Data.ToString());
    
        // The lock token is used to acknowledge, reject or release the event
        Console.WriteLine(brokerProperties.LockToken);
        Console.WriteLine();
    
        // If the event is from the "employee_source" and the name is "Bob", we are not able to acknowledge it yet, so we release it
        if (@event.Source == "employee_source" && @event.Data.ToObjectFromJson<TestModel>().Name == "Bob")
        {
            toRelease.Add(brokerProperties.LockToken);
        }
        // acknowledge other employee_source events
        else if (@event.Source == "employee_source")
        {
            toAcknowledge.Add(brokerProperties.LockToken);
        }
        // reject all other events
        else
        {
            toReject.Add(brokerProperties.LockToken);
        }
    }
    
    // Release/acknowledge/reject the events
    
    if (toRelease.Count > 0)
    {
        ReleaseResult releaseResult = await client.ReleaseCloudEventsAsync(topicName, subscription, new ReleaseOptions(toRelease));
    
        // Inspect the Release result
        Console.WriteLine($"Failed count for Release: {releaseResult.FailedLockTokens.Count}");
        foreach (FailedLockToken failedLockToken in releaseResult.FailedLockTokens)
        {
            Console.WriteLine($"Lock Token: {failedLockToken.LockToken}");
            Console.WriteLine($"Error Code: {failedLockToken.Error}");
            Console.WriteLine($"Error Description: {failedLockToken.ToString}");
        }
    
        Console.WriteLine($"Success count for Release: {releaseResult.SucceededLockTokens.Count}");
        foreach (string lockToken in releaseResult.SucceededLockTokens)
        {
            Console.WriteLine($"Lock Token: {lockToken}");
        }
        Console.WriteLine();
    }
    
    if (toAcknowledge.Count > 0)
    {
        AcknowledgeResult acknowledgeResult = await client.AcknowledgeCloudEventsAsync(topicName, subscription, new AcknowledgeOptions(toAcknowledge));
    
        // Inspect the Acknowledge result
        Console.WriteLine($"Failed count for Acknowledge: {acknowledgeResult.FailedLockTokens.Count}");
        foreach (FailedLockToken failedLockToken in acknowledgeResult.FailedLockTokens)
        {
            Console.WriteLine($"Lock Token: {failedLockToken.LockToken}");
            Console.WriteLine($"Error Code: {failedLockToken.Error}");
            Console.WriteLine($"Error Description: {failedLockToken.ToString}");
        }
    
        Console.WriteLine($"Success count for Acknowledge: {acknowledgeResult.SucceededLockTokens.Count}");
        foreach (string lockToken in acknowledgeResult.SucceededLockTokens)
        {
            Console.WriteLine($"Lock Token: {lockToken}");
        }
        Console.WriteLine();
    }
    
    if (toReject.Count > 0)
    {
        RejectResult rejectResult = await client.RejectCloudEventsAsync(topicName, subscription, new RejectOptions(toReject));
    
        // Inspect the Reject result
        Console.WriteLine($"Failed count for Reject: {rejectResult.FailedLockTokens.Count}");
        foreach (FailedLockToken failedLockToken in rejectResult.FailedLockTokens)
        {
            Console.WriteLine($"Lock Token: {failedLockToken.LockToken}");
            Console.WriteLine($"Error Code: {failedLockToken.Error}");
            Console.WriteLine($"Error Description: {failedLockToken.ToString}");
        }
    
        Console.WriteLine($"Success count for Reject: {rejectResult.SucceededLockTokens.Count}");
        foreach (string lockToken in rejectResult.SucceededLockTokens)
        {
            Console.WriteLine($"Lock Token: {lockToken}");
        }
        Console.WriteLine();
    }
    
    public class TestModel
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }    
    

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

Microsoft Azure portal で Event Grid 名前空間に移動し、Azure portal で [削除] を選択して名前空間とそのトピックを削除します。

.NET API 機能」を参照してください。