Azure функция HTTP запущена на linux контейнере - функция не работает 404 - PullRequest
3 голосов
/ 03 мая 2020

Я застрял и, может быть, вы можете помочь мне. (Обновление: после расследования я знаю, что он не работает, потому что папка wwwroot для функции Azure после сборки / выпуска пуста. Главный вопрос - почему)

Я пытаюсь опубликовать sh Azure Функция с использованием Azure Реестр контейнеров (Linux). Этот шаг, я думаю, выполнен успешно. Я создал конвейер CI / CD, и все было опубликовано правильно.

Когда я захожу на главную страницу функции azure, например: https://myAzureFuncion.azurewebsites.net/ (это только пример)

Я вижу:

enter image description here

В начале самой функции. Ничего особенного, так как я просто хотел проверить 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");
        }

Так что я хорошо go - верно? Нет, так как это не работает. Я пытаюсь вызвать эту функцию по HTTP-запросу:

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

И я продолжаю получать 404 Not Found. Я проверил это с почтальоном: то же самое (ранее с авторизацией функции я пробовал с? Code = (code_in_host) и с заголовками x-functions-key. Все время та же информация -> 404 не найдена)

Поскольку эта функция не существует.

Конечно, когда я запускаю ее локально (используя docker для windows), все работает правильно. Я бегу:

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

И я получаю правильный ответ.

Можете ли вы указать мне, что проверить и как диагностировать проблему здесь? Я ввел App Insights Live Metrics -> но никаких запросов не замечено.

Как диагностировать проблему здесь?

[ОБНОВЛЕНИЕ 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 Portal для этой Azure функции. Когда я go в меню функций - есть информация, что его нет:

enter image description here

То же самое появляется, когда я использую "новый Azure Опыт управления функциями "

enter image description here

[ОБНОВЛЕНИЕ 04.05.2020 11:40]

Установка больше информации по делу. Вот как выглядит docker image:

#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 Портал:

enter image description here

И журналы с последней 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]

Я проверил центр развертывания, и он выглядит нормально:

enter image description here

Но поскольку я публикую 3 функции (1 концентратор SignalR и 2 azure функций - конечно, обе "не работают"), я думаю - возможно, это как-то смешалось ( и в этом azure приложении функции - на самом деле SignalR публикуется?

Я проверил этот журнал задач выпуска (который предполагает публикацию sh MyAzureFunction), и все выглядит правильно (везде моя функция MyAzureFunction в log):

enter image description here

Вот как выглядит мой конвейер Release:

enter image description here

А вот конфигурация триггера непрерывного развертывания:

enter image description here

А вот настройки предустановки этапа 2 (для публикации azure):

enter image description here

И, наконец, сам шаг выпуска (хотя я уже опубликовал его версию YAML. Чтобы быть хонами - все проверено. В имени изображения / приложения нет несоответствия)

enter image description here

[ОБНОВЛЕНИЕ 04.05.2020 16:15]

Так что сейчас на 100% я знаю, что происходит. После успешного выпуска без каких-либо ошибок / предупреждений функция azure просто пуста:)

Я проверил с помощью расширенных инструментов содержимое wwwroot (после перехода к https://myAzureFunction.scm.azurewebsites.net/wwwroot/)

Вот результат:

enter image description here

Так что вполне понятно, почему он не работает :) Главный вопрос "Что, черт возьми, случилось" ?:)

I пытался в центре развертывания синхронизировать код c (как предложено @djsly), но он не работает (возможно, потому что он управляется контейнерами), но я добавляю сообщение, когда пытаюсь синхронизировать c:

enter image description here

[ОБНОВЛЕНИЕ 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):

enter image description here

А вот детали плана:

enter image description here

Сейчас это бесплатная пробная версия (как они предлагали, когда я ее создавал) Может ли это быть причиной? Разве они не должны запрещать что-то вместо того, чтобы позволять, а потом ломать вещи?;)

Ответы [ 2 ]

3 голосов
/ 10 мая 2020

Для тех, у кого есть подобные проблемы

Я получил более или менее подробную информацию о "root причине" проблемы. Сотрудник службы поддержки MS связался со мной и указал, что это проблема с файлом docker.

Он указал на две вещи: я меняю AzureWebJobsScriptRoot на /app. Он утверждал, что это может быть причиной того, что он работает на локальной машине, а не на Azure Portal, где AzureWebJobsScriptRoot равен /home/site/wwwroot

Два забавных факта об этом утверждении:

1) это не я создаю этот dockerfile (мне далеко до ладьи ie). Функциональность MS (плагина) позволяет вам щелкнуть правой кнопкой мыши по проекту и выбрать Add -> Docker support *. 1013 *

Вот эта функциональность: https://docs.microsoft.com/pl-pl/visualstudio/containers/overview?view=vs-2019

2) Кто на земле может создать такие несоответствия в рабочей среде, что что-то работает на docker локально не будет работать на docker на Azure Portal - это безумие:)

Он посоветовал мне go с этим уроком: 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 Функция 2, и я использую Azure Функция 3. Тем не менее, я изменил версию изображений, чтобы соответствовать v 3, и я расширил его, чтобы охватить тот факт, что я должен построить библиотеку, на которую ссылаются. Но он все еще не работает :) (имеется в виду, что он работает локально, но не работает на Azure Portal)

Я создам новый SOF просто по вопросу docker. Но я оставляю этот комментарий - возможно, он кому-нибудь поможет.

2 голосов
/ 11 мая 2020

У меня была эта проблема, но отчасти это была глупая Visual Studio, а отчасти из-за структуры моей папки и того, как я ожидал, что Visual Studio будет работать.

Это была моя структура папок:

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

Visual Studio выполняет команду построения docker (и, следовательно, контекст 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\

Последний параметр является важным битом - I ожидал, что он будет выполняться из внутренней папки MyEngine, где был Dockerfile.

Кроме того, мне нужно было включить: WEBSITES_ENABLE_APP_SERVICE_STORAGE: true в моей конфигурации службы приложения azure, и я необходимо установить для версии Azure Функции 2, поэтому моя цель host.json.

В конечном счете, это файл докерства, который я в итоге использовал:

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, но не думаю, что это приведет к успеху это развертывание. Между попытками узнать наверняка я изменил слишком много вещей, но удаление и повторное развертывание не заставило мое функциональное приложение перестать работать.

...