Azure Event Grid 名前空間の概念

この記事では、名前空間トピックに関連する主な概念と機能について説明します。

イベント

イベントは、システム内で発生した何かを詳細に記述する最小限の情報です。 イベントは、アクションにつながる洞察を提供する、システムに関する独立した固有の事実を表すため、よく「離散イベント」と呼ばれます。 すべてのイベントは、イベントの source、イベントが発生した time、一意識別子などの一般的な情報を持っています。 イベントには type もあります。これは通常、イベントが使用されるアナウンスの種類を記述する一意の識別子です。

たとえば、Azure Storage に作成される新しいファイルに関するイベントには、lastTimeModified 値などのファイルの詳細が含まれます。 Event Hubs イベントには、キャプチャ ファイルの URL が含まれます。 Orders マイクロサービスの新しい注文に関するイベントには、注文の状態表現を示す orderId 属性と URL 属性が含まれる場合があります。 イベントの種類には、com.yourcompany.Orders.OrderCreatedorg.yourorg.GeneralLedger.AccountChangedio.solutionname.Auth.MaximumNumberOfUserLoginAttemptsReached などの例があります。

イベントの例を次に示します。

{
    "specversion" : "1.0",
    "type" : "com.yourcompany.order.created",
    "source" : "/orders/account/123",
    "subject" : "O-28964",
    "id" : "A234-1234-1234",
    "time" : "2018-04-05T17:31:00Z",
    "comexampleextension1" : "value",
    "comexampleothervalue" : 5,
    "datacontenttype" : "application/json",
    "data" : {
       "orderId" : "O-28964",
       "URL" : "https://com.yourcompany/orders/O-28964"
    }
}

別の種類のイベント

ユーザー コミュニティでは、1 回のデバイス読み取りや Web アプリケーション ページでの 1 回のクリックなど、データ ポイントを伝えるメッセージのことも「イベント」と呼びます。 このようなイベントは、通常、分析情報を導き出してアクションを実行するために、所定の時間枠で分析されます。 Event Grid のドキュメントでは、この種類のイベントをデータ ポイントストリーミング データ、または単にテレメトリと呼びます。 他の種類のメッセージの中でも、この種のイベントは Event Grid のメッセージ キュー テレメトリ トランスポート (MQTT) ブローカー機能で使用されます。

CloudEvents

Event Grid 名前空間トピックでは、JSON 形式HTTP プロトコル バインド を使用して、Cloud Native Computing Foundation (CNCF) のオープン標準の CloudEvents 1.0 仕様に準拠するイベントを受け入れます。 CloudEvent は、イベント データと呼ばれる、通信内容とそれに関するメタデータを入れた一種のメッセージです。 イベント ドリブン アーキテクチャのイベント データでは、通常、システム状態の変化を通知する情報が伝送されます。 CloudEvents メタデータは、メッセージの送信元 (ソース システム)、その種類など、メッセージに関するコンテキスト情報を提供する一連の属性で構成されます。CloudEvents 仕様に準拠するすべての有効なメッセージには、次の必須コンテキスト属性を含める必要があります。

さらに、CloudEvents 仕様では、Event Grid を使用するときに含めることができる省略可能なコンテキスト属性拡張コンテキスト属性も定義します。

Event Grid を使用する場合、推奨されるイベント形式は CloudEvents です。これは、ユース ケース (イベントやイベント形式などを転送するためのモード) が十分に文書化されており、拡張性があり、相互運用性が高いためです。 CloudEvents を使用すると、イベントを発行したり使用したりするための共通のイベント形式を提供して、相互運用性を向上させることができます。 これにより、ツールを統一化して、イベントのルーティングや処理方法を標準化することができます。

CloudEvents コンテンツ モード

CloudEvents 仕様では、3 つのコンテンツ モードが定義されています。これらは、バイナリ構造化バッチです。

重要

どのコンテンツ モードでも、テキスト (JSON、テキスト/* など) やバイナリ エンコードのイベント データを交換できます。 バイナリ コンテンツ モードは、バイナリ データの送信専用に使用されるわけではありません。

コンテンツ モードは、使用するエンコードがバイナリかテキストかということではなく、イベント データとそのメタデータが記述および交換される方法に関する種類を示します。 構造化コンテンツ モードでは、JSON オブジェクトなどの 1 つの構造が使用されます。ここでは、コンテキスト属性とイベント データの両方が HTTP ペイロード内にまとめて配置されます。 バイナリ コンテンツ モードでは、HTTP ヘッダーにマップされるコンテキスト属性と、Content-Type で設定されるメディアの種類に従ってエンコードされる HTTP ペイロードであるイベント データが分離されます。

CloudEvents サポート

次の表に、CloudEvents 仕様の現在のサポートを示します。

CloudEvents コンテンツ モード サポート対象
構造化された JSON はい
構造化された JSON バッチ処理 はい (イベントを発行する場合)
Binary はい (イベントを発行する場合)

イベントの最大許容サイズは 1 MB です。 64 KB を超えるイベントは、64 KB の増分単位で課金されます。

構造化コンテンツ モード

CloudEvents 構造化コンテンツ モードのメッセージには、HTTP ペイロード内のコンテキスト属性とイベント データの両方が含まれます。

重要

現在、Event Grid では、HTTP で CloudEvents JSON 形式がサポートされています。

JSON 形式を使用した構造化モードの CloudEvent の例を次に示します。 メタデータ ("data" ではないすべての属性) とメッセージ/イベント データ ("data" オブジェクト) の両方が JSON を使用して記述されます。 この例には、必要なすべてのコンテキスト属性と、いくつかの省略可能な属性 (subjecttimedatacontenttype) と拡張属性 (comexampleextension1comexampleothervalue) が含まれています。

{
    "specversion" : "1.0",
    "type" : "com.yourcompany.order.created",
    "source" : "/orders/account/123",
    "subject" : "O-28964",
    "id" : "A234-1234-1234",
    "time" : "2018-04-05T17:31:00Z",
    "comexampleextension1" : "value",
    "comexampleothervalue" : 5,
    "datacontenttype" : "application/json",
    "data" : {
       "orderId" : "O-28964",
       "URL" : "https://com.yourcompany/orders/O-28964"
    }
}

構造化されたコンテンツに JSON 形式を使用して、JSON 値ではないイベント データを送信することができます。 これを行うため、次の手順を実行します。

  1. データがエンコードされるメディアの種類を持つ datacontenttype 属性を含めます。
  2. メディアの種類が text/plaintext/csvapplication/xml などのテキスト形式でエンコードされる場合は、data 属性を使用し、通信している内容を格納する JSON 文字列をその値として設定する必要があります。
  3. メディアの種類がバイナリ エンコードになる場合は、data_base64 属性を使用し、BASE64 でエンコードされたバイナリ値を格納する JSON 文字列をその値として設定する必要があります。

たとえば、この CloudEvent は、Protobuf メッセージを交換するために application/protobuf でエンコードされたイベント データを伝送します。

{
    "specversion" : "1.0",
    "type" : "com.yourcompany.order.created",
    "source" : "/orders/account/123",
    "id" : "A234-1234-1234",
    "time" : "2018-04-05T17:31:00Z",
    "datacontenttype" : "application/protobuf",
    "data_base64" : "VGhpcyBpcyBub3QgZW5jb2RlZCBpbiBwcm90b2J1ZmYgYnV0IGZvciBpbGx1c3RyYXRpb24gcHVycG9zZXMsIGltYWdpbmUgdGhhdCBpdCBpcyA6KQ=="
}

data 属性または data_base64 属性の使用の詳細については、Handling of data (データの処理) をご覧ください。

このコンテンツ モードの詳細については、CloudEvents の HTTP 構造化コンテンツ モードの仕様に関する記事をご覧ください。

バッチ コンテンツ モード

現在、Event Grid では、CloudEvents を Event Grid に発行するときに JSON バッチ コンテンツ モードをサポートしています。 このコンテンツ モードでは、構造化コンテンツ モードで CloudEvents を格納する JSON 配列が使用されます。 たとえば、アプリケーションでは、次のような配列を使用して 2 つのイベントを発行できます。 同様に、Event Grid のデータ プレーン SDK を使用している場合、このペイロードも送信されます。

[
    {
        "specversion": "1.0",
        "id": "E921-1234-1235",
        "source": "/mycontext",
        "type": "com.example.someeventtype",
        "time": "2018-04-05T17:31:00Z",
        "data": "some data"
    },
    {
        "specversion": "1.0",
        "id": "F555-1234-1235",
        "source": "/mycontext",
        "type": "com.example.someeventtype",
        "time": "2018-04-05T17:31:00Z",
        "data": {
            "somekey" : "value",
            "someOtherKey" : 9
        }
    }
]

詳細については、CloudEvents のバッチ コンテンツ モード仕様に関する記事をご覧ください。

バッチ処理

アプリケーションでは、複数のイベントを 1 つの配列にまとめてバッチ処理する必要があります。そうすれば、1 回の発行要求で効率とスループットを高めて処理できます。 バッチは最大 1 MB とすることができ、イベントの最大サイズは 1 MB です。

バイナリ コンテンツ モード

バイナリ コンテンツ モードの CloudEvent では、コンテキスト属性が HTTP ヘッダーとして記述されています。 HTTP ヘッダーの名前は、コンテキスト属性の前に ce- が付いた名前になっています。 Content-Type ヘッダーには、イベント データがエンコードされるメディアの種類が反映されます。

重要

バイナリ コンテンツ モードを使用する場合、ce-datacontenttype HTTP ヘッダーを配置してはなりません。

重要

バイナリ コンテンツ モードを使用するときに独自の属性 (つまり拡張属性) を含める場合は、名前が ASCII 文字の小文字 ('a' から 'z') または数字 ('0' から '9') で構成されていること、および長さが 20 文字を超えないようにしてください。 つまり、CloudEvents コンテキスト属性に名前を付けるための名前付け規則は、有効な HTTP ヘッダー名よりも制限が厳しくなっています。 すべての有効な HTTP ヘッダー名が有効な拡張属性名であるわけではありません。

HTTP ペイロードは、Content-Type のメディアの種類に従ってエンコードされたイベント データです。

コンテンツ バイナリ モードで CloudEvent を発行するために使用される HTTP 要求は、次の例のようになります。

POST / HTTP/1.1
HOST mynamespace.eastus-1.eventgrid.azure.net/topics/mytopic
ce-specversion: 1.0
ce-type: com.example.someevent
ce-source: /mycontext
ce-id: A234-1234-1234
ce-time: 2018-04-05T17:31:00Z
ce-comexampleextension1: value
ce-comexampleothervalue: 5
content-type: application/protobuf

Binary data according to protobuf encoding format. No context attributes are included.

CloudEvents のバイナリ コンテンツ モードまたは構造化コンテンツ モードを使用する場面

ホップとプロトコルをまたいで CloudEvent を転送するための簡単なアプローチが必要な場合は、構造化コンテンツ モードを使用できます。 構造化コンテンツ モードの CloudEvents にはメッセージとそのメタデータが含まれるため、クライアントはメッセージ全体を使用して他のシステムに転送するのが簡単です。

ダウンストリーム アプリケーションがメッセージのみを必要としていて追加情報 (つまりコンテキスト属性) は不要であることがわかっている場合は、バイナリ コンテンツ モードを使用できます。 構造化コンテンツ モードでも CloudEvent からイベント データ (メッセージ) を取得できますが、コンシューマー アプリケーションの HTTP ペイロード内にイベント データだけを含んでいる方が簡単です。 たとえば、他のアプリケーションは他のプロトコルを使用することができて、必要なのは中核となるメッセージのみで、メタデータではない場合もあります。 実際、メタデータは、直接の最初のホップに対してだけしか意味を持たない場合があります。 この場合、交換するデータをメタデータとは別にして扱うことで、処理と転送が容易になります。

ディストリビューターのプロパティ

発行元は、Event Grid にイベントを送信するアプリケーションです。 イベントが発生したアプリケーション (イベント ソース) と同じアプリケーションで処理を行う場合もあります。 名前空間トピックを使用する場合は、独自のアプリケーションからイベントを発行できます。

イベント ソース

イベント ソースは、イベントの発生場所です。 各イベント ソースは、1 つまたは複数のイベントの種類をサポートします。 たとえば、使用するアプリケーションは、システムで定義されるカスタム イベントのイベント ソースであるとします。 名前空間トピックを使用する場合、サポートされるイベント ソースは独自のアプリケーションです。

名前空間

Event Grid 名前空間は、次のリソースの管理コンテナーです。

リソース サポートされているプロトコル
名前空間トピック HTTP
トピック空間 MQTT
クライアント MQTT
クライアント グループ MQTT
CA 証明書 MQTT
アクセス許可バインド MQTT

Azure Event Grid 名前空間を使用する場合、関連するリソースをグループ化し、Azure サブスクリプションの 1 つの単位として管理できます。 一意の完全修飾ドメイン名 (FQDN) が提供されます。

名前空間では、次の 2 つのエンドポイントが公開されます。

  • 名前空間トピックを使用して一般的なメッセージング要件をサポートする HTTP エンドポイント。
  • MQTT を使用する IoT メッセージングまたはソリューション用の MQTT エンドポイント。

名前空間には、DNS 統合ネットワーク エンドポイントも用意されています。 そこでは、一連のアクセス制御およびネットワーク統合管理機能 (パブリック IP イングレス フィルタリング、プライベート リンクなど) も提供されます。 また、名前空間は、そこに含まれているリソースに使用されるマネージド ID のコンテナーでもあります。

名前空間に関するその他のポイントをいくつか次に示します。

  • 名前空間は、tagslocation のプロパティを持つ追跡されたリソースであり、一度作成すると resources.azure.com 上で見つけることができます。
  • 名前空間の名前は、3 から 50 文字の長さにすることができます。 英数字とハイフン (-) を含めることができ、スペースを含めることはできません。
  • 名前はリージョンごとに一意である必要があります。
  • 現在サポートされているリージョン: 米国中部、東アジア、米国東部、米国東部 2、北ヨーロッパ、米国中南部、東南アジア、アラブ首長国連邦北部、西ヨーロッパ、米国西部 2、米国西部 3。

スループット ユニット

スループット ユニット (TU) は、名前空間のイングレスおよびエグレス イベント レート容量を定義します。 詳細については、「Azure Event Grid のクォータと制限」をご覧ください。

トピック

トピックには、Event Grid に発行されたイベントが保持されます。 通常、関連するイベントのコレクションにはトピック リソースを使用します。 通常、名前空間内のトピックのことを、名前空間トピックと呼びます。

名前空間トピック

名前空間トピックは、Event Grid 名前空間内に作成されるトピックです。 アプリケーションは、発行されたイベントが論理的に含まれる名前空間トピックを指定して、HTTP 名前空間エンドポイントにイベントを発行します。 アプリケーションを設計するときに、作成するトピック数を決定する必要があります。 比較的大規模なソリューションの場合、関連するイベントのカテゴリごとに名前空間を作成します。 たとえば、ユーザー アカウントを管理するアプリケーションと、顧客の注文に関する別のアプリケーションを考えてみましょう。 すべてのイベント サブスクライバーが両方のアプリケーションのイベントを必要とする可能性は低いです。 懸念事項を分離するには、アプリケーションごとに 1 つずつ、2 つの名前空間トピックを作成します。 イベント コンシューマーが要件に従ってトピックをサブスクライブできるようにします。 小規模なソリューションの場合、すべてのイベントを 1 つのトピックに送信することをお勧めします。

名前空間トピックでは、プル配信プッシュ配信がサポートされます。 プル配信またはプッシュ配信を使用するタイミングを確認すると、要件に応じてプル配信が適切なアプローチかどうかを判断するのに役立ちます。

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

イベント サブスクリプションは、1 つのトピックに関連付けられた構成リソースです。 特に、イベント サブスクリプションを使用してイベント選択条件を設定し、特定のトピックで利用できるイベントの全セットの中でサブスクライバーが使用できるイベント コレクションを定義します。 サブスクライバーの要件に従ってイベントをフィルター処理できます。 たとえば、イベントの種類でイベントをフィルター処理できます。 data プロパティの値として JSON オブジェクトを使用する場合は、イベント データ プロパティにフィルター条件を定義することもできます。 リソースのプロパティの詳細については、Event Grid REST API でコントロール プレーン操作を探してください。

トピックと関連付けられたイベント サブスクリプションを表す図。

名前空間トピックのサブスクリプションを作成する例については、Publish and consume messages using namespace topics using CLI (CLI を使用して名前空間トピックを使用してメッセージを発行および使用する) をご覧ください。

Note

名前空間トピックの下のイベント サブスクリプションは、カスタム、ドメイン、パートナー、およびシステム トピック (Event Grid Basic) に使用されるサブスクリプションと比較して、簡略化されたリソース モデルになっています。 詳細については、イベント サブスクリプションの作成、表示、および管理に関するページを参照してください。

プル配信

プル配信を使用すると、アプリケーションは Event Grid に接続し、キューに似たセマンティクスを使用してメッセージを読み取ります。 アプリケーションは、Event Grid に接続してイベントを使用すると、イベント消費率とそのタイミングを制御します。 コンシューマー アプリケーションは、Event Grid に接続するときにプライベート エンドポイントを使用して、プライベート IP 空間を使用してイベントを読み取ることもできます。

プル配信では、メッセージを読み取り、メッセージの状態を制御するための次の操作がサポートされています: 受信確認リリース拒否ロックの更新。 詳細については、pull delivery overview (プル配信の概要) をご覧ください。

プル配信を使用してイベントを受信するときのデータ シェイプ

プル配信を使用してイベントを配信するとき、Event Grid にはオブジェクトの配列が含まれ、その配列に event オブジェクトと brokerProperties オブジェクトが含まれます。 event プロパティの値は、構造化コンテンツ モードで配信される CloudEvent です。 brokerProperties オブジェクトには、配信された CloudEvent に関連付けられているロック トークンが含まれています。 次の json オブジェクトは、2 つのイベントを返す受信操作からの応答のサンプルです。

{
    "value": [
        {
            "brokerProperties": {
                "lockToken": "CiYKJDUwNjE4QTFFLUNDODQtNDZBQy1BN0Y4LUE5QkE3NjEwNzQxMxISChDXYS23Z+5Hq754VqQjxywE",
                "deliveryCount": 2
            },
            "event": {
                "specversion": "1.0",
                "id": "A234-1234-1235",
                "source": "/mycontext",
                "time": "2018-04-05T17:31:00Z",
                "type": "com.example.someeventtype",
                "data": "some data"
            }
        },
        {
            "brokerProperties": {
                "lockToken": "CiYKJDUwNjE4QTFFLUNDODQtNDZBQy1BN0Y4LUE5QkE3NjEwNzQxMxISChDLeaL+nRJLNq3/5NXd/T0b",
                "deliveryCount": 1
            },
            "event": {
                "specversion": "1.0",
                "id": "B688-1234-1235",
                "source": "/mycontext",
                "type": "com.example.someeventtype",
                "time": "2018-04-05T17:31:00Z",
                "data": {
                    "somekey" : "value",
                    "someOtherKey" : 9
                }
            }
        }
    ]
}

プッシュ配信

プッシュ配信では、Event Grid は、push (配信モード) イベント サブスクリプションで構成された宛先にイベントを送信します。 宛先がイベントを受信できない場合に備えて、堅牢な再試行ロジックが提供されます。

重要

Event Grid 名前空間のプッシュ配信では、現在、Azure Event Hubs を宛先としてサポートしています。 今後、Event Grid 名前空間では、Event Grid Basic でサポートされているすべての宛先を含め、より多くの宛先がサポートされる予定です。

Event Hubs イベント配信

Event Grid では、Event Hubs の SDK を使用して、AMQP を使用して Event Hubs にイベントを送信します。 イベントは、CloudEvent を格納する配列内の各要素を含むバイト配列として送信されます。

プッシュとプル配信

Event Grid は、HTTP を使用してプッシュとプルのイベント配信をサポートしています。 プッシュ配信では、イベント サブスクリプション、Webhook、または Azure サービス内に、Event Grid がイベントを送信する宛先を定義します。 プル配信では、サブスクライバー アプリケーションは Event Grid に接続してイベントを使用します。 プル配信は、Event Grid 名前空間内のトピックでサポートされています。

重要

Event Hubs は、名前空間トピックへのサブスクリプションの宛先としてサポートされています。 今後のリリースでの Event Grid 名前空間では、Event Grid Basic で現在使用できるすべての宛先と、追加の宛先がサポートされます。

プッシュ配信とプル配信および関係するリソースの種類を示す概要図。

プッシュ配信とプル配信を使用するケース

どのような場合にプル配信またはプッシュ配信を使用するかを決定するのに役立つ一般的なガイドラインを次に示します。

プル配信

  • イベントを受信するタイミングを完全に制御する必要があるとき。 たとえば、アプリケーションが常に稼働していないか、十分に安定していないか、特定の時間にデータを処理する場合があります。
  • イベントの消費を完全に制御する必要があるとき。 たとえば、コンシューマー アプリケーションのダウンストリーム サービスまたはレイヤーに、イベントの処理を妨げる問題が発生する場合があります。 その場合、プル配信 API を使用すると、コンシューマー アプリが既に読み取ったイベントを後で配信できるように、ブローカーに戻すことができます。
  • イベントを受信するときにプライベート リンクを使用する必要があり、これはプッシュ配信ではなく、プル配信でのみ可能です。
  • エンドポイントを公開してプッシュ配信を使用する機能はありませんが、Event Grid に接続してイベントを消費できます。

プッシュ配信

  • システム状態の変化が発生したことを判別するための定期的なポーリングを回避する必要があるとき。 Event Grid を使用して、状態の変化が発生した時点でイベントを送信するようにできます。
  • 送信呼び出しを行うことができないアプリケーションがあるとき。 たとえば、組織がデータ流出を懸念している場合があります。 ただし、アプリケーションはパブリック エンドポイントを経由でイベントを受信できます。

次のステップ