Развертывание функции Azure с помощью serviceBusTrigger в существующем приложении функций с использованием API Kudu не запускается даже после синхронизации вручную - PullRequest
0 голосов
/ 29 июня 2019

У меня есть приложение-функция, в котором мне нужно развернуть функцию serviceBusTrigger после действий пользователя в приложении. Для этого я использовал следующую запись Развертывание функции Azure из кода (c #) .

Функция Azure версии 2.0 для этого приложения функции

В настоящее время я создаю zip-файл, содержащий /function.json, который публикуется в конечной точке api / zip с использованием следующего метода

public void CreateAzureFunctionToMonitorQueue(string functionName, string serviceBusQueueName, string path)
    {
        // create zip of new function
        // ZipFile.CreateFromDirectory will create a zip with the directory's name containing the directory's contents
        // so CreateZipOfFunc creates a structure <functionName>/<functionName>/function.json
        // so that the zip contains <functionName>/function.json 
        // which is the required input for api/zip/ from kudu api
        var zipFile = CreateZipOfFunc(functionName, serviceBusQueueName, path);
        var file = File.ReadAllBytes(zipFile);

        MemoryStream stream = new MemoryStream(file);

        using (var client = new HttpClient())
        {
            // deploy zip using Kudu REST api
            client.DefaultRequestHeaders.Add("Authorization", "Basic " + _base64Auth);
            var baseUrl = new Uri($"https://{_webFunctionAppName}.scm.azurewebsites.net/");
            var requestURl = baseUrl + "api/zip/site/wwwroot";
            var httpContent = new StreamContent(stream);
            var response = client.PutAsync(requestURl, httpContent).Result;
        }
        // remove files
        Directory.Delete($"{path}{functionName}", true);
        File.Delete($"{path}{functionName}.zip");
        // deployment using Kudu REST api requires the function triggers to be manually synced
        SyncTriggers();
    }

В конце я запускаю SyncTriggers, который вручную синхронизирует триггер приложения функции, потому что я прочитал, что для развертывания этого способа требуется это для всех триггеров, кроме http, найденный здесь https://docs.microsoft.com/en-us/azure/azure-functions/functions-deployment-technologies. Я использую второй метод ручной синхронизации триггеров , Ниже приведен метод

public void SyncTriggers()
    {
        using (var client = new HttpClient())
        {
            var requestUrl = $"https://{_webFunctionAppName}.azurewebsites.net/admin/host/synctriggers?code={_MASTER_KEY}";
            var httpContent = new StringContent("");
            var response = client.PostAsync(requestUrl, httpContent).Result;
        }
    }

Результат обоих запросов успешен, и когда я смотрю на портале Azure, появляется новая функция с файлом function.json, который соответствует работающему serviceBusTrigger при развертывании с использованием веб-приложения Visual Studio.

Для проверки этого я сначала отключаю работающую функцию Azure, запускаю приведенный выше код и затем помещаю новое сообщение в отслеживаемую очередь; однако ничего не происходит, когда сообщение становится активным.

Если я включу функцию, развернутую с использованием уже существующей VS, эта функция сработает и обработает сообщение.

Файл function.json существующей функции выглядит следующим образом

{
  "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.26",
  "configurationSource": "attributes",
  "bindings": [
    {
      "type": "serviceBusTrigger",
      "connection": "ServiceBusConnection",
      "queueName": "myqueue",
      "name": "queueItem"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/MyProject.MyLibrary.dll",
  "entryPoint": "MyProject.MyLibrary.MyClass.RunAsync"
}

Функция, развернутая с использованием вышеуказанного метода, имеет функцию.json, подобную следующей

{
  "generatedBy": "Microsoft.NET.Sdk.Functions - 1.0.26",
  "configurationSource": "attributes",
  "bindings": [
    {
      "type": "serviceBusTrigger",
      "connection": "ServiceBusConnection",
      "queueName": "myqueue",
      "name": "queueItem"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/MyProject.MyLibrary.dll",
  "entryPoint": "MyProject.MyLibrary.MyClass.RunAsync"
}

Я что-то упустил? Мой вариант использования для этого: после создания новой очереди я хочу создать функцию наблюдения за лазурью для ее прослушивания. Создание очереди с использованием NameSpaceManager работает нормально, а отправка сообщений в нее также работает нормально. Я просто не могу заставить этот тестовый пример работать, когда я создаю функцию для мониторинга существующей очереди.

Возможно, функция не регистрируется и правильно настраивается при вызове SyncTrigger ??

Спасибо

Редактировать: Я только что видел этот пост https://blogs.msdn.microsoft.com/benjaminperkins/2018/08/07/why-does-my-azure-function-sometimes-stop-being-triggered/ который говорит:

Your endpoint must trigger/bind to only one Azure Function

Означает ли это, что я могу зарегистрировать только одну функцию в моей загруженной dll? Должен ли я вместо этого загрузить нужную мне копию метода точки входа с другим именем в виде .csx с файлом function.json?

Edit2: кажется, что это просто связано с az fns для привязки ресурса, похоже, не помогает

Edit3: После долгих исследований кажется, что источник конфигурации для моего сгенерированного function.json должен быть не «атрибутами», а «config». Собираюсь проверить это сейчас.

Edit4: проблема была устранена путем удаления generateBy и изменения конфигурационного источника на «config» в генерируемом мной файле function.json.

Редактировать5: удалены вводящие в заблуждение вопросы

1 Ответ

0 голосов
/ 01 июля 2019

Проблема в том, что функции, развернутые с использованием VS, имеют два свойства в function.json

"generatedBy": "Microsoft.NET.Sdk.Functions - 1.0.26",
"configurationSource": "attributes",

, который на самом деле просто сообщает лазурь, откуда была сгенерирована функция, и использует атрибуты метода, который является точкой входа функции, в качестве источника конфигурации. Удаление generateBy позволяет отредактировать функцию на портале Azure, а изменение configSource на «config» указывает среде выполнения функции Azure использовать файл function.json для привязки конфигурации, а что нет.

Однако на лазурном портале я получаю сообщение

Error:

Function (MyFunction) Error: Configuration error: all functions in D:\home\site\wwwroot\bin\MyProject.MyLibrary.dll must have the same value for 'configurationSource'.
Session Id: MY_SESSION_ID

Timestamp: 2019-06-30T21:04:22.709Z

Моя развернутая функция все еще работала, а другие существующие функции, имеющие привязки http, которые вызывает развернутая функция, все еще работают (у них есть файлы function.json, которые сгенерированы Skd.Functions и configurationSource: "attribute", поэтому это не так. похоже, что в настоящий момент это ошибка make или break, но я буду менять свое развертывание, чтобы у всех был источник конфигурации: «config»

поэтому изменив выходной файл function.json на

{
  "configurationSource": "config",
  "bindings": [
    {
      "type": "serviceBusTrigger",
      "connection": "ServiceBusConnection",
      "queueName": "myqueue",
      "name": "queueItem"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/MyProject.MyLibrary.dll",
  "entryPoint": "MyProject.MyLibrary.MyClass.RunAsync"
}

решил мою проблему

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