Задание Stream Analytics развернуто как шаблон диспетчера ресурсов Azure (ARM)
Я пытаюсь настроить выходной EventHub для задания аналитики потока, определенного как шаблон JSON. Без выходного бита шаблон успешно развернут, однако при добавлении выходного определения он завершается неудачно с:
Deployment failed. Correlation ID: <SOME_UUID>. {
"code": "BadRequest",
"message": "The JSON provided in the request body is invalid. Property 'eventHubName' value 'parameters('eh_name')' is not acceptable.",
"details": {
"code": "400",
"message": "The JSON provided in the request body is invalid. Property 'eventHubName' value 'parameters('eh_name')' is not acceptable.",
"correlationId": "<SOME_UUID>",
"requestId": "<SOME_UUID>"
}
}
Я определил шаблон ARM как:
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "westeurope"
},
"hubName": {
"type": "string",
"defaultValue": "fooIotHub"
},
"eh_name": {
"defaultValue": "fooEhName",
"type": "String"
},
"eh_namespace": {
"defaultValue": "fooEhNamespace",
"type": "String"
},
"streamAnalyticsJobName": {
"type": "string",
"defaultValue": "fooStreamAnalyticsJobName"
}
},
"resources": [{
"type": "Microsoft.StreamAnalytics/StreamingJobs",
"apiVersion": "2016-03-01",
"name": "[parameters('streamAnalyticsJobName')]",
"location": "[resourceGroup().location]",
"properties": {
"sku": {
"name": "standard"
},
"outputErrorPolicy": "Drop",
"eventsOutOfOrderPolicy": "adjust",
"eventsOutOfOrderMaxDelayInSeconds": 0,
"eventsLateArrivalMaxDelayInSeconds": 86400,
"inputs": [{
"Name": "IoTHubInputLable",
"Properties": {
"DataSource": {
"Properties": {
"iotHubNamespace": "[parameters('hubName')]",
"sharedAccessPolicyKey": "[listkeys(resourceId('Microsoft.Devices/IotHubs/IotHubKeys',parameters('hubName'), 'iothubowner'),'2016-02-03').primaryKey]",
"sharedAccessPolicyName": "iothubowner",
"endpoint": "messages/events"
},
"Type": "Microsoft.Devices/IotHubs"
},
"Serialization": {
"Properties": {
"Encoding": "UTF8"
},
"Type": "Json"
},
"Type": "Stream"
}
}],
"transformation": {
"name": "Transformation",
"properties": {
"streamingUnits": 1,
"query": "<THE SQL-LIKE CODE FOR THE JOB QUERY>"
}
},
"outputs": [{
"name": "EventHubOutputLable",
"properties": {
"dataSource": {
"type": "Microsoft.ServiceBus/EventHub",
"properties": {
"eventHubName": "parameters('eh_name')",
"serviceBusNamespace": "parameters('eh_namespace')",
"sharedAccessPolicyName": "RootManageSharedAccessKey"
}
},
"serialization": {
"Properties": {
"Encoding": "UTF8"
}
}
}
}]
}
}]
}
Проверка здесь https://docs.microsoft.com/en-us/azure/templates/microsoft.streamanalytics/streamingjobs выглядит так, что структура JSON для вывода соответствует ожидаемой (с properties
поле вместе с type
).
Я выяснил эти "свойства концентратора событий" из браузера Chrome с помощью Инструментов разработчика и проверил подробности HTTP-запроса "GetOutputs", в противном случае я не уверен, где я могу узнать, как задать эти свойства? Структура выглядит очень похоже на структуру входного IoT Hub (которая работает), в этом случае используются различные метки для свойств, связанных с деталями IoT Hub.
Проверка этого поста в блоге https://blogs.msdn.microsoft.com/david/2017/07/20/building-azure-stream-analytics-resources-via-arm-templates-part-2-the-template/ вывод часть относится к PowerBI, и похоже, что для свойств используется другая структура: outputPowerBISource
поэтому я попытался использовать для Event Hub поле outputEventHubSource
(из проверок с использованием Chrome Developer Tools) вместо properties
, но тогда я получаю эту ошибку:
Deployment failed. Correlation ID: <SOME_UUID>. {
"code": "BadRequest",
"message": "The JSON provided in the request body is invalid. Required property 'properties' not found in JSON. Path '', line 1, position 1419.",
"details": {
"code": "400",
"message": "The JSON provided in the request body is invalid. Required property 'properties' not found in JSON. Path '', line 1, position 1419.",
"correlationId": "<SOME_UUID>",
"requestId": "<SOME_UUID>"
}
}
Командой, которую я использую для развертывания этого шаблона, является интерфейс командной строки Azure (с компьютера с Linux Debian):
az group deployment create \
--name "deployStreamAnalyticsJobs" \
--resource-group "MyRGName" \
--template-file ./templates/stream-analytics-jobs.json
Как указать выходные данные в шаблоне диспетчера ресурсов Azure (ARM) для задания Stream Analytics?
2 ответа
Я выяснил, что все параметры должны быть заключены в квадратные скобки (как указано в другом ответе на этот вопрос).
Также для динамического извлечения ключа политики общего доступа (или любого другого параметра для существующего ресурса, такого как концентратор событий), комбинация функций, таких как listKeys
а также resourceId
и т. д., см. ниже полный пример концентратора событий, описанного как выход для задания Stream Analytics.
Подробно:
- параметры, определенные для
eventHubName
а такжеserviceBusNamespace
должен оцениваться с использованием квадратных скобок (см., как я определил эти параметры в примере JSON в основной части вопроса, который я задал выше), - политика общего доступа может быть жестко закодированной строкой (или параметром, как раньше), например
sharedAccessPolicyName
или динамически извлекается с помощью"sharedAccessPolicyKey": "[listKeys(resourceId('Microsoft.EventHub/namespaces/eventhubs/authorizationRules', parameters('eh_namespace'), parameters('eh_name'), 'RootManageSharedAccessKey'),'2017-04-01').primaryKey]"
дляsharedAccessPolicyKey
(это конфиденциальные данные, и их следует защищать, избегая жесткого кодирования информации в виде простой строки)
В следующей конфигурации JSON показан существующий концентратор событий, определенный как выходной файл, определенный для задания Stream Analytics:
"outputs": [{
"Name": "EventHubOutputLable",
"Properties": {
"DataSource": {
"Type": "Microsoft.ServiceBus/EventHub",
"Properties": {
"eventHubName": "[parameters('eh_name')]",
"serviceBusNamespace": "[parameters('eh_namespace')]",
"sharedAccessPolicyKey": "[listKeys(resourceId('Microsoft.EventHub/namespaces/eventhubs/authorizationRules', parameters('eh_namespace'), parameters('eh_name'), 'RootManageSharedAccessKey'),'2017-04-01').primaryKey]",
"sharedAccessPolicyName": "RootManageSharedAccessKey"
}
},
"Serialization": {
"Properties": {
"Encoding": "UTF8"
},
"Type": "Json"
}
}
}]
Любое свойство, которое содержит параметр (или любое выражение, которое должно быть оценено, должно содержать квадратные скобки, например
"eventHubName": "[parameters('eh_name')]",
"serviceBusNamespace": "[parameters('eh_namespace')]",
В противном случае используется литеральное значение в кавычках.
Это поможет?