Azure Event Grid 绑定规范

Azure Event Grid 绑定组件的详细文档

配置

要设置 Azure 事件网格(Event Grid)绑定,请创建一个类型为 bindings.azure.eventgrid 的组件。 请参阅本指南,了解如何创建和应用绑定配置。

请参阅这里了解 Azure Event Grid 文档。

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: <name>
  5. spec:
  6. type: bindings.azure.eventgrid
  7. version: v1
  8. metadata:
  9. # Required Input Binding Metadata
  10. - name: tenantId
  11. value: "[AzureTenantId]"
  12. - name: subscriptionId
  13. value: "[AzureSubscriptionId]"
  14. - name: clientId
  15. value: "[ClientId]"
  16. - name: clientSecret
  17. value: "[ClientSecret]"
  18. - name: subscriberEndpoint
  19. value: "[SubscriberEndpoint]"
  20. - name: handshakePort
  21. value: [HandshakePort]
  22. - name: scope
  23. value: "[Scope]"
  24. # Optional Input Binding Metadata
  25. - name: eventSubscriptionName
  26. value: "[EventSubscriptionName]"
  27. # Required Output Binding Metadata
  28. - name: accessKey
  29. value: "[AccessKey]"
  30. - name: topicEndpoint
  31. value: "[TopicEndpoint]

Warning

以上示例将 Secret 明文存储。 更推荐的方式是使用 Secret 组件, 这里

元数据字段规范

字段必填绑定支持详情示例
tenantIdY输入创建这个事件网格事件订阅的 Azure 租户 id“tenentID”
subscriptionIdY输入创建这个事件网格事件订阅的 Azure 订阅 id“subscriptionId”
clientIdY输入由绑定来创建或更新事件网格事件订阅的客户端 id“clientId”
clientSecretY输入由绑定来创建或更新事件网格事件订阅的客户端 id“clientSecret”
subscriberEndpointY输入事件网格将进行握手并发送云端事件的 https 端点。 如果您没有在 ingress 上重写URL, 其形式应该是: https://[YOUR HOSTNAME]/api/events。如果测试您的本地机器, 您可以使用 ngrok 来创建一个公共端点。https://[YOUR HOSTNAME]/api/events”
handshakePortY输入输入绑定将侦听握手和事件的容器端口“9000”
作用域Y输入事件订阅需要创建或更新的资源标识符。 请参阅这里了解更多详情。“/subscriptions/{subscriptionId}/“
eventSubscriptionNameN输入事件订阅的名称。 事件订阅名称长度必须在3到64个字符之间,并且只能使用字母数字“name”
accessKeyYOutput将事件网格事件发布到自定义 topic 的访问密钥“accessKey”
topicEndpointYOutput输出绑定应该在其中发布事件的 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初始化时,事件网格绑定会创建一个 事件订阅。 您的服务主要需要获得权限才能启用此功能。

  1. # 首先确保 Azure Resource Manager 提供商已注册事件网格
  2. az provider register --namespace Microsoft.EventGrid
  3. az provider show --namespace Microsoft.EventGrid --query "registrationState"
  4. # 给予SP 所需的权限,以便它可以创建事件订阅到事件网格
  5. az role assignment create --assignee <clientId> --role "EventGrid EventSubscription Contributor" --scopes <scope>

请务必在事件网格绑定组件中同时添加引号 [HandshakePort] ,因为 Kubernetes 需要配置的字符串值。

本地测试

  • 安装 ngrok
  • 在本地使用自定义端口 9000 进行握手
  1. # 使用随机端口 9000 作为示例
  2. ngrok http -host-header=localhost 9000
  • 配置 ngrok 的 HTTPS 端点和自定义端口来输入绑定元数据
  • 运行 Dapr
  1. # 使用 .NET core web api 和 Dapr 的默认端口作为示例
  2. 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

  1. controller:
  2. podAnnotations:
  3. dapr.io/enabled: "true"
  4. dapr.io/app-id: "nginx-ingress"
  5. dapr.io/app-port: "80"

然后使用 Helm 3 安装 NGINX ingress controller 到您的 Kubernetes 集群使用

  1. helm repo add stable https://kubernetes-charts.storage.googleapis.com/
  2. helm install nginx stable/nginx-ingress -f ./dapr-annotations.yaml -n default
  3. # 获取 ingress controller 的公开IP
  4. 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 。

  1. # dotnetwebapi.yaml
  2. kind: Service
  3. apiVersion: v1
  4. metadata:
  5. name: dotnetwebapi
  6. labels:
  7. app: dotnetwebapi
  8. spec:
  9. selector:
  10. app: dotnetwebapi
  11. ports:
  12. - name: webapi
  13. protocol: TCP
  14. port: 80
  15. targetPort: 80
  16. - name: dapr-eventgrid
  17. protocol: TCP
  18. port: 9000
  19. targetPort: 9000
  20. type: ClusterIP
  21. ---
  22. apiVersion: extensions/v1beta1
  23. kind: Ingress
  24. metadata:
  25. name: eventgrid-input-rule
  26. annotations:
  27. kubernetes.io/ingress.class: nginx
  28. cert-manager.io/cluster-issuer: letsencrypt
  29. spec:
  30. tls:
  31. - hosts:
  32. - dapr.<your custom domain>
  33. secretName: dapr-tls
  34. rules:
  35. - host: dapr.<your custom domain>
  36. http:
  37. paths:
  38. - path: /api/events
  39. backend:
  40. serviceName: dotnetwebapi
  41. servicePort: 9000
  42. ---
  43. apiVersion: apps/v1
  44. kind: Deployment
  45. metadata:
  46. name: dotnetwebapi
  47. labels:
  48. app: dotnetwebapi
  49. spec:
  50. replicas: 1
  51. selector:
  52. matchLabels:
  53. app: dotnetwebapi
  54. template:
  55. metadata:
  56. labels:
  57. app: dotnetwebapi
  58. annotations:
  59. dapr.io/enabled: "true"
  60. dapr.io/app-id: "dotnetwebapi"
  61. dapr.io/app-port: "5000"
  62. spec:
  63. containers:
  64. - name: webapi
  65. image: <your container image>
  66. ports:
  67. - containerPort: 5000
  68. imagePullPolicy: Always

部署绑定和应用 (包括ingress) 到 Kubernetes

  1. # 部署 Dapr 组件
  2. kubectl apply -f eventgrid.yaml
  3. # 部署你的应用程序和 Nginx ingress
  4. kubectl apply -f dotnetwebapi.yaml

注意: 此清单将所有内容都部署到 Kubernetes 默认命名空间中。

解决与 Nginx 控制器相关的可能的问题

在 Dapr 中初始部署后,Nginx cointroller 可能发生故障。 检查日志并修复问题 (如果存在的话) 可以遵循这些步骤。

  1. $ kubectl get pods -l app=nginx-ingress
  2. NAME READY STATUS RESTARTS AGE
  3. nginx-nginx-ingress-controller-649df94867-fp6mg 2/2 Running 0 51m
  4. nginx-nginx-ingress-default-backend-6d96c457f6-4nbj5 1/1 Running 0 55m
  5. $ kubectl logs nginx-nginx-ingress-controller-649df94867-fp6mg nginx-ingress-controller
  6. # If you see 503s logged from calls to webhook endpoint '/api/events' restart the pod
  7. # .."OPTIONS /api/events HTTP/1.1" 503..
  8. $ kubectl delete pod nginx-nginx-ingress-controller-649df94867-fp6mg
  9. # Check the logs again - it should start returning 200
  10. # .."OPTIONS /api/events HTTP/1.1" 200..
  11. $ kubectl delete pod nginx-nginx-ingress-controller-649df94867-fp6mg
  12. # Check the logs again - it should start returning 200
  13. # .."OPTIONS /api/events HTTP/1.1" 200..
  14. $ kubectl delete pod nginx-nginx-ingress-controller-649df94867-fp6mg
  15. # Check the logs again - it should start returning 200
  16. # .."OPTIONS /api/events HTTP/1.1" 200..

相关链接