Share via


Tutorial: Configuración del puente MQTT entre Azure IoT MQ Preview y Azure Event Grid

Importante

Operaciones de IoT de Azure, habilitado 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.

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, aprenderá a configurar IoT MQ para un puente MQTT bidireccional con la PaaS de MQTT broker de Azure Event Grid. Puede usar esta característica para procesar los datos de IoT en el perímetro y en la nube. Por ejemplo, puede usar IoT MQ para procesar datos de telemetría en el perímetro y, luego, conectar los datos a Azure Event Grid para su posterior procesamiento en la nube.

Requisitos previos

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 IoT MQ 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 a Azure IoT MQ Preview al espacio de temas de Event Grid

Con az k8s-extension show, busque el id. de entidad de seguridad para la extensión Arc de Azure IoT MQ. El comando almacena el identificador de entidad de seguridad en una variable para su uso posterior.

export PRINCIPAL_ID=$(az k8s-extension show \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name mq \
  --cluster-type connectedClusters \
  --query identity.principalId -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 IoT MQ 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

Creación de un conector de puente MQTT y recursos de asignación de temas

En un nuevo archivo denominado bridge.yaml, especifique el conector de puente MQTT y la configuración de la asignación de temas. Reemplace el valor del marcador de posición de ejemplo en el remoteBrokerConnectionendpoint por el nombre de host de MQTT de Event Grid del paso anterior. Incluya el número de puerto 8883.

apiVersion: mq.iotoperations.azure.com/v1beta1
kind: MqttBridgeConnector
metadata:
  name: tutorial-bridge
  namespace: azure-iot-operations
spec:
  image: 
    repository: mcr.microsoft.com/azureiotoperations/mqttbridge
    tag: 0.4.0-preview
    pullPolicy: IfNotPresent
  protocol: v5
  bridgeInstances: 2
  logLevel: debug
  remoteBrokerConnection:
    endpoint: example.region-1.ts.eventgrid.azure.net:8883
    tls:
      tlsEnabled: true
    authentication:
      systemAssignedManagedIdentity:
        audience: https://eventgrid.azure.net
  localBrokerConnection:
    endpoint: aio-mq-dmqtt-frontend:8883
    tls:
      tlsEnabled: true
      trustedCaCertificateConfigMap: aio-ca-trust-bundle-test-only
    authentication:
      kubernetes: {}
---
apiVersion: mq.iotoperations.azure.com/v1beta1
kind: MqttBridgeTopicMap
metadata:
  name: tutorial-topic-map
  namespace: azure-iot-operations 
spec:
  mqttBridgeConnectorRef: tutorial-bridge
  routes:
    - direction: local-to-remote
      name: publish
      source: tutorial/local
      target: telemetry/iot-mq
      qos: 1
    - direction: remote-to-local
      name: subscribe
      source: telemetry/#
      target: tutorial/cloud
      qos: 1

El conector del puente MQTT se configura para:

  • Usar MQTT broker de Event Grid como agente remoto.
  • Usar el agente local de IoT MQ 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 tema telemetry/iot-mq del agente remoto.
  • Usar la asignación de temas para asignar el tema telemetry/# del agente remoto al tema tutorial/cloud del agente local.

Al publicar en el tema tutorial/local en el agente local de IoT MQ, el mensaje se conecta al tema telemetry/iot-mq en MQTT broker remoto de Event Grid. A continuación, el mensaje se vuelve a conectar al tema tutorial/cloud en el agente local de IoT MQ. De forma similar, al publicar en el tema telemetry/iot-mq en MQTT broker remoto de Event Grid, el mensaje se conecta al tema tutorial/cloud en el agente local de IoT MQ.

Aplique el archivo de implementación con kubectl.

kubectl apply -f bridge.yaml
mqttbridgeconnector.mq.iotoperations.azure.com/tutorial-bridge created
mqttbridgetopicmap.mq.iotoperations.azure.com/tutorial-topic-map created

Comprobación de la implementación del puente de MQTT

Use kubectl para comprobar que las dos instancias de puente están listas y en ejecución.

kubectl get pods -n azure-iot-operations -l app=aio-mq-mqttbridge
NAME                       READY   STATUS    RESTARTS   AGE
aio-mq-tutorial-bridge-0   1/1     Running   0          45s
aio-mq-tutorial-bridge-1   1/1     Running   0          45s

Ahora puede publicar en el agente local y suscribirse a MQTT broker de Event Grid y comprobar el flujo de mensajes según lo previsto.

Implementación de un cliente MQTT

Para comprobar que el puente MQTT funciona, implemente un cliente MQTT en el mismo espacio de nombres que IoT MQ. En un nuevo archivo llamado client.yaml, especifique la implementación del cliente:

apiVersion: v1
kind: Pod
metadata:
  name: mqtt-client
  namespace: azure-iot-operations
spec:
  serviceAccountName: mqtt-client
  containers:
  - image: alpine
    name: mqtt-client
    command: ["sh", "-c"]
    args: ["apk add mosquitto-clients mqttui && sleep infinity"]
    volumeMounts:
    - name: mq-sat
      mountPath: /var/run/secrets/tokens
    - name: trust-bundle
      mountPath: /var/run/certs
  volumes:
  - name: mq-sat
    projected:
      sources:
      - serviceAccountToken:
          path: mq-sat
          audience: aio-mq
          expirationSeconds: 86400
  - name: trust-bundle
    configMap:
      name: aio-ca-trust-bundle-test-only

Aplique el archivo de implementación con kubectl.

kubectl apply -f client.yaml
pod/mqtt-client created

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 agente de IoT MQ en el espacio de temas de tutorial/# con mqttui.

mqttui log "tutorial/#" \
-b mqtts://aio-mq-dmqtt-frontend:8883 \
-u '$sat' \
--password $(cat /var/run/secrets/tokens/mq-sat) \
--insecure

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-mq-dmqtt-frontend -p 8883 \
-m "This message goes all the way to the cloud and back!" \
-t "tutorial/local" -u '$sat' -P $(cat /var/run/secrets/tokens/mq-sat) \
--cafile /var/run/certs/ca.crt \
--repeat 5 --repeat-delay 1 -d

Visualización de los mensajes en el suscriptor

En el shell de suscriptor, verá los mensajes publicados.

23:17:50.802 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:51.086 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:51.803 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:51.888 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:52.804 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:52.888 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:53.805 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:53.895 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!
23:17:54.807 QoS:AtMostOnce  tutorial/local     Payload( 52): This message goes all the way to the cloud and back!
23:17:54.881 QoS:AtMostOnce  tutorial/cloud     Payload( 52): This message goes all the way to the cloud and back!

Aquí verá que los mensajes se publican en el agente local de IoT MQ en el tema tutorial/local, se conectan a MQTT broker de Event Grid y, luego, vuelven a conectarse al agente local de IoT MQ 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 agente local de IoT MQ.

Screenshot of the metrics view in Azure portal to show successful MQTT messages.

Sugerencia

Puede comprobar las configuraciones de asignaciones de temas, QoS, rutas de mensajes con la extensión de la CLIaz iot ops check --detail-level 2.

Pasos siguientes

En este tutorial, ha aprendido a configurar IoT MQ para un puente MQTT bidireccional con MQTT broker de Azure Event Grid. A continuación, explore los escenarios siguientes: