Tutorial: Puente MQTT bidireccional a Azure Event Grid
Importante
Versión preliminar de operaciones de Azure IoT: habilitada por Azure Arc está actualmente en versión preliminar. No se debería usar este software en versión preliminar en entornos de producción.
Deberá implementar una nueva instalación de Azure IoT Operations cuando esté disponible una versión general. No podrá actualizar una instalación de versión preliminar.
Consulte Términos de uso complementarios para las versiones preliminares de Microsoft Azure para conocer los términos legales que se aplican a las características de Azure que se encuentran en la versión beta, en versión preliminar o que todavía no se han publicado para que estén disponibles con carácter general.
En este tutorial, configurará un puente MQTT bidireccional entre un corredor MQTT de Operaciones de IoT de Azure y Azure Event Grid. Para que el tutorial sea sencillo, use la configuración predeterminada para el corredor MQTT de Operaciones de IoT de Azure y los puntos de conexión de Azure Event Grid, y no se aplica ninguna transformación.
Requisitos previos
- Operaciones de IoT de Azure. Consulte Implementación de la versión preliminar de Operaciones de IoT de Azure.
- Perfil de flujo de datos. Consulte Configuración de un perfil de flujo de datos.
Establecimiento de variables de entorno
Inicie sesión con la CLI de Azure:
az login
Establezca variables de entorno para el resto de la configuración. Reemplace los valores de <>
por valores o nombres válidos de su elección. Se crea un nuevo espacio de nombres y un espacio de temas de Azure Event Grid en la suscripción de Azure en función de los nombres que proporcione:
# For this tutorial, the steps assume the IoT Operations cluster and the Event Grid
# are in the same subscription, resource group, and location.
# Name of the resource group of Azure Event Grid and IoT Operations cluster
export RESOURCE_GROUP=<RESOURCE_GROUP_NAME>
# Azure region of Azure Event Grid and IoT Operations cluster
export LOCATION=<LOCATION>
# Name of the Azure Event Grid namespace
export EVENT_GRID_NAMESPACE=<EVENT_GRID_NAMESPACE>
# Name of the Arc-enabled IoT Operations cluster
export CLUSTER_NAME=<CLUSTER_NAME>
# Subscription ID of Azure Event Grid and IoT Operations cluster
export SUBSCRIPTION_ID=<SUBSCRIPTION_ID>
Creación de un espacio de nombres de Event Grid con MQTT broker habilitado
Cree un espacio de nombres de Event Grid con la CLI de Azure. La ubicación debe ser la misma que la que usó para implementar Operaciones de IoT de Azure.
az eventgrid namespace create \
--namespace-name $EVENT_GRID_NAMESPACE \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--topic-spaces-configuration "{state:Enabled,maximumClientSessionsPerAuthenticationName:3}"
Al establecer topic-spaces-configuration
, este comando crea un espacio de nombres con:
- MQTT broker habilitado
- Número máximo de sesiones de cliente por nombre de autenticación de 3.
La opción de número máximo de sesiones de cliente permite a MQTT de Operaciones de IoT de Azure generar varias instancias y seguir conectando. Para obtener más información, consulte la compatibilidad con varias sesiones.
Creación de un espacio de temas
En el espacio de nombres de Event Grid, cree un espacio de temas denominado tutorial
con una plantilla de tema telemetry/#
.
az eventgrid namespace topic-space create \
--resource-group $RESOURCE_GROUP \
--namespace-name $EVENT_GRID_NAMESPACE \
--name tutorial \
--topic-templates "telemetry/#"
Con el carácter comodín #
de la plantilla de tema, puede publicar en cualquier tema del espacio de temas telemetry
. Por ejemplo, telemetry/temperature
o telemetry/humidity
.
Concesión de acceso de Operaciones de IoT de Azure al espacio de temas de Event Grid
Con la CLI de Azure, busque el identificador de entidad de seguridad de la extensión Arc de Operaciones de IoT de Azure. El comando almacena el identificador de entidad de seguridad en una variable para su uso posterior.
export PRINCIPAL_ID=$(az k8s-extension list \
--resource-group $RESOURCE_GROUP \
--cluster-name $CLUSTER_NAME \
--cluster-type connectedClusters \
--query "[?extensionType=='microsoft.iotoperations'].identity.principalId | [0]" -o tsv)
echo $PRINCIPAL_ID
Tome nota del valor de salida de identity.principalId
, que es un valor GUID con el formato siguiente:
d84481ae-9181-xxxx-xxxx-xxxxxxxxxxxx
A continuación, use la CLI de Azure para asignar roles de publicador y suscriptor a MQTT de Operaciones de IoT de Azure para el espacio de temas que creó.
Asignación del rol de publicador:
az role assignment create \
--assignee $PRINCIPAL_ID \
--role "EventGrid TopicSpaces Publisher" \
--scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.EventGrid/namespaces/$EVENT_GRID_NAMESPACE/topicSpaces/tutorial
Asignación del rol de suscriptor:
az role assignment create \
--assignee $PRINCIPAL_ID \
--role "EventGrid TopicSpaces Subscriber" \
--scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.EventGrid/namespaces/$EVENT_GRID_NAMESPACE/topicSpaces/tutorial
Sugerencia
El ámbito coincide con el id
del espacio de temas que creó con az eventgrid namespace topic-space create
en el paso anterior y puede encontrarlo en la salida del comando.
Nombre de host de MQTT broker de Event Grid
Use la CLI de Azure para obtener el nombre de host de MQTT broker de Event Grid.
az eventgrid namespace show \
--resource-group $RESOURCE_GROUP \
--namespace-name $EVENT_GRID_NAMESPACE \
--query topicSpacesConfiguration.hostname \
-o tsv
Tome nota del valor de salida de topicSpacesConfiguration.hostname
, que es un valor de nombre de host similar al siguiente:
example.region-1.ts.eventgrid.azure.net
Descripción del punto de conexión predeterminado del flujo de datos del corredor MQTT de Azure IoT Operations
De forma predeterminada, Azure IoT Operations implementa un corredor MQTT, así como un punto de conexión de flujo de datos del corredor MQTT. El punto de conexión de flujo de datos del corredor MQTT se usa para conectarse al corredor MQTT. La configuración predeterminada usa el token de cuenta de servicio integrado para la autenticación. El punto de conexión se denomina default
y está disponible en el mismo espacio de nombres que Azure IoT Operations. El punto de conexión se usa como origen para los flujos de datos que cree en los pasos siguientes.
Para más información sobre el punto de conexión predeterminado del flujo de datos del corredor MQTT, consulte Punto de conexión predeterminado del corredor MQTT local de Azure IoT.
Creación de un punto de conexión de flujo de datos de Azure Event Grid
Cree un punto de conexión de flujo de datos para Azure Event Grid. Este punto de conexión es el destino del flujo de datos que envía mensajes a Azure Event Grid. Reemplace <EVENT_GRID_HOSTNAME>
por el nombre de host MQTT que obtuvo del paso anterior. Incluya el número de puerto 8883
.
Los puntos de conexión de flujo de datos y flujo de datos de Azure Event Grid se pueden implementar como recursos estándar de Azure, ya que tienen implementaciones del proveedor de recursos de Azure (RPs). Este archivo de plantilla Bicep de Tutorial de archivo bicep para el flujo de datos de MQTT Bridge implementa los puntos de conexión de flujo de datos y flujo de datos necesarios.
Descargue el archivo en el entorno local y asegúrese de reemplazar los valores de customLocationName
, aioInstanceName
, eventGridHostName
por los suyos.
param customLocationName string = '<CUSTOM_LOCATION_NAME>'
param aioInstanceName string = '<AIO_INSTANCE_NAME>'
param eventGridHostName string = '<EVENT_GRID_HOSTNAME>:8883'
resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
name: customLocationName
}
resource aioInstance 'Microsoft.IoTOperations/instances@2024-09-15-preview' existing = {
name: aioInstanceName
}
resource remoteMqttBrokerDataflowEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-09-15-preview' = {
parent: aioInstance
name: 'eventgrid'
extendedLocation: {
name: customLocation.id
type: 'CustomLocation'
}
properties: {
endpointType: 'Mqtt'
mqttSettings: {
host: eventGridHostName
authentication: {
method: 'SystemAssignedManagedIdentity'
systemAssignedManagedIdentitySettings: {}
}
tls: {
mode: 'Enabled'
}
}
}
}
A continuación, ejecute el siguiente comando en el terminal. Reemplace <FILE>
por el nombre del archivo de Bicep que descargó.
az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep
Aquí, el método de autenticación se establece en SystemAssignedManagedIdentity
para usar la identidad administrada de la extensión Operaciones de IoT de Azure para autenticarse con el corredor MQTT de Event Grid. Esta configuración funciona porque la extensión Operaciones de IoT de Azure tiene los permisos necesarios para publicar y suscribirse al espacio de temas de Event Grid configurado a través de los roles RBAC de Azure. Tenga en cuenta que no se necesitan secretos, como el nombre de usuario o la contraseña, en la configuración.
Dado que el corredor MQTT de Event Grid requiere TLS, la configuración tls
está habilitada. No es necesario proporcionar un certificado de entidad de certificación de confianza, ya que el corredor MQTT de Event Grid usa una entidad de certificación ampliamente de confianza.
Creación de flujos de datos
Cree dos flujos de datos con el punto de conexión del corredor MQTT de Operaciones de IoT de Azure como origen y el punto de conexión de Azure Event Grid como destino y viceversa. No es necesario configurar la transformación.
param customLocationName string = '<CUSTOM_LOCATION_NAME>'
param aioInstanceName string = '<AIO_INSTANCE_NAME>'
resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
name: customLocationName
}
resource aioInstance 'Microsoft.IoTOperations/instances@2024-09-15-preview' existing = {
name: aioInstanceName
}
resource defaultDataflowProfile 'Microsoft.IoTOperations/instances/dataflowProfiles@2024-09-15-preview' existing = {
parent: aioInstance
name: 'default'
}
resource dataflow_1 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-09-15-preview' = {
parent: defaultDataflowProfile
name: 'local-to-remote'
extendedLocation: {
name: customLocation.id
type: 'CustomLocation'
}
properties: {
mode: 'Enabled'
operations: [
{
operationType: 'Source'
sourceSettings: {
endpointRef: 'default'
dataSources: array('tutorial/local')
}
}
{
operationType: 'Destination'
destinationSettings: {
endpointRef: remoteMqttBrokerDataflowEndpoint.name
dataDestination: 'telemetry/aio'
}
}
]
}
}
resource dataflow_2 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-09-15-preview' = {
parent: defaultDataflowProfile
name: 'remote-to-local'
extendedLocation: {
name: customLocation.id
type: 'CustomLocation'
}
properties: {
mode: 'Enabled'
operations: [
{
operationType: 'Source'
sourceSettings: {
endpointRef: remoteMqttBrokerDataflowEndpoint.name
dataSources: array('telemetry/#')
}
}
{
operationType: 'Destination'
destinationSettings: {
endpointRef: 'default'
dataDestination: 'tutorial/cloud'
}
}
]
}
}
Al igual que el punto de conexión del flujo de datos, ejecute el siguiente comando en el terminal:
az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep
Juntos, los dos flujos de datos forman un puente MQTT, donde:
- Usar MQTT broker de Event Grid como agente remoto.
- Usar el corredor MQTT de Operaciones de IoT de Azure local como agente local
- Usar TLS tanto para los agentes locales como para los remotos.
- Usar la identidad administrada asignada por el sistema para la autenticación en el agente remoto.
- Usar de la cuenta de servicio de Kubernetes para la autenticación en el agente local.
- Usar la asignación de temas para asignar el tema
tutorial/local
al tematelemetry/aio
del agente remoto. - Usar la asignación de temas para asignar el tema
telemetry/#
del agente remoto al tematutorial/cloud
del agente local.
Al publicar en el tema tutorial/local
en el corredor MQTT local de Operaciones de IoT de Azure, el mensaje se conecta al tema telemetry/aio
en el corredor MQTT remoto de Event Grid. A continuación, el mensaje se vuelve a conectar al tema tutorial/cloud
(porque el tema telemetry/#
comodín lo captura) en el corredor MQTT de Operaciones de IoT de Azure local. Del mismo modo, al publicar en el tema telemetry/aio
en el corredor MQTT remoto de Event Grid, el mensaje se conecta al tema tutorial/cloud
en el corredor MQTT de Operaciones de IoT de Azure local.
Implementación de un cliente MQTT
Para comprobar que el puente MQTT funciona, implemente un cliente MQTT en el mismo espacio de nombres que Operaciones de IoT de Azure. En un nuevo archivo llamado client.yaml
, especifique la implementación del cliente:
Actualmente, bicep no se aplica para implementar el cliente MQTT.
Inicio de un suscriptor
Use kubectl exec
para iniciar un shell en el pod de cliente de mosquitto.
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
Dentro del shell, inicie un suscriptor al corredor de Operaciones de IoT de Azure en el espacio de temas de tutorial/#
con mosquitto_sub
.
mosquitto_sub --host aio-broker --port 18883 \
-t "tutorial/#" \
--debug --cafile /var/run/certs/ca.crt \
-D CONNECT authentication-method 'K8S-SAT' \
-D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
Deje el comando en ejecución y abra una nueva ventana de terminal.
Publicación de mensajes MQTT en la nube a través del puente
En una nueva ventana de terminal, inicie otro shell en el pod de cliente de mosquitto.
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
Dentro del shell, use mosquitto para publicar cinco mensajes en el tema tutorial/local
.
mosquitto_pub -h aio-broker -p 18883 \
-m "This message goes all the way to the cloud and back!" \
-t "tutorial/local" \
--repeat 5 --repeat-delay 1 -d \
--debug --cafile /var/run/certs/ca.crt \
-D CONNECT authentication-method 'K8S-SAT' \
-D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
Visualización de los mensajes en el suscriptor
En el shell de suscriptor, verá los mensajes publicados.
Aquí verá que los mensajes se publican en el corredor local de Operaciones de IoT de Azure en el tema tutorial/local
, se conectan al corredor MQTT de Event Grid y, luego, vuelven a conectarse al corredor local de Operaciones de IoT de Azure en el tema tutorial/cloud
. A continuación, los mensajes se entregan al suscriptor. En este ejemplo, el recorrido de ida y vuelta es de aproximadamente 80 ms.
Comprobación de las métricas de Event Grid para comprobar la entrega de mensajes
También puede comprobar las métricas de Event Grid para comprobar que los mensajes se entregan a MQTT broker de Event Grid. En Azure Portal, vaya al espacio de nombres de Event Grid que creó. En Métricas>MQTT: mensajes publicados correctamente. Debería ver el número de mensajes publicados y entregados a medida que publica mensajes en el corredor de Operaciones de IoT de Azure.
Sugerencia
Puede comprobar las configuraciones de flujos de datos, QoS, rutas de mensajes con la extensión de la CLI az iot ops check --detail-level 2
.
Pasos siguientes
En este tutorial, ha aprendido a configurar Operaciones de IoT de Azure para un puente MQTT bidireccional con el corredor MQTT de Azure Event Grid. A continuación, explore los escenarios siguientes:
- Para usar un cliente MQTT para publicar mensajes directamente en MQTT broker de Event Grid, consulte Publicación de mensajes MQTT en MQTT broker de Event Grid. Asigne al cliente un enlace de permisos de publicador al espacio de temas que creó y ya puede publicar mensajes en cualquier tema de
telemetry
, comotelemetry/temperature
otelemetry/humidity
. Todos estos mensajes se conectan al tematutorial/cloud
en el corredor local de Operaciones de IoT de Azure. - Para configurar reglas de enrutamiento para el MQTT broker de Event Grid, consulte Configuración de reglas de enrutamiento para MQTT broker de Event Grid. Puede usar reglas de enrutamiento para enrutar mensajes a distintos temas en función del nombre del tema, o bien para filtrar mensajes en función del contenido de los mensajes.