New-StreamAnalyticsJob 无法为 IOT 中心创建操作监控输入

New-StreamAnalyticsJob cannot create Operations Monitoring Input for an IOT Hub

我们有一个流分析作业,它有一个到 IOT 中心操作监控端点的输入映射。我们最初在 Azure 门户上定义了我们的工作。这样创建/更新后它工作正常。

我们在多个“Azure 环境”中使用作业逻辑,现在将其保存在源代码管理中。我们使用 Visual Studio 流分析项目类型来管理源代码。

我们正在使用 New-StreamAnalyticsJob Powershell 命令将我们的作业部署到不同的环境中。

然而,每次我们部署时,生成的流分析作业的输入都会指向我们 IOT 中心的消息端点,而不是操作监控端点。

是否可以在输入的 JSON 文件中输入一些内容来表达端点类型?这是我们 JSON 输入到 cmdlet 的 Input 内容:

"Inputs": [{
                "Name": "IOT-Hub-Monitoring-By-Consumer-Group",
                "Properties": {
                    "DataSource": {
                        "Properties": {
                            "ConsumerGroupName": "theConsumerGroup",
                            "IotHubNamespace": "theIotNamespace",
                            "SharedAccessPolicyKey": null,
                            "SharedAccessPolicyName": "iothubowner"
                        },
                        "Type": "Microsoft.Devices/IotHubs"
                    },
                    "Serialization": {
                        "Properties": {
                            "Encoding": "UTF8",
                            "Format": "LineSeparated"
                        },
                        "Type": "Json"
                    },
                    "Type": "Stream"
                }
            },
            {
                "Name": "IOT-Hub-Messaging-By-Consumer-Group",
                "Properties": {
                    "DataSource": {
                        "Properties": {
                            "ConsumerGroupName": "anotherConsumerGroup",
                            "IotHubNamespace": "theIotNamespace",
                            "SharedAccessPolicyKey": null,
                            "SharedAccessPolicyName": "iothubowner"
                        },
                        "Type": "Microsoft.Devices/IotHubs"
                    },
                    "Serialization": {
                        "Properties": {
                            "Encoding": "UTF8",
                            "Format": "LineSeparated"
                        },
                        "Type": "Json"
                    },
                    "Type": "Stream"
                }
            }
        ]

IotHubProperties 中是否有我们没有表达的 endpoint 元素?它在某处记录了吗?

我注意到 Azure 门户调用的端点与此处指示的端点不同:https://docs.microsoft.com/en-us/rest/api/streamanalytics/stream-analytics-definition

它使用 https://main.streamanalytics.ext.azure.com/api 下的端点。例如 GET /api/Jobs/GetStreamingJob?subscriptionId={guid}&resourceGroupName=MyRG&jobName=MyJobName

您会在结果中注意到 JSON:

{
  "properties": {
    "inputs": {
      {
        "properties": {
          "datasource": {
            "inputIotHubSource": {
              "iotHubNamespace":"HeliosIOTHubDev",
              "sharedAccessPolicyName":"iothubowner",
              "sharedAccessPolicyKey":null,
         ---> "endpoint":"messages/events",  <---
              "consumerGroupName":"devicehealthmonitoring"
            }

对于操作监控,您将看到 "endpoint":"messages/operationsMonitoringEvents"

他们似乎将输入保存为 PATCH /api/Inputs/PatchInput?...,它采用类似构造的 JSON,endpoint 具有相同的 2 个值。 你能以某种方式使用那个端点吗?即像往常一样调用 New-AzureRmStreamAnalyticsJob 然后 Invoke-WebRequest -Method Patch -Uri ...

--编辑--

Invoke-WebRequest 是行不通的 -- 太多的身份验证无法尝试 replicate/emulate。

更好的选择是通过 this tutorial 创建控制台应用程序并在部署后使用 Powershell 脚本设置端点。

这样的事情应该可行(尽管绝对没有 error/null 检查):

string tenantId = "...";        //Tenant Id Guid
string subscriptionId = "...";  //Subcription Id Guid
string rgName = "...";          //Name of Resource Group
string jobName = "...";         //Name of Stream Analytics Job
string inputName = "...";       //Name-of-Input-requiring-operations-monitoring
string accesskey = "...";       //Shared Access Key for the IoT Hub

var login = new ServicePrincipalLoginInformation();
login.ClientId = "...";         //Client / Application Id for AD Service Principal (from tutorial)
login.ClientSecret = "...";     //Password for AD Service Principal (from tutorial)

var environment = new AzureEnvironment
{
    AuthenticationEndpoint = "https://login.windows.net/",
    GraphEndpoint = "https://graph.windows.net/",
    ManagementEnpoint = "https://management.core.windows.net/",
    ResourceManagerEndpoint = "https://management.azure.com/",
};
var credentials = new AzureCredentials(login, tenantId, environment)
    .WithDefaultSubscription(subscriptionId);

var azure = Azure
    .Configure()
    .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
    .Authenticate(credentials)
    .WithDefaultSubscription();

var client = new StreamAnalyticsManagementClient(credentials);
client.SubscriptionId = azure.SubscriptionId;

var job = client.StreamingJobs.List(expand: "inputs").Where(j => j.Name == jobName).FirstOrDefault();
var input = job.Inputs.Where(i => i.Name == inputName).FirstOrDefault();

var props = input.Properties as StreamInputProperties;
var ds = props.Datasource as IoTHubStreamInputDataSource;

ds.Endpoint = "messages/operationsMonitoringEvents";
ds.SharedAccessPolicyKey = accesskey;

client.Inputs.CreateOrReplace(input, rgName, jobName, inputName);

@DaveMontgomery 的建议很好,但结果证明不需要。

一个简单的 CMDLET 升级解决了这个问题。

原来的根本问题是 Azure Powershell Cmdlet,直到并包括版本 4.1.x 使用的是旧版本的 Microsoft.Azure.Management.StreamAnalytics 程序集,即 1.0Microsoft.Azure.Management.StreamAnalytics2.0 版本几个月前发布,据我所知,该版本包括向 Inputs JSON 结构添加一个 endpoint 元素。

此处记录了新的 CMDLET 版本:https://github.com/Azure/azure-powershell/releases/tag/v4.2.0-July2017. The commits for the release included https://github.com/Azure/azure-powershell/commit/0c00632aa8f767e58077e966c04bb6fc505da1ef,升级到 Microsoft.Azure.Management.StreamAnalytics v2.0

请注意,这是一项重要的更改,因为 JSON 从 PascalCase 更改为 camelCase。

有了这个改变,我们可以将 endpoint 元素添加到 Properties / DataSource /Properties IOT 输入,以及部署的流分析作业包含正确缝合到 operationsMonitoring 端点的 IOT 输入。