Azure Synapse Pipeline如何获取事件触发器的触发用户名
事件型触发器触发流水线时获取触发用户身份的实现方案
针对ADLS Gen2文件上传触发事件触发器、后续运行Databricks notebook的场景,没有办法直接从触发器运行实例属性中拿到实际上传文件的用户——事件触发器的运行发起方是Azure事件网格服务,流水线实例的创建者属性只会显示系统服务主体,和实际上传用户无关,可行实现路径如下:
- 提前开启ADLS Gen2账户的存储诊断日志,将
StorageBlobLogs投递到Log Analytics工作区,该日志会完整记录每一次Blob写入操作的调用方UPN、对象ID、操作时间、操作文件路径,是身份信息的唯一可靠来源 - 在事件触发器的参数映射配置中,把事件自带的文件路径(subject字段)、事件触发时间(eventTime字段)映射为下游Databricks Notebook活动的输入参数
- Databricks Notebook拿到上述参数后,调用Log Analytics查询接口,匹配对应时间范围、对应文件路径的Blob创建操作记录,即可取出实际上传文件、触发本次流水线的用户身份
可直接使用的Python代码(运行在Databricks Notebook中)
# 初始化notebook参数,接收触发器传递的事件上下文 dbutils.widgets.text("blob_path", "", "触发事件对应的Blob完整路径") dbutils.widgets.text("event_utc_time", "", "事件触发的UTC时间") blob_path = dbutils.widgets.get("blob_path") event_utc_time = dbutils.widgets.get("event_utc_time") # 从Databricks机密作用域读取Log Analytics连接配置,禁止硬编码密钥 la_workspace_id = dbutils.secrets.get(scope="azure-service-config", key="log-analytics-workspace-id") la_api_key = dbutils.secrets.get(scope="azure-service-config", key="log-analytics-api-key") import requests # 构造KQL查询语句,匹配对应文件的上传操作 kql = f''' StorageBlobLogs | where OperationName in ("CreateBlob", "PutBlob", "FlushPath") | where ObjectKey == "{blob_path}" | where TimeGenerated between (datetime({event_utc_time}) - 5min) .. (datetime({event_utc_time}) + 1min) | project CallerUpn, CallerObjectId, OperationTime = TimeGenerated | top 1 by OperationTime desc ''' # 调用Log Analytics查询接口 req_url = f"https://api.loganalytics.io/v1/workspaces/{la_workspace_id}/query" req_params = {"query": kql} req_headers = { "X-Api-Key": la_api_key, "Content-Type": "application/json" } resp = requests.get(req_url, params=req_params, headers=req_headers) query_result = resp.json() # 解析结果获取触发用户 trigger_user = "未知" if query_result.get("tables") and len(query_result["tables"][0]["rows"]) > 0: trigger_user = query_result["tables"][0]["rows"][0][0] print(f"本次流水线触发对应的文件上传用户:{trigger_user}") else: print("未匹配到对应操作记录,请检查存储诊断日志是否开启、触发器参数映射是否正确")
前置注意事项:
- ADLS Gen2的诊断日志必须和查询用的Log Analytics工作区绑定,日志从产生到可查询会有1-2分钟延迟,代码里加了前后5分钟的时间冗余范围,避免漏匹配
- 触发器参数映射时注意把ADLS返回的subject字段处理成和日志中ObjectKey一致的格式,去掉开头的容器名前缀避免匹配失败
- Log Analytics的API密钥需要具备日志查询权限,密钥统一存储在Databricks机密作用域,避免明文泄露
内容的提问来源于stack exchange,提问作者Akshat
相关产品推荐
相关产品推荐

