You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

本地容器中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/jsonaeg-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

火山引擎 最新活动