如何配置Azure Databricks向Event Grid发送作业事件并解决认证问题?
我目前用Azure Durable Function编排器管理包含Azure Databricks作业创建的流程:编排器通过Databricks REST API创建作业并提供回调URL,之后无限等待外部回调事件确认作业完成(回调模式)。Databricks作业代码被包裹在try:except块中,确保无论执行结果如何都能向编排器返回状态。
但我担心如果作业出现Internal Error,代码块无法执行,会导致编排器无限等待。为提升可靠性,我考虑了三种方案:给编排器设置超时、定时轮询作业状态、采用事件驱动架构(比如向Azure Event Grid主题写入事件,由独立服务订阅)。
我有两个核心疑问:
- 能否让Databricks作业在完成时(成功、失败、错误等所有可能结果)向Azure Event Grid主题发送事件,确保编排器能收到通知并执行对应操作?我查了Jobs 2.1 REST API文档,发现可以配置邮件或预览版webhook在作业启动、成功、失败时发送通知,能不能直接在这里填入Event Grid主题的URL?
- 我已经参考文档创建了系统通知,但测试连接时遇到401错误:
请求必须包含aeg-sas-token或aeg-sas-key签名。请问该如何提供令牌,让Databricks能够向Event Grid主题写入事件?
1. 能否用Databricks Webhook向Azure Event Grid发送事件?
可以。Databricks Jobs 2.1 API的预览版webhook支持自定义HTTP端点,完全可以将Azure Event Grid主题的URL配置为webhook目标,以此实现作业全生命周期事件(启动、成功、失败、超时等)的推送。
需要注意:
- Databricks webhook的请求格式和Event Grid的事件格式不完全匹配,但Event Grid支持接收自定义JSON负载,后续可以在订阅端(比如你的Durable Function)做格式转换处理。
- 配置webhook时需勾选所有需要的事件触发条件(作业启动、成功、失败、超时等),覆盖所有可能的作业终止场景,避免遗漏通知。
2. 解决Event Grid 401认证错误
Azure Event Grid主题要求请求携带SAS令牌或SAS密钥进行身份验证,Databricks webhook支持自定义HTTP请求头,可通过以下步骤配置:
步骤1:生成Event Grid主题的SAS令牌
使用Azure CLI生成,命令如下:
az eventgrid topic generate-sas --name <你的主题名称> --resource-group <资源组名称> --expiry <过期时间,比如"2025-12-31T23:59:59Z">
执行后会得到类似格式的SAS令牌:sv=2021-10-01&sig=xxx&se=xxx
步骤2:配置Databricks Webhook的自定义请求头
在调用Databricks Jobs API创建/更新作业时,在webhook配置中添加aeg-sas-token请求头,值为步骤1生成的SAS令牌。示例请求体片段如下:
{ "settings": { "webhooks": [ { "id": "event-grid-notification", "url": "https://<你的Event Grid主题名称>.<区域名>.eventgrid.azure.net/api/events", "http_method": "POST", "headers": { "aeg-sas-token": "sv=2021-10-01&sig=xxx&se=xxx" }, "events": ["STARTED", "SUCCEEDED", "FAILED", "TIMED_OUT"] } ] } }
补充说明
- 若倾向于使用SAS密钥而非令牌,可直接在请求头中添加
aeg-sas-key,值为Event Grid主题的访问密钥(可在Azure门户的主题「访问密钥」页面获取)。 - 注意SAS令牌的过期时间,建议设置较长有效期,或在令牌过期前自动更新Databricks作业的webhook配置。
- 测试时可先用Postman手动发送带SAS令牌的请求到Event Grid主题,验证认证通过后再配置到Databricks中。
内容的提问来源于stack exchange,提问作者Johannes Schmidt

