Azure Event Grid 绑定规范
Azure Event Grid 绑定组件的详细文档
配置
要设置 Azure 事件网格(Event Grid)绑定,请创建一个类型为 bindings.azure.eventgrid
的组件。 请参阅本指南,了解如何创建和应用绑定配置。
请参阅这里了解 Azure Event Grid 文档。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: <name>
spec:
type: bindings.azure.eventgrid
version: v1
metadata:
# Required Input Binding Metadata
- name: tenantId
value: "[AzureTenantId]"
- name: subscriptionId
value: "[AzureSubscriptionId]"
- name: clientId
value: "[ClientId]"
- name: clientSecret
value: "[ClientSecret]"
- name: subscriberEndpoint
value: "[SubscriberEndpoint]"
- name: handshakePort
value: [HandshakePort]
- name: scope
value: "[Scope]"
# Optional Input Binding Metadata
- name: eventSubscriptionName
value: "[EventSubscriptionName]"
# Required Output Binding Metadata
- name: accessKey
value: "[AccessKey]"
- name: topicEndpoint
value: "[TopicEndpoint]
Warning
以上示例将 Secret 明文存储。 更推荐的方式是使用 Secret 组件, 这里。
元数据字段规范
字段 | 必填 | 绑定支持 | 详情 | 示例 |
---|---|---|---|---|
tenantId | Y | 输入 | 创建这个事件网格事件订阅的 Azure 租户 id | “tenentID” |
subscriptionId | Y | 输入 | 创建这个事件网格事件订阅的 Azure 订阅 id | “subscriptionId” |
clientId | Y | 输入 | 由绑定来创建或更新事件网格事件订阅的客户端 id | “clientId” |
clientSecret | Y | 输入 | 由绑定来创建或更新事件网格事件订阅的客户端 id | “clientSecret” |
subscriberEndpoint | Y | 输入 | 事件网格将进行握手并发送云端事件的 https 端点。 如果您没有在 ingress 上重写URL, 其形式应该是: https://[YOUR HOSTNAME]/api/events 。如果测试您的本地机器, 您可以使用 ngrok 来创建一个公共端点。 | “https://[YOUR HOSTNAME]/api/events” |
handshakePort | Y | 输入 | 输入绑定将侦听握手和事件的容器端口 | “9000” |
作用域 | Y | 输入 | 事件订阅需要创建或更新的资源标识符。 请参阅这里了解更多详情。 | “/subscriptions/{subscriptionId}/“ |
eventSubscriptionName | N | 输入 | 事件订阅的名称。 事件订阅名称长度必须在3到64个字符之间,并且只能使用字母数字 | “name” |
accessKey | Y | Output | 将事件网格事件发布到自定义 topic 的访问密钥 | “accessKey” |
topicEndpoint | Y | Output | 输出绑定应该在其中发布事件的 topic 端点 | “topic-endpoint” |
Scope
Scope 是事件订阅需要创建或更新的资源的标识符。 Scope 可以是订阅组,也可以是资源组。 或属于资源提供者命名空间或事件网格主题的顶级资源。 例如:
'/subscriptions/{subscriptionId}/'
单个订阅'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}'
资源组'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}'
资源'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.EventGrid/topics/{topicName}'
事件网格主题 > 在大括号 {} 中的内容应该替换为实际值.
绑定支持
此组件支持 输入和输出 绑定接口。
该组件支持输出绑定,其操作如下:
create
补充资料
在Dapr初始化时,事件网格绑定会创建一个 事件订阅。 您的服务主要需要获得权限才能启用此功能。
# 首先确保 Azure Resource Manager 提供商已注册事件网格
az provider register --namespace Microsoft.EventGrid
az provider show --namespace Microsoft.EventGrid --query "registrationState"
# 给予SP 所需的权限,以便它可以创建事件订阅到事件网格
az role assignment create --assignee <clientId> --role "EventGrid EventSubscription Contributor" --scopes <scope>
请务必在事件网格绑定组件中同时添加引号 [HandshakePort]
,因为 Kubernetes 需要配置的字符串值。
本地测试
- 安装 ngrok
- 在本地使用自定义端口
9000
进行握手
# 使用随机端口 9000 作为示例
ngrok http -host-header=localhost 9000
- 配置 ngrok 的 HTTPS 端点和自定义端口来输入绑定元数据
- 运行 Dapr
# 使用 .NET core web api 和 Dapr 的默认端口作为示例
dapr run --app-id dotnetwebapi --app-port 5000 --dapr-http-port 3500 dotnet run
在 Kubernetes 上测试
Azure 事件网格需要一个有效的 HTTPS 端点用于自定义 webhooks. 自签名证书是不行的。 自签名证书是不行的。 为了使流量从公共互联网到你的应用程序的 Dapr sidecar,你需要一个启用了 Dapr 的 ingress 控制器。 有一篇关于这个主题的好文章:Kubernetes NGINX ingress controller with Dapr。
若要开始,请首先为 Dapr 创建批注 dapr-annotations.yaml
controller:
podAnnotations:
dapr.io/enabled: "true"
dapr.io/app-id: "nginx-ingress"
dapr.io/app-port: "80"
然后使用 Helm 3 安装 NGINX ingress controller 到您的 Kubernetes 集群使用
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
helm install nginx stable/nginx-ingress -f ./dapr-annotations.yaml -n default
# 获取 ingress controller 的公开IP
kubectl get svc -l component=controller -o jsonpath='Public IP is: {.items[0].status.loadBalancer.ingress[0].ip}{"\n"}'
如果部署到 Azure Kubernetes 服务, 你可以跟随 官方的 MS 文档进行其余步骤
- 添加一条记录到你的 DNS 区域
- 安装证书管理器
- 创建 CA 集群发行者(issuer)
开启事件网格与 Dapr 之间通信的最后一步是定义 http
和自定义端口到您应用的服务和一个 Kubernetes 中的 ingress
。 这个示例使用 .NET Core Web api 和 Dapr 默认端口和用于握手的自定义端口 9000 。
# dotnetwebapi.yaml
kind: Service
apiVersion: v1
metadata:
name: dotnetwebapi
labels:
app: dotnetwebapi
spec:
selector:
app: dotnetwebapi
ports:
- name: webapi
protocol: TCP
port: 80
targetPort: 80
- name: dapr-eventgrid
protocol: TCP
port: 9000
targetPort: 9000
type: ClusterIP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: eventgrid-input-rule
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt
spec:
tls:
- hosts:
- dapr.<your custom domain>
secretName: dapr-tls
rules:
- host: dapr.<your custom domain>
http:
paths:
- path: /api/events
backend:
serviceName: dotnetwebapi
servicePort: 9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dotnetwebapi
labels:
app: dotnetwebapi
spec:
replicas: 1
selector:
matchLabels:
app: dotnetwebapi
template:
metadata:
labels:
app: dotnetwebapi
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "dotnetwebapi"
dapr.io/app-port: "5000"
spec:
containers:
- name: webapi
image: <your container image>
ports:
- containerPort: 5000
imagePullPolicy: Always
部署绑定和应用 (包括ingress) 到 Kubernetes
# 部署 Dapr 组件
kubectl apply -f eventgrid.yaml
# 部署你的应用程序和 Nginx ingress
kubectl apply -f dotnetwebapi.yaml
注意: 此清单将所有内容都部署到 Kubernetes 默认命名空间中。
解决与 Nginx 控制器相关的可能的问题
在 Dapr 中初始部署后,Nginx cointroller 可能发生故障。 检查日志并修复问题 (如果存在的话) 可以遵循这些步骤。
$ kubectl get pods -l app=nginx-ingress
NAME READY STATUS RESTARTS AGE
nginx-nginx-ingress-controller-649df94867-fp6mg 2/2 Running 0 51m
nginx-nginx-ingress-default-backend-6d96c457f6-4nbj5 1/1 Running 0 55m
$ kubectl logs nginx-nginx-ingress-controller-649df94867-fp6mg nginx-ingress-controller
# If you see 503s logged from calls to webhook endpoint '/api/events' restart the pod
# .."OPTIONS /api/events HTTP/1.1" 503..
$ kubectl delete pod nginx-nginx-ingress-controller-649df94867-fp6mg
# Check the logs again - it should start returning 200
# .."OPTIONS /api/events HTTP/1.1" 200..
$ kubectl delete pod nginx-nginx-ingress-controller-649df94867-fp6mg
# Check the logs again - it should start returning 200
# .."OPTIONS /api/events HTTP/1.1" 200..
$ kubectl delete pod nginx-nginx-ingress-controller-649df94867-fp6mg
# Check the logs again - it should start returning 200
# .."OPTIONS /api/events HTTP/1.1" 200..