【问题标题】:Azure function HTTP triggered on linux container - function not working 404在 Linux 容器上触发 Azure 函数 HTTP - 函数不起作用 404
【发布时间】:2020-05-02 23:31:16
【问题描述】:

我被困住了,也许你可以帮助我。 (更新:经过调查,我确实知道它不起作用,因为构建/发布后 Azure 功能的 wwwroot 文件夹是空的。主要问题是为什么)

我正在尝试使用 Azure Container Registry (Linux) 发布 Azure Function 这一步我认为我成功了。我确实创建了 CI/CD 管道,并且所有内容都已正确发布。

当我进入我的天蓝色功能主页时:https://myAzureFuncion.azurewebsites.net/(这只是示例)

我确实看到了:

函数本身的开头。这没什么花哨的,因为我只是想测试 CI/CD,所以它是 AF 模板。我只是将授权更改为匿名(以排除身份验证问题):

        [FunctionName("MyAzureFunctionName")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request. Runned!");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            return name != null
                ? (ActionResult)new OkObjectResult($"Hello, {name}")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }

所以我很高兴 - 对吧?不,因为它不起作用。我正在尝试通过 HTTP 请求触发此功能:

https://myAzureFuncion.azurewebsites.net/api/MyAzureFunctionName?name=Mark

而且我不断收到 404 Not Found。我确实使用 Postman 进行了检查:相同(之前使用功能授权我尝试使用 ?code=(code_in_host) 和标头 x-functions-key。一直相同的信息 --> 404 Not Found)

因为没有这个功能。

当然,当我在本地运行它(使用 docker for windows)时,一切正常。我在跑步:

https://localhost:some_port/api/MyAzureFunctionName?name=Mark

我收到了正确的答案。

你能指出我要检查什么以及如何诊断这里的问题吗?我已输入 App Insights 实时指标 --> 但未记录任何请求。

如何诊断这里的问题?

[更新 04.05.2020 01:35]

这是 YAML 中此组件的发布管道的样子

steps:
- task: AzureFunctionAppContainer@1
  displayName: 'Azure Function App on Container Deploy: MyFunctionName'
  inputs:
    azureSubscription: MySubscription
    appName: MyFunctionName
    imageName: 'myAcrContainer.azurecr.io/mobile/MyFunctionName:$(Build.BuildNumber)'

我还在 Azure 门户中看到了这个 Azure 功能的一件奇怪的事情。当我进入功能菜单时 - 有信息,但没有:

当我使用“新的 Azure 功能管理体验”时,也会出现同样的情况

[更新 04.05.2020 11:40]

提供有关此案的更多信息。下面是 docker 镜像的样子:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/azure-functions/dotnet:3.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ["BuildChat/BuildChat.csproj", "BuildChat/"]
COPY ["MyFunctionName/MyFunctionName.csproj", "MyFunctionName/"]
RUN dotnet restore "MyFunctionName/MyFunctionName.csproj"
COPY . .
WORKDIR "/src/MyFunctionName"
RUN dotnet build "MyFunctionName.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyFunctionName.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENV AzureWebJobsScriptRoot=/app

这是我正在使用的构建管道:

- stage: BuildMyAzureFunction
  displayName: Build and push MyAzureFunction stage
  jobs:  
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push image to container registry
      inputs:
        containerRegistry: $(dockerRegistryServiceConnection)
        repository:  $(imageRepositoryMyAzureFunction)
        command: 'buildAndPush'
        Dockerfile: $(dockerfilePathAzureMyAzureFunction)
        tags: |
          $(tag)

我不知道我还能给你什么:)

可能是 Azure 门户中的容器设置:

以及最新 docker 版本的日志:

2020-05-04 09:32:32.693 INFO  - Recycling container because of AppSettingsChange and isMainSite = True
2020-05-04 09:32:32.777 INFO  - Pulling image: myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
2020-05-04 09:32:33.829 INFO  - 20200503.11 Pulling from mobile/myAzureFunction
2020-05-04 09:32:33.832 INFO  -  Digest: sha256:688090984dbc5d257b7d4eefff886affa451c59407edd46792dfc81726f393ec
2020-05-04 09:32:33.832 INFO  -  Status: Image is up to date for myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
2020-05-04 09:32:33.835 INFO  - Pull Image successful, Time taken: 0 Minutes and 1 Seconds
2020-05-04 09:32:33.959 INFO  - Starting container for site
2020-05-04 09:32:33.961 INFO  - docker run -d -p 7287:80 --name myAzureFunction_1_84dd4d10 -e WEBSITE_CORS_ALLOWED_ORIGINS=https://functions.azure.com,https://functions-staging.azure.com,https://functions-next.azure.com -e WEBSITE_CORS_SUPPORT_CREDENTIALS=False -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=myAzureFunction -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=myAzureFunction.azurewebsites.net -e WEBSITE_INSTANCE_ID=8da8a02a13a3cdde53ad6aafcd4eb717ca00dd6bc65ff07378d74a0cd859e1c0 -e HTTP_LOGGING_ENABLED=1 myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11  

2020-05-04 09:32:39.421 INFO  - Starting container for site
2020-05-04 09:32:39.422 INFO  - docker run -d -p 1500:8081 --name myAzureFunction_1_84dd4d10_middleware -e WEBSITE_CORS_ALLOWED_ORIGINS=https://functions.azure.com,https://functions-staging.azure.com,https://functions-next.azure.com -e WEBSITE_CORS_SUPPORT_CREDENTIALS=False -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=myAzureFunction-e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=myAzureFunction.azurewebsites.net -e WEBSITE_INSTANCE_ID=8da8a02a13a3cdde53ad6aafcd4eb717ca00dd6bc65ff07378d74a0cd859e1c0 -e HTTP_LOGGING_ENABLED=1 appsvc/middleware:2001061754 /Host.ListenUrl=http://0.0.0.0:8081 /Host.DestinationHostUrl=http://172.16.2.6:80 /Host.UseFileLogging=true 

2020-05-04 09:32:44.658 INFO  - Initiating warmup request to container myAzureFunction_1_84dd4d10 for site myAzureFunction
2020-05-04 09:33:00.400 INFO  - Waiting for response to warmup request for container myAzureFunction_1_84dd4d10. Elapsed time = 15.7420671 sec
2020-05-04 09:33:16.088 INFO  - Waiting for response to warmup request for container myAzureFunction_1_84dd4d10. Elapsed time = 31.4308809 sec
2020-05-04 09:33:33.284 INFO  - Waiting for response to warmup request for container myAzureFunction_1_84dd4d10. Elapsed time = 48.6269148 sec
2020-05-04 09:33:56.001 INFO  - Container myAzureFunction_1_84dd4d10 for site myAzureFunctioninitialized successfully and is ready to serve requests.
2020-05-04 09:33:56.004 INFO  - Initiating warmup request to container myAzureFunction_1_84dd4d10_middleware for site myAzureFunction
2020-05-04 09:34:04.506 INFO  - Container myAzureFunction_1_84dd4d10_middleware for site myAzureFunction initialized successfully and is ready to serve requests.
2020_05_04_RD501AC582A899_easyauth_docker.log:
2020_05_04_RD501AC582A899_default_docker.log:
2020-05-04T09:21:14.187664147Z Hosting environment: Production
2020-05-04T09:21:14.187744046Z Content root path: /app
2020-05-04T09:21:14.187750446Z Now listening on: http://[::]:80
2020-05-04T09:21:14.187754446Z Application started. Press Ctrl+C to shut down.

2020-05-04T09:33:49.229983024Z Hosting environment: Production
2020-05-04T09:33:49.232401696Z Content root path: /app
2020-05-04T09:33:49.232413096Z Now listening on: http://[::]:80
2020-05-04T09:33:49.232417396Z Application started. Press Ctrl+C to shut down.

[更新 04.05.2020 15:55]

我检查了部署中心,看起来还可以:

但是因为我要发布 3 个 thigns(1 个 SignalR 集线器和 2 个 azure 函数 - 当然两者都“不起作用”),所以我在想 - 也许它正在以某种方式混合(在这个 azure 函数应用程序上 - 实际上 SignalR 正在发表了吗?

我确实检查了这个发布任务日志(假设发布了 MyAzureFunction)并且一切看起来都正确(日志中到处都是我的 MyAzureFunction):

这是我的发布管道的样子:

这里是持续部署触发配置:

这里是第 2 阶段(用于发布 azure 功能)预部署设置:

最后,发布步骤本身(虽然我确实已经发布了它的 YAML 版本。老实说 - 一切都检查过了。图像/应用程序名称没有不匹配)

[更新 04.05.2020 16:15]

所以现在我 100% 知道发生了什么。在没有任何错误/警告的情况下成功发布后,azure 函数就是空的 :)

我已经用高级工具检查了 wwwroot 的内容(在转到https://myAzureFunction.scm.azurewebsites.net/wwwroot/ 之后)

结果如下:

所以它为什么不起作用是可以理解的 :) 主要问题是 “到底发生了什么”?:)

我确实尝试在部署中心同步代码(如@djsly 建议的那样),但它不起作用(可能是因为它是由容器管理的)但是当我尝试同步时我正在添加一条消息:

[更新 05.05.2020 00:18]

我确实连接到 Azure 容器注册表并下载了映像,假设是在 Azure 中运行此 Azure 函数的映像。

所以我确实跑了:

docker login myAcrContainer.azurecr.io

docker pull myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11

docker run -it --rm -p 31234:80 myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11

我确实点击了http://localhost:31234/api/MyAzureFuncionFuns

一切正常。因此,它证实了我的怀疑,即图像没有在 Azure 门户上的 Azure 功能上正确“运行”。

问题是:我做错了什么 - 还是 Azure 错误?

有一个关于我的应用服务计划的问题。下面是它的样子(在 Azure 函数创建期间):

以下是计划详情:

现在是免费试用版(正如他们在我创建它时提出的那样)这可能是原因吗?他们不应该禁止某事而不是允许然后破坏某事吗?;)

【问题讨论】:

  • 从外观上看,您的 Azure Function 是在 Azure 级别创建的,但没有关联的源代码。
  • 从外观上我确实怀疑这一点。问题是“为什么”?因为在构建/发布管道中没有错误,并且当我在 VS 上按 F5 时它正在我的本地 docker 上运行
  • 查看部署中心选项卡,您可以在其中查看代码源并尝试重新发送其内容。这应该让您更深入地了解为什么没有任何代码与 azure 函数相关联。
  • @djsly - 你告诉我“正确的东西”是否正在发布到应用程序。我想,最终,发布管道配置错误。我将使用当前的发布管道(和阶段)更新问题
  • 但是在检查完之后 - 我想一切都应该工作。构建管道正在保存到适当的存储库。发布管道正在获取正确的图像。我看不出哪里有问题

标签: azure docker azure-devops azure-functions azure-container-registry


【解决方案1】:

对于任何有类似问题的人

我得到了或多或少的信息“问题的根本原因是什么”。微软支持人员联系了我并指出,这是 docker 文件的问题。

他指出了两件事:我正在将AzureWebJobsScriptRoot 更改为/app。他声称这可能是它在本地机器上运行而不是在 AzureWebJobsScriptRoot/home/site/wwwroot 的 Azure 门户上运行的原因

关于这句话的两个有趣的事实:

1) 创建这个 dockerfile 的人不是我(我离菜鸟还很远)这是 MS(插件)的功能,它允许您右键单击项目并选择 Add->Docker 支持

这是这个功能:https://docs.microsoft.com/pl-pl/visualstudio/containers/overview?view=vs-2019

2) 到底谁会在工作环境中造成如此大的差异,以至于在本地 docker 上运行的东西在 Azure 门户上的 docker 上无法运行 - 这太疯狂了 :)

他建议我学习本教程: https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-function-linux-custom-image?tabs=bash%2Cportal&pivots=programming-language-csharp

并使用此命令:

func init LocalFunctionsProject --worker-runtime dotnet --docker

它会创建这样的 docker 文件(或多或少)

FROM microsoft/dotnet:2.2-sdk AS installer-env

COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
    mkdir -p /home/site/wwwroot && \
    dotnet publish *.csproj --output /home/site/wwwroot

# To enable ssh & remote debugging on app service change the base image to the one below
# FROM mcr.microsoft.com/azure-functions/dotnet:2.0-appservice 
FROM mcr.microsoft.com/azure-functions/dotnet:2.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
    AzureFunctionsJobHost__Logging__Console__IsEnabled=true

COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]

这里最重要的是 - 它适用于 Azure Function 2,而我正在使用 Azure Function 3。不过,我确实更改了图像版本以适应版本 3,并且我确实对其进行了扩展以涵盖以下事实,即我必须构建引用的库。但它仍然不工作:)(意思是,它在本地工作,但在 Azure 门户上不工作)

我将仅根据 docker 的问题创建新的 SOF。但我留下了这条评论 - 也许它会对某人有所帮助。

[更新 13.05.2020]

适用于寻找问题根本原因的任何人。如果您要查找 Azure 功能上的 404 问题 - 请查看此处:Docker issue with Azure Function on Linux container - function missing leading to 404 on function run

【讨论】:

    【解决方案2】:

    我遇到了这个问题,但部分原因是 Visual Studio 很愚蠢,部分原因是我的文件夹结构以及我期望 Visual Studio 的工作方式。

    这是我的文件夹结构:

    /repoRoot/Engines/MyEngine/MyEngine/Dockerfile
    /repoRoot/Engines/MyEngine/MyEngine/myengine.csproj
    ...etc
    

    Visual Studio 像这样执行 docker build 命令(以及 Dockerfile 上下文):

    docker build -f "G:\repoRoot\enginesFolder\engineIWasWorkingOn\Dockerfile" --force-rm -t imgname:latest --target installer-env --label "com.microsoft.created-by=visual-studio" --label "com.microsoft.visual-studio.project-name=imgname" "G:\repoRoot\enginesFolder\

    最后一个参数很重要——我希望它从内部的MyEngine 文件夹中执行,Dockerfile 所在的位置。

    除此之外,我还需要开启: WEBSITES_ENABLE_APP_SERVICE_STORAGE: true 在我的 azure 应用服务配置中,我需要将 Azure Functions 版本设置为 2,这就是我的 host.json 目标的原因。

    最终,这是我最终使用的 dockerfile:

    FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS installer-env
    COPY . /src/dotnet-function-app
    
    RUN cd /src/dotnet-function-app/YourInnerFolderHere && \
        mkdir -p /home/site/wwwroot && \
        dotnet publish *.csproj --output /home/site/wwwroot
    
    FROM mcr.microsoft.com/azure-functions/dotnet:2.0
    ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
        AzureFunctionsJobHost__Logging__Console__IsEnabled=true
    
    COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
    
    VOLUME /home/site/wwwroot /home/site/wwwroot
    

    请注意上面的“/YourInnerFolderHere”——我需要进入csproj所在的内部文件夹。

    我添加了 VOLUME 地图,但我认为它不会导致此部署成功。我在尝试确定之间更改了太多东西,但删除它并重新部署并没有让我的函数应用停止工作。

    【讨论】:

    • 就是这样。我的文件夹结构不同。我的 docker 文件比 procjet 文件夹高一级(因为我必须构建还引用的项目)你可以看到我的另一个 SOF 纯粹专用于这个问题的 docker 和描述:stackoverflow.com/questions/61711756/… 在我描述的这个 SOF 中,我确实更改了 docker 文件,它与您发布的非常相似。但它仍然无法正常工作。你可以去那里看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2016-09-11
    相关资源
    最近更新 更多