Compartir a través de


Tutorial: Puente MQTT bidireccional a Azure Event Grid

Importante

En esta página se incluyen instrucciones para administrar componentes de Operaciones de IoT de Azure mediante manifiestos de implementación de Kubernetes, que se encuentra en versión preliminar. Esta característica se proporciona con varias limitacionesy no se debe usar para cargas de trabajo 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, 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

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}"

Si la extensión eventgrid no está instalada, recibirá un mensaje en el que se le pregunta si quiere instalarla. Seleccione Y para instalar la extensión.

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

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-11-01' existing = {
  name: aioInstanceName
}
resource remoteMqttBrokerDataflowEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-11-01' = {
  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-11-01' existing = {
  name: aioInstanceName
}
resource defaultDataflowProfile 'Microsoft.IoTOperations/instances/dataflowProfiles@2024-11-01' existing = {
  parent: aioInstance
  name: 'default'
}
resource dataflow_1 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-11-01' = {
  parent: defaultDataflowProfile
  name: 'local-to-remote'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: 'default'
          serializationFormat: 'Json'
          dataSources: array('tutorial/local')
        }
      }
      {
        operationType: 'BuiltInTransformation'

        builtInTransformationSettings: {
        serializationFormat: 'Json'
        datasets: []
        filter: []
        map: [
          {
            type: 'PassThrough'
            inputs: [
              '*'
            ]
            output: '*'
          }
        ]
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: 'eventgrid'
          dataDestination: 'telemetry/aio'
        }
      }
    ]
  }
} 
resource dataflow_2 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-11-01' = {
  parent: defaultDataflowProfile
  name: 'remote-to-local'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: 'eventgrid'
          serializationFormat: 'Json'
          dataSources: array('telemetry/#')
        }
      }
      {
        operationType: 'BuiltInTransformation'

        builtInTransformationSettings: {
        serializationFormat: 'Json'
        datasets: []
        filter: []
        map: [
          {
            type: 'PassThrough'
            inputs: [
              '*'
            ]
            output: '*'
          }
        ]
        }
      }
      {
        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 tema telemetry/aio del agente remoto.
  • Usar la asignación de temas para asignar el tema telemetry/# del agente remoto al tema tutorial/cloud del agente local.

Nota:

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 el flujo de datos creado en este tutorial. 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.

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.

Captura de pantalla de la vista de métricas en Azure Portal para mostrar mensajes MQTT correctos.

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: