Задание 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')]",

В противном случае используется литеральное значение в кавычках.

Это поможет?

Другие вопросы по тегам