本地容器中Azure EventGrid事件触发函数的调试问题
问题描述
我们在Azure上运行中型云应用,已搭建docker-compose本地环境模拟Azure服务(MongoDB、Redis、Azurite、MSSQL等),函数应用已集成到栈中,可正常连接Azurite队列,定时器触发器工作正常。
需要本地测试Blob上传触发EventGrid事件驱动函数:
- 基于
mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0构建函数镜像 - 配置
AzureWebJobsStorage指向Azurite服务,容器80端口映射到本地7071 - 向
http://localhost:7071/runtime/webhooks/eventgrid?functionName=BlobTriggerFunc发送POST请求(设置Content-Type: application/json、aeg-event-type: Notification,请求体为测试EventGrid事件),返回401,容器日志提示AuthenticationScheme: WebJobsAuthLevel was challenged. - 本地通过
dotnet func或Visual Studio运行时,该请求可正常触发函数
需求:如何让容器中的函数接收测试请求?能否在容器运行时禁用认证?
附:docker-compose服务定义
files-func-app: image: local/files-func-app ports: - 7071:80 restart: unless-stopped environment: FUNCTIONS_WORKER_RUNTIME: dotnet-isolated AzureWebJobsStorage: AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;DefaultEndpointsProtocol=http;BlobEndpoint=http://azurite:10000/devstoreaccount1;QueueEndpoint=http://azurite:10001/devstoreaccount1;TableEndpoint=http://azurite:10002/devstoreaccount1; Logging__LogLevel__Azure: Warning Serilog__MinimumLevel__Override__Microsoft: Warning Serilog__MinimumLevel__Override__System: Warning Serilog__MinimumLevel__Override__Azure: Warning Serilog__MinimumLevel__Override__Host: Warning ASPNETCORE_ENVIRONMENT: Development APPSVC_REMOTE_DEBUGGING: TRUE depends_on: - azurite
附:函数应用Dockerfile
# Build FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src # copy repo and publish the functions project COPY . . RUN dotnet publish Files.Functions/Files.Functions.csproj -c Release -o /out # Run (Azure Functions host image for dotnet-isolated .NET 8) FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0 WORKDIR /home/site/wwwroot COPY --from=build /out ./ # Required by the Functions host image ENV AzureWebJobsScriptRoot=/home/site/wwwroot \ AzureFunctionsJobHost__Logging__Console__IsEnabled=true
解决方案
方法1:使用函数访问密钥(推荐,贴近生产环境)
容器运行的函数应用不会像本地开发工具那样自动禁用认证,需携带正确的访问密钥:
- 查看函数容器启动日志,会输出函数的默认访问密钥;或通过Azure Functions CLI执行
func keys list --function-name BlobTriggerFunc获取(需进入容器或本地安装CLI) - 在POST请求中添加请求头
x-functions-key: <获取到的密钥> - 重新发送请求即可触发函数
方法2:禁用认证(仅开发测试环境使用)
若仅需快速跳过认证,可通过环境变量修改函数的认证级别:
单个函数禁用认证
在docker-compose.yml的files-func-app服务的environment节点添加:
AzureFunctionsJobHost__Functions__BlobTriggerFunc__AuthLevel: Anonymous
全局禁用所有函数认证(不推荐)
在environment节点添加:
AzureFunctionsJobHost__AuthLevel: Anonymous
修改后重启容器,再次发送请求即可绕过401认证校验
内容的提问来源于stack exchange,提问作者Mike G




