选择Azure Function作为终结点时Event Grid投递失败问题
启用系统托管标识的Azure Function接收Event Grid事件投递返回Not Found修复方案
所有步骤按顺序操作即可:
先排查90%概率的端点配置错误
Not Found错误优先排查端点配置,这类问题和RBAC无关:
- 不要手动复制Function的URL填入Event Grid订阅端点,创建Event Grid订阅时必须在「端点类型」下拉菜单直接选择
Azure Function,再从资源选择器里定位到你部署的目标Function,系统会自动填充带专属路由、校验参数的Event Grid专用Webhook端点。手动拼接/复制的普通Function触发URL缺少Event Grid扩展的固定路由后缀,100%返回404。 - 如果你之前已经手动配置过端点,直接删除现有Event Grid订阅,按上述方式重新选端点创建,不要在原有订阅上修改URL,平台侧的端点缓存最长会保留1小时,改了也不生效。
系统托管标识对应的RBAC正确配置
Stack Overflow提到的RBAC解法核心是搞对鉴权主体,不要把Function的托管标识错当成授权主体:
- 先确认目标Function的鉴权设置:进入Function的「身份认证」页,如果「未经身份验证的请求的处理方式」选的是
需要身份验证,才需要做下面的RBAC配置;如果选的是允许匿名请求,直接跳过这部分。 - 进入Event Grid订阅的配置页,找到「托管标识」选项,给Event Grid订阅本身开启系统分配托管标识——很多人误以为Function开了系统标识就完成了身份配置,实际上Event Grid投递请求时需要用自己的托管标识通过Function的AAD校验,这步漏了就算Function开了标识也没用。
- 回到目标Function应用的「访问控制(IAM)」页,添加角色分配:
- 角色选择
函数应用调用方 - 成员选择刚才给Event Grid订阅开启的系统托管标识
- 作用域覆盖整个Function应用,不要单独绑定到单个函数
- 角色选择
- 如果你用的是IoT Hub自动生成的Event Grid系统主题,不需要额外给IoT Hub本身配权限,IoT Hub到Event Grid主题的路由走内部链路,和投递到Function的鉴权是两套逻辑。
Function侧配置校验
如果上面两步做完还是报404,排查Function本身的触发配置:
- 确认目标函数的触发器类型是原生
eventGridTrigger,不要用通用HTTP触发器模拟Event Grid接收。通用HTTP触发器没有内置的Event Grid订阅校验握手逻辑,第一次投递的校验请求会直接被拒,返回404。 - 进入Function的「配置」页,确认
AzureWebJobsStorage对应的存储账户连接字符串有效,存储账户没有开防火墙限制Function出站访问。消费计划Function的触发器加载完全依赖这个存储配置,连接失效时触发器不会正常加载,所有投递请求直接返回404,且默认应用日志不会输出明确的错误提示。 - 如果你给Function配置了全局路由前缀,检查自定义路由规则有没有覆盖
/runtime/webhooks/EventGrid这个内置扩展路由,路由被覆盖时Event Grid的请求找不到对应路径,也会返回Not Found。
验证方法
所有配置完成后,进入Event Grid订阅页点击「发送测试事件」,用默认的示例事件触发投递,10秒内去Function的「监视」页看调用记录,返回200/202状态码即为配置正常。如果还是返回404,直接去Function的「诊断和解决问题」页搜索「404错误」,里面会列出所有失败请求的实际访问路径,对比标准Event Grid投递路径/runtime/webhooks/EventGrid?functionName=<你的函数名>,路径不一致就回到第一步删掉订阅重新选端点创建即可。
内容的提问来源于stack exchange,提问作者Michael Aquilina
相关产品推荐
相关产品推荐

