Implementación de CI/CD para Stream Analytics en IoT Edge mediante API
Puede habilitar la integración e implementación continuas para trabajos de Azure Stream Analytics mediante API REST. En este artículo se brindan ejemplos sobre qué API usar y cómo usarlas. Las API REST no son compatibles con Azure Cloud Shell.
Llamada a las API desde distintos entornos
Las API REST se pueden llamar tanto desde Linux como desde Windows. En los comandos siguientes se muestra la sintaxis adecuada de la llamada API. En secciones posteriores de este artículo se describirá el uso específico de las API.
Linux
En Linux, puede usar los comandos Curl
o Wget
:
curl -u { <username:password> } -H "Content-Type: application/json" -X { <method> } -d "{ <request body> }" { <url> }
wget -q -O- --{ <method> } -data="<request body>" --header=Content-Type:application/json --auth-no-challenge --http-user="<Admin>" --http-password="<password>" <url>
Windows
Para Windows, use PowerShell:
$user = "<username>"
$pass = "<password>"
$encodedCreds = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$pass)))
$basicAuthValue = "Basic $encodedCreds"
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Type", 'application/json')
$headers.Add("Authorization", $basicAuthValue)
$content = "<request body>"
$response = Invoke-RestMethod <url> -Method <method> -Body $content -Headers $Headers
echo $response
Creación de un trabajo de ASA en IoT Edge
Para crear un trabajo de Stream Analytics, llame al método PUT con la API Stream Analytics.
Método | URL de solicitud |
---|---|
PUT | https://management.azure.com/subscriptions/{subscription-id}/resourcegroups/{resource-group-name}/providers/Microsoft.StreamAnalytics/streamingjobs/{job-name}?api-version=2017-04-01-preview |
Ejemplo del comando mediante curl:
curl -u { <username:password> } -H "Content-Type: application/json" -X { <method> } -d "{ <request body> }" https://management.azure.com/subscriptions/{subscription-id}/resourcegroups/{resource-group-name}/providers/Microsoft.StreamAnalytics/streamingjobs/{jobname}?api-version=2017-04-01-preview
Ejemplo del cuerpo de la solicitud en JSON:
{
"location": "West US",
"tags": { "key": "value", "ms-suppressjobstatusmetrics": "true" },
"sku": {
"name": "Standard"
},
"properties": {
"sku": {
"name": "standard"
},
"eventsLateArrivalMaxDelayInSeconds": 1,
"jobType": "edge",
"inputs": [
{
"name": "{inputname}",
"properties": {
"type": "stream",
"serialization": {
"type": "JSON",
"properties": {
"fieldDelimiter": ",",
"encoding": "UTF8"
}
},
"datasource": {
"type": "GatewayMessageBus",
"properties": {
}
}
}
}
],
"transformation": {
"name": "{queryName}",
"properties": {
"query": "{query}"
}
},
"package": {
"storageAccount" : {
"accountName": "{blobstorageaccountname}",
"accountKey": "{blobstorageaccountkey}"
},
"container": "{blobcontaine}]"
},
"outputs": [
{
"name": "{outputname}",
"properties": {
"serialization": {
"type": "JSON",
"properties": {
"fieldDelimiter": ",",
"encoding": "UTF8"
}
},
"datasource": {
"type": "GatewayMessageBus",
"properties": {
}
}
}
}
]
}
}
Para más información, consulte la documentación de la API.
Publicación de un paquete de IoT Edge
Para publicar un trabajo de Stream Analytics en IoT Edge, llame al método POST mediante la API IoT Edge Package Publish.
Método | URL de solicitud |
---|---|
POST | https://management.azure.com/subscriptions/{subscriptionid}/resourceGroups/{resourcegroupname}/providers/Microsoft.StreamAnalytics/streamingjobs/{jobname}/publishedgepackage?api-version=2017-04-01-preview |
La llamada anterior a la API IoT Edge Package Publish desencadena una operación asincrónica y devuelve un estado de 202. El encabezado de la respuesta de la ubicación contiene el URI que se usa para obtener el estado de esa operación asincrónica. Una llamada al URI en el encabezado de ubicación devuelve un estado de 202 para indicar que la operación asincrónica sigue en curso. Una vez completada la operación, la llamada al URI en el encabezado de ubicación devuelve un estado de 200.
Ejemplo de una llamada para publicar un paquete de IoT Edge mediante curl:
curl -d -X POST https://management.azure.com/subscriptions/{subscriptionid}/resourceGroups/{resourcegroupname}/providers/Microsoft.StreamAnalytics/streamingjobs/{jobname}/publishedgepackage?api-version=2017-04-01-preview
Después de hacer la llamada POST, debe esperar una respuesta con cuerpo vacío. Busque el URI en el encabezado de ubicación de la respuesta y anótelo para usarlo más adelante.
El siguiente es un ejemplo del URI del encabezado de ubicación de la respuesta:
https://management.azure.com/subscriptions/{subscriptionid}/resourcegroups/{resourcegroupname}/providers/Microsoft.StreamAnalytics/StreamingJobs/{resourcename}/OperationResults/{guidAssignedToTheAsynchronousOperation}?api-version=2017-04-01-preview
Espere de unos segundos a un par de minutos antes de hacer una llamada a la API cuyo URI encontró en el encabezado de ubicación de la respuesta a la API IoT Edge Package Publish y repita el ciclo de espera y reintento hasta que obtenga una respuesta de 200.
Ejemplo de cómo hacer una llamada API con la dirección URL devuelta mediante curl:
curl -d –X GET https://management.azure.com/subscriptions/{subscriptionid}/resourcegroups/{resourcegroupname}/providers/Microsoft.StreamAnalytics/StreamingJobs/{resourcename}/OperationResults/{guidAssignedToTheAsynchronousOperation}?api-version=2017-04-01-preview
En la respuesta se incluye la información que se necesita agregar en el script de implementación de IoT Edge. En los ejemplos siguientes se muestra la información que debe recopilar y en qué parte del manifiesto de implementación agregarla.
Ejemplo de un cuerpo de respuesta una vez que la publicación se realiza correctamente:
{
edgePackageUrl : null
error : null
manifest : "{"supportedPlatforms":[{"os":"linux","arch":"amd64","features":[]},{"os":"linux","arch":"arm","features":[]},{"os":"windows","arch":"amd64","features":[]}],"schemaVersion":"2","name":"{jobname}","version":"1.0.0.0","type":"docker","settings":{"image":"{imageurl}","createOptions":null},"endpoints":{"inputs":["\],"outputs":["{outputnames}"]},"twin":{"contentType":"assignments","content":{"properties.desired":{"ASAJobInfo":"{asajobsasurl}","ASAJobResourceId":"{asajobresourceid}","ASAJobEtag":"{etag}","PublishTimeStamp":"{publishtimestamp}"}}}}"
status : "Succeeded"
}
Ejemplo de manifiesto de implementación:
{
"modulesContent": {
"$edgeAgent": {
"properties.desired": {
"schemaVersion": "1.0",
"runtime": {
"type": "docker",
"settings": {
"minDockerVersion": "v1.25",
"loggingOptions": "",
"registryCredentials": {}
}
},
"systemModules": {
"edgeAgent": {
"type": "docker",
"settings": {
"image": "mcr.microsoft.com/azureiotedge-agent:1.0",
"createOptions": "{}"
}
},
"edgeHub": {
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "mcr.microsoft.com/azureiotedge-hub:1.0",
"createOptions": "{}"
}
}
},
"modules": {
"<asajobname>": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "<settings.image>",
"createOptions": "<settings.createOptions>"
}
"version": "<version>",
"env": {
"PlanId": {
"value": "stream-analytics-on-iot-edge"
}
}
}
},
"$edgeHub": {
"properties.desired": {
"schemaVersion": "1.0",
"routes": {
"route": "FROM /* INTO $upstream"
},
"storeAndForwardConfiguration": {
"timeToLiveSecs": 7200
}
}
},
"<asajobname>": {
"properties.desired": {<twin.content.properties.desired>}
}
}
}
Después configurar el manifiesto de implementación, consulte Implementación de módulos de Azure IoT Edge con la CLI de Azure para hacer la implementación.