Как исправить «HostInitializationException» в функциях Azure - PullRequest
1 голос
/ 05 июня 2019

Сначала я следовал инструкциям, чтобы запустить приложение-функцию.https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-python

После успешного создания приложения я развернул небольшую функцию HTTP-запуска в Azure для целей тестирования.

Моя функция написана на python.Я использую ОС Linux для отправки в Azure.Все выглядит хорошо.

Я использую это утверждение для публикации: func azure functionapp publish myApp --publish-local-settings

После успешного развертывания в Azure я попытался дозвониться "https://myAppName.azurewebsites.net",, который сначала дает мне сайт с кодом ошибки 502. Через несколько минут он меняет свой статус, и я получаю страницу приветствия функций Azure.

Если я пытаюсь получить доступ к функции напрямую через: https://myAppName.azurewebsites.net/api/functionName

Я получаю 502 .. Даже после ожидания 30 минут функция все еще не работает правильно.

Пожалуйста, дайте мне знать, если у вас есть полезная информация.

Взгляните на «Application Insights», показывает некоторую дополнительную информацию:

09:55:40 | Trace@(none)
Hosting stopping
09:55:40 | Exception | HostInitializationException@(none)
Did not find functions with language [python].
09:55:40 | Trace@(none)
A host error has occurred
09:55:40 | Trace@(none)
Creating function descriptors.
09:55:40 | Trace@(none)
Adding Function descriptor provider for language python.
09:55:40 | Trace@(none)
1 proxies loaded
import logging

import azure.functions as func


def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        return func.HttpResponse(f"Hello {name}!")
    else:
        return func.HttpResponse(
             "Please pass a name on the query string or in the request body",
             status_code=400
        )


{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}
{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "python"
  }
}
{
  "version": "2.0"
}

1 Ответ

0 голосов
/ 20 июня 2019

Возможная причина ошибок, которые вы видите, связана с файлом local.settings.json, который был опубликован в Azure с помощью параметра --publish-local-settings, переопределяющего параметры в приложении-функции Azure.

С помощью приведенных ниже файлов удалось разместить его локально, а также опубликовать его в Azure.

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureWebJobsStorage": "{AzureWebJobsStorage}"
  }
}

host.json

{
    "version":  "2.0"
}

function.json

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

init .py

import logging

import azure.functions as func


def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        return func.HttpResponse(f"Hello {name}!")
    else:
        return func.HttpResponse(
             "Please pass a name on the query string or in the request body",
             status_code=400
        )

Выполнение следующих шагов в VS Code

func init MyFunctionProj2 (selected Python)
cd .\MyFunctionProj2\
func new (selected HTTP trigger)
func host start     

#Pick your region of choice

az functionapp create --resource-group rgname --os-type Linux --consumption-plan-location westeurope  --runtime python --name funcappname --storage-account storageaccountname

func azure functionapp publish funcappname

При размещении на локальном сервере он работает с указанным ниже URL

enter image description here

При публикации в Azure Function, выполнив следующие шаги, перечисленные выше

enter image description here

URL-адрес функции можно получить на портале Azure с помощью функции

enter image description here

Проверьте настройки приложения-функциииметь правильную строку подключения для хранения.

Дополнительная справочная документация для локального файла настроек.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...