適用于 Python 的 Azure 事件方格 用戶端程式庫 - 4.17.0b1 版

Azure Event Grid 是完全受控的智慧型事件路由服務,可讓統一事件耗用量使用發佈-訂閱模型。

| 原始程式碼套件 (PyPI) | 封裝 (Conda) | API 參考檔 | 產品檔 | 樣品 | Changelog

免責聲明

這是 Azure EventGrid 的 EventGridClient Beta 版本,以及 GA EventGridPublisherClientEventGridClient 支援 publish_cloud_eventsreceive_cloud_eventsacknowledge_cloud_eventsrelease_cloud_events 、、 reject_cloud_eventsrenew_cloud_event_locks 作業。 如需詳細資訊,請參閱 範例

開始使用

Prerequisites

安裝套件

使用pip安裝適用于 Python 的 Azure 事件方格 用戶端程式庫:

pip install azure-eventgrid

如果您使用 Azure CLI,請將 和 <resource-name> 取代 <resource-group-name> 為您自己的唯一名稱。

建立事件方格主題

az eventgrid topic --create --location <location> --resource-group <resource-group-name> --name <resource-name>

建立事件方格網域

az eventgrid domain --create --location <location> --resource-group <resource-group-name> --name <resource-name>

驗證用戶端

若要與事件方格服務互動,您必須建立用戶端的實例。 必須有 端點認證 ,才能具現化用戶端物件。

使用 Azure Active Directory (AAD)

Azure 事件方格提供與 Azure Active Directory (Azure AD) 的整合,以進行要求的身分識別型驗證。 透過 Azure AD,您可以使用角色型存取控制 (RBAC) ,將Azure 事件方格資源的存取權授與使用者、群組或應用程式。

若要使用 TokenCredential 將事件傳送至主題或網域,已驗證的身分識別應該已指派「EventGrid 資料傳送者」角色。

azure-identity透過套件,您可以在開發和生產環境中順暢地授權要求。 若要深入瞭解 Azure Active Directory,請參閱azure-identity 讀我檔案

例如,您可以使用 DefaultAzureCredential 來建構將使用 Azure Active Directory 進行驗證的用戶端:

from azure.identity import DefaultAzureCredential
from azure.eventgrid import EventGridPublisherClient, EventGridEvent

default_az_credential = DefaultAzureCredential()
endpoint = os.environ["EVENTGRID_TOPIC_ENDPOINT"]
client = EventGridPublisherClient(endpoint, default_az_credential)

查閱端點

您可以在事件方格主題資源中找到Azure 入口網站主題端點。 這看起來會像這樣: "https://<event-grid-topic-name>.<topic-location>.eventgrid.azure.net/api/events"

使用 AzureKeyCredential 建立用戶端

若要使用 Access 金鑰作為 credential 參數,請將金鑰當做字串傳遞至 AzureKeyCredential的實例。

注意: 存取金鑰可以在 Azure 入口網站的 [事件方格主題] 資源的 [存取金鑰] 功能表中找到。 它們也可以透過 Azure CLI 或連結 azure-mgmt-eventgrid 庫取得。 您可以在這裡找到取得存取金鑰的指南。

import os
from azure.eventgrid import EventGridPublisherClient
from azure.core.credentials import AzureKeyCredential

topic_key = os.environ["EVENTGRID_TOPIC_KEY"]
endpoint = os.environ["EVENTGRID_TOPIC_ENDPOINT"]

credential_key = AzureKeyCredential(topic_key)
client = EventGridPublisherClient(endpoint, credential_key)

注意: 用戶端也可以使用 透過 SAS 簽章 AzureSasCredential 進行驗證。 示範此專案的範例 可在這裡 取得 (async_version) 。

注意: 方法 generate_sas 可用來產生共用存取簽章。 您可以 在這裡看到示範這一點的範例。

重要概念

主題

主題是 EventGrid 服務內用來傳送事件的通道。 主題接受的事件架構是在建立主題時決定的。 如果架構類型的事件傳送至需要不同架構類型的主題,將會引發錯誤。

網域

事件 網域 是與相同應用程式相關的大量事件方格主題管理工具。 它們讓您能夠將事件發行到數千個主題。 網域也可讓您對每個主題進行授權和驗證控制。 如需詳細資訊,請造訪 事件網域概觀

當您建立事件網域時,此網域的發佈端點可供您使用。 此程式類似于建立事件方格主題。 唯一的差別在於,發佈至網域時,您必須在您想要傳遞事件的網域內指定主題。

事件結構描述

事件是最少量的資訊,可完整描述系統中發生的情況。 建立自訂主題或網域時,您必須指定發行事件時將使用的架構。

事件方格支援多個編碼事件的架構。

事件格線結構描述

雖然您可以將主題設定為使用 自訂架構,但使用已定義的事件方格架構比較常見。 請參閱 這裡的規格和需求。

CloudEvents v1.0 結構描述

另一個選項是使用 CloudEvents v1.0 架構。 CloudEvents 是 Cloud Native Computing Foundation 專案,可產生一個規格,以常見方式描述事件資料。 您可以 在這裡找到 CloudEvents 的服務摘要。

EventGridPublisherClient

EventGridPublisherClient 提供作業,以將事件資料傳送至用戶端初始化期間所指定的主題主機名稱。

不論您的主題或網域設定為使用的架構為何, EventGridPublisherClient 都會用來將事件發佈至該架構。 使用方法 send 發佈事件。

允許傳送下列事件格式:

  • 強型別 EventGridEvents 的清單或單一實例。

  • 序列化 EventGridEvent 物件的聽寫表示。

  • 強型別 CloudEvents 的清單或單一實例。

  • 序列化 CloudEvent 物件的聽寫表示。

  • 任何自訂架構的聽寫表示。

請查看 範例 以取得詳細範例。

注意: 在發佈之前,請務必知道您的主題是否支援 CloudEvents 或 EventGridEvents。 如果您傳送至不支援所傳送事件架構的主題,send () 將會擲回例外狀況。

系統主題

事件方格中的系統主題代表 Azure 服務所發佈的一或多個事件,例如 Azure 儲存體或Azure 事件中樞。 例如,系統主題可能代表所有 Blob 事件,或只代表針對特定儲存體帳戶發佈的 Blob 建立和 Blob 刪除事件。

中提供 azure.eventgrid.SystemEventNames 發行至 Azure 事件方格 之系統事件的各種事件種類名稱。 如需可辨識系統主題的完整清單,請流覽 系統主題

如需事件方格上重要概念的詳細資訊,請參閱Azure 事件方格 中的概念

具有 Azure Arc 的 Kubernetes 上的事件方格

具有 Azure Arc 的 Kubernetes 上的事件方格是一個供應項目,可讓您在自己的 Kubernetes 叢集上執行事件方格。 此功能是透過使用已啟用 Azure Arc 的 Kubernetes 來啟用。 透過已啟用 Azure Arc 的 Kubernetes,支援的 Kubernetes 叢集會連線到 Azure。 連線之後,您就可以在其上安裝事件方格。 在此深入了解。

支援」的「支援」的」是「使用」的」

從 4.7.0 版開始,此套件也支援從 https://pypi.org/project/cloudevents/ 發佈一個版的版次型態。 您可以將 CloudEvent 物件從此程式庫傳遞至 send API。


from cloudevents.http import CloudEvent

event = CloudEvent(...)

client.send(event)

範例

下列各節提供數個程式碼片段,涵蓋一些最常見的事件方格工作,包括:

傳送事件方格事件

此範例會發佈 Event Grid 事件。

import os
from azure.core.credentials import AzureKeyCredential
from azure.eventgrid import EventGridPublisherClient, EventGridEvent

key = os.environ["EG_ACCESS_KEY"]
endpoint = os.environ["EG_TOPIC_HOSTNAME"]

event = EventGridEvent(
    data={"team": "azure-sdk"},
    subject="Door1",
    event_type="Azure.Sdk.Demo",
    data_version="2.0"
)

credential = AzureKeyCredential(key)
client = EventGridPublisherClient(endpoint, credential)

client.send(event)

傳送雲端事件

此範例會發佈 Cloud 事件。

import os
from azure.core.credentials import AzureKeyCredential
from azure.core.messaging import CloudEvent
from azure.eventgrid import EventGridPublisherClient

key = os.environ["CLOUD_ACCESS_KEY"]
endpoint = os.environ["CLOUD_TOPIC_HOSTNAME"]

event = CloudEvent(
    type="Azure.Sdk.Sample",
    source="https://egsample.dev/sampleevent",
    data={"team": "azure-sdk"}
)

credential = AzureKeyCredential(key)
client = EventGridPublisherClient(endpoint, credential)

client.send(event)

傳送多個事件

將多個事件傳送至主題或網域時,可以將事件當做批次傳送。 此範例會使用 send 方法傳送 CloudEvents 清單。

警告: 一次傳送多個事件清單時,逐一查看和傳送每個事件,不會產生最佳效能。 為了獲得最佳效能,強烈建議傳送事件清單。

import os
from azure.core.credentials import AzureKeyCredential
from azure.core.messaging import CloudEvent
from azure.eventgrid import EventGridPublisherClient

key = os.environ["CLOUD_ACCESS_KEY"]
endpoint = os.environ["CLOUD_TOPIC_HOSTNAME"]

event0 = CloudEvent(
    type="Azure.Sdk.Sample",
    source="https://egsample.dev/sampleevent",
    data={"team": "azure-sdk"}
)
event1 = CloudEvent(
    type="Azure.Sdk.Sample",
    source="https://egsample.dev/sampleevent",
    data={"team2": "azure-eventgrid"}
)

events = [event0, event1]

credential = AzureKeyCredential(key)
client = EventGridPublisherClient(endpoint, credential)

client.send(events)

將事件當做字典傳送

個別序列化模型的聽寫標記法也可以用來發佈 CloudEvent (s) 或 EventGridEvent (s) 與強型別物件不同。

使用類似聽寫的標記法傳送至具有自訂架構的主題,如下所示。

import os
import uuid
import datetime as dt
from msrest.serialization import UTC
from azure.core.credentials import AzureKeyCredential
from azure.eventgrid import EventGridPublisherClient

key = os.environ["CUSTOM_SCHEMA_ACCESS_KEY"]
endpoint = os.environ["CUSTOM_SCHEMA_TOPIC_HOSTNAME"]

event = custom_schema_event = {
    "customSubject": "sample",
    "customEventType": "sample.event",
    "customDataVersion": "2.0",
    "customId": uuid.uuid4(),
    "customEventTime": dt.datetime.now(UTC()).isoformat(),
    "customData": "sample data"
    }

credential = AzureKeyCredential(key)
client = EventGridPublisherClient(endpoint, credential)

client.send(event)

從儲存體佇列取用

此範例會取用從儲存體佇列收到的訊息,並將它還原序列化為 CloudEvent 物件。

from azure.core.messaging import CloudEvent
from azure.storage.queue import QueueServiceClient, BinaryBase64DecodePolicy
import os
import json

# all types of CloudEvents below produce same DeserializedEvent
connection_str = os.environ['STORAGE_QUEUE_CONN_STR']
queue_name = os.environ['STORAGE_QUEUE_NAME']

with QueueServiceClient.from_connection_string(connection_str) as qsc:
    payload =  qsc.get_queue_client(
        queue=queue_name,
        message_decode_policy=BinaryBase64DecodePolicy()
        ).peek_messages()

    ## deserialize payload into a list of typed Events
    events = [CloudEvent.from_dict(json.loads(msg.content)) for msg in payload]

從 servicebus 取用

此範例會取用從 ServiceBus 接收的承載訊息,並將它還原序列化為 EventGridEvent 物件。

from azure.eventgrid import EventGridEvent
from azure.servicebus import ServiceBusClient
import os
import json

# all types of EventGridEvents below produce same DeserializedEvent
connection_str = os.environ['SERVICE_BUS_CONN_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']

with ServiceBusClient.from_connection_string(connection_str) as sb_client:
    payload =  sb_client.get_queue_receiver(queue_name).receive_messages()

    ## deserialize payload into a list of typed Events
    events = [EventGridEvent.from_dict(json.loads(next(msg.body).decode('utf-8'))) for msg in payload]

使用 EventGrid 進行分散式追蹤

您可以如往常使用適用于 Python 的 OpenTelemetry 搭配 EventGrid,因為它與 azure 核心追蹤整合相容。

以下是使用 OpenTelemetry 追蹤傳送 CloudEvent 的範例。

首先,將 OpenTelemetry 設定為 EventGrid 的已啟用追蹤外掛程式。

from azure.core.settings import settings
from azure.core.tracing.ext.opentelemetry_span import OpenTelemetrySpan

settings.tracing_implementation = OpenTelemetrySpan

從這裡定期開啟遙測使用量。 如需詳細資訊,請參閱 OpenTelemetry 。 此範例使用簡單的主控台匯出工具匯出追蹤。 這裡可以使用任何匯出工具,包括 azure-monitor-opentelemetry-exporterjaegerzipkin 等等。

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
from opentelemetry.sdk.trace.export import SimpleSpanProcessor  # this requires opentelemetry >= 1.0.0

# Simple console exporter
exporter = ConsoleSpanExporter()

trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
trace.get_tracer_provider().add_span_processor(
    SimpleSpanProcessor(exporter)
)

tracer設定 和 exporter 之後,請遵循下列範例,在從 中使用 send 方法來 EventGridPublisherClient 傳送 CloudEvent 物件時開始收集追蹤。

import os
from azure.eventgrid import EventGridPublisherClient
from azure.core.messaging import CloudEvent
from azure.core.credentials import AzureKeyCredential

hostname = os.environ['CLOUD_TOPIC_HOSTNAME']
key = AzureKeyCredential(os.environ['CLOUD_ACCESS_KEY'])
cloud_event = CloudEvent(
    source = 'demo',
    type = 'sdk.demo',
    data = {'test': 'hello'},
)
with tracer.start_as_current_span(name="MyApplication"):
    client = EventGridPublisherClient(hostname, key)
    client.send(cloud_event)

疑難排解

  • 啟用 azure.eventgrid 記錄器從程式庫收集追蹤。

一般

事件方格用戶端程式庫將會引發 Azure Core中定義的例外狀況。

記錄

此程式庫會使用標準 記錄 程式庫進行記錄。 HTTP 會話的基本資訊 (URL、標頭等 ) 會記錄在 INFO 層級。

選用組態

選擇性關鍵字引數可以在用戶端和每個作業層級傳入。 azure 核心 參考檔 說明重試、記錄、傳輸通訊協定等可用的組態。

下一步

下一節提供數個程式碼片段,說明事件方格 Python API 中使用的常見模式。

更多的程式碼範例

這些程式碼範例示範使用 Azure 事件方格 用戶端程式庫的常見風雲人物案例作業。

下列範例涵蓋發行及取用 dict EventGridEvents 和 CloudEvents 的標記法。

您可以 在這裡找到更多範例。

  • 您可以在這裡看到更多與傳送案例相關的範例。
  • 若要查看從不同傳訊服務取用承載作為具型別物件的相關更多範例,請流覽 取用範例

其他文件

如需Azure 事件方格的更廣泛檔,請參閱 docs.microsoft.com上的事件方格檔

參與

此專案歡迎參與和提供建議。 大部分的參與都要求您同意「參與者授權合約 (CLA)」,宣告您有權且確實授與我們使用投稿的權利。 如需詳細資訊,請造訪 cla.microsoft.com

當您提交提取要求時,CLA Bot 會自動判斷您是否需要提供 CLA,並適當地裝飾 PR (例如標籤、註解)。 請遵循 bot 提供的指示。 您只需要使用我們的 CLA 在所有存放庫上執行此動作一次。

此專案採用 Microsoft Open Source Code of Conduct (Microsoft 開放原始碼管理辦法)。 如需詳細資訊,請參閱管理辦法常見問題集,如有任何其他問題或意見請連絡 opencode@microsoft.com