Триггер Azure IoT Hub (Event Hub): не найдено допустимой комбинации сведений об учетной записи

#azure #azure-functions #azure-iot-hub

#azure #azure-функции #azure-iot-hub

Вопрос:

Я новичок в Azure и в настоящее время изучаю быстрый запуск IoT Hub здесь.

Отправка телеметрии с устройства на IoT hub и считывание ее с помощью внутреннего приложения работает до сих пор.

Я установил расширение vs code и успешно выполнил пример HTTP-триггера для функций Azure здесь.

На следующем шаге я попытался настроить функцию Azure IoT Hub (Event Hub). Это приводит к следующей ошибке при локальном тестировании:

 Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.funcexample'. Microsoft.WindowsAzure.Storage: No valid combination of account information found.
  

Я добавил Event Hub-compatible endpoint строку IoT Hub в local.settings.json :

 {
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "Endpoint=sb://.../;SharedAccessKeyName=iothubowner;SharedAccessKey=...;EntityPath=...",
    "FUNCTIONS_WORKER_RUNTIME": "node"
  }
}
  

Я заметил, что SharedAccessKey via az iot hub policy show --name service --query primaryKey --hub-name {your IoT Hub name} не соответствует ключу на портале Azure. Оба ключа приводят к вышеупомянутому предупреждению.
Edit1: SharedAccessKey s различаются для service и iothubowner.

Правка2: я думаю, что моя основная проблема связана со строкой подключения. Какая строка подключения требуется и как она формируется. И в какой файл / параметр следует поместить строку подключения?

Вот другие связанные файлы (в основном нетронутые). function.json

 {
  "bindings": [
    {
      "type": "eventHubTrigger",
      "name": "IoTHubMessages",
      "direction": "in",
      "eventHubName": "samples-workitems",
      "connection": "AzureWebJobsStorage",
      "cardinality": "many",
      "consumerGroup": "$Default"
    }
  ]
}
  

index.js

 module.exports = function (context, IoTHubMessages) {
    context.log(`JavaScript eventhub trigger function called for message array: ${IoTHubMessages}`);
    
    IoTHubMessages.forEach(message => {
        context.log(`Processed message: ${message}`);
    });

    context.done();
};
  

host.json:

 {
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[2.*, 3.0.0)"
  }
}
  

proxy.json:

 {
  "$schema": "http://json.schemastore.org/proxies",
  "proxies": {}
}
  

package.json:

 {
  "name": "funcexample",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "start": "func start",
    "test": "echo "No tests yet...""
  },
  "dependencies": {},
  "devDependencies": {}
}
  

Что я упускаю?

Комментарии:

1. Попробуйте добавить @azure/event-hubs пакет, а для получения информации, связанной со строкой подключения, обратитесь к этому (ссылка) [ learn.microsoft.com/en-us/azure/iot-hub /…

Ответ №1:

У меня возникли некоторые общие недоразумения в отношении учетных записей хранения, фактического IoT Hub и их строк подключения в контексте функций Azure в процессе производства и разработки (тестирование их локально).).

Для локального тестирования я установил эмулятор локального хранилища Azurite через npm install -g azurite и выбрал следующую настройку для local.settings.json

 {
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "AzureWebJobsDashboard": "UseDevelopmentStorage=true",
    "ConnectionString": "Endpoint=sb://.../;SharedAccessKeyName=...;SharedAccessKey=...;EntityPath=...",
    "FUNCTIONS_WORKER_RUNTIME": "node"
  }
}
  

и function.json .

 {
  "bindings": [
    {
      "type": "eventHubTrigger",
      "name": "IoTHubMessages",
      "direction": "in",
      "eventHubName": "samples-workitems",
      "connection": "ConnectionString",
      "cardinality": "many",
      "consumerGroup": "$Default"
    }
  ]
}