Zelfstudie: Bidirectionele MQTT-brug naar Azure Event Grid

In deze zelfstudie stelt u een bidirectionele MQTT-brug in tussen een Azure IoT-bewerkingen MQTT-broker en Azure Event Grid. Als u de zelfstudie eenvoudig wilt houden, gebruikt u de standaardinstellingen voor de Azure IoT-bewerkingen MQTT-broker en Azure Event Grid-eindpunten en wordt er geen transformatie toegepast.

Vereisten

  • Een exemplaar van Azure IoT-bewerkingen geïmplementeerd in een Kubernetes-cluster. Zie Deploy Azure IoT-bewerkingen voor meer informatie.
  • Azure CLI versie 2.62.0 of hoger geïnstalleerd op uw ontwikkelcomputer. Gebruik az --version om uw versie te controleren en az upgrade om indien nodig bij te werken. Zie Het installeren van de Azure CLI voor meer informatie.

  • De Azure IoT-bewerkingen-extensie voor Azure CLI. Gebruik de volgende opdracht om de extensie toe te voegen of bij te werken naar de nieuwste versie:

    az extension add --upgrade --name azure-iot-ops
    

Omgevingsvariabelen instellen

Meld u aan met Azure CLI:

az login

Stel omgevingsvariabelen in voor de rest van de installatie. Vervang waarden in <> door geldige waarden of namen van uw keuze. Er wordt een nieuwe Azure Event Grid-naamruimte en onderwerpruimte gemaakt in uw Azure-abonnement op basis van de namen die u opgeeft:

# 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>

Event Grid-naamruimte maken waarvoor MQTT-broker is ingeschakeld

Een Event Grid-naamruimte maken met Azure CLI. De locatie moet hetzelfde zijn als de locatie die u hebt gebruikt voor het implementeren van Azure IoT-bewerkingen.

az eventgrid namespace create \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --topic-spaces-configuration "{state:Enabled,maximumClientSessionsPerAuthenticationName:3}"

Als de eventgrid extensie niet is geïnstalleerd, wordt u gevraagd of u de extensie wilt installeren. Selecteer Y om de extensie te installeren.

Door de topic-spaces-configurationopdracht in te stellen, wordt met deze opdracht een naamruimte gemaakt met:

  • MQTT-broker ingeschakeld
  • Maximum aantal clientsessies per verificatienaam als 3.

Met de optie voor maximale clientsessies kan Azure IoT-bewerkingen MQTT meerdere exemplaren spawnen en nog steeds verbinding maken. Zie ondersteuning voor meerdere sessies voor meer informatie.

Een onderwerpruimte maken

Maak in de Event Grid-naamruimte een onderwerpruimte met de naam tutorial met een onderwerpsjabloon sensor/#.

az eventgrid namespace topic-space create \
  --resource-group $RESOURCE_GROUP \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --name tutorial \
  --topic-templates "sensor/#"

Met behulp van het # jokerteken in de onderwerpsjabloon kunt u publiceren naar elk onderwerp onder de sensor onderwerpruimte. Bijvoorbeeld sensor/temperature of sensor/humidity.

Azure IoT-bewerkingen toegang verlenen tot de Event Grid-onderwerpruimte

Zoek met behulp van Azure CLI de principal-id voor de Azure IoT-bewerkingen Arc-extensie. Met de opdracht wordt de principal-id opgeslagen in een variabele voor later gebruik.

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

Noteer de uitvoerwaarde voor identity.principalId, die een GUID-waarde heeft met de volgende indeling:

aaaaaaaa-bbbb-cccc-1111-222222222222

Gebruik vervolgens Azure CLI om uitgevers- en abonneerollen toe te wijzen aan Azure IoT-bewerkingen MQTT voor de onderwerpruimte die u hebt gemaakt.

Wijs de rol van uitgever toe:

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

Wijs de rol abonnee toe:

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

Aanbeveling

Het bereik komt overeen met de onderwerpruimte die u in de vorige stap id hebt gemaakt, en u vindt het in de uitvoer van de opdracht az eventgrid namespace topic-space create.

Event Grid MQTT-brokerhostnaam

Gebruik Azure CLI om de Event Grid MQTT-brokerhostnaam op te halen.

az eventgrid namespace show \
  --resource-group $RESOURCE_GROUP \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --query topicSpacesConfiguration.hostname \
  -o tsv

Noteer de uitvoerwaarde waarvoor topicSpacesConfiguration.hostname dit een hostnaamwaarde is die er als volgt uitziet:

example.region-1.ts.eventgrid.azure.net

Een Azure Event Grid-gegevensstroomeindpunt maken

Gegevensstroomeindpunt maken voor Azure Event Grid. Dit eindpunt is het doel voor de gegevensstroom waarmee berichten worden verzonden naar Azure Event Grid. Vervang <EVENT_GRID_HOSTNAME> door de MQTT-hostnaam die u hebt gekregen uit de vorige stap. Neem het poortnummer 8883op.

De gegevensstroom- en gegevensstroomeindpunten van Azure Event Grid kunnen worden geïmplementeerd als standaard Azure-resources, omdat ze implementaties van Azure Resource Provider (RPs) hebben. Dit Bicep-bestand voor MQTT-bruggegevensstroom Tutorial implementeert de benodigde gegevensstroom en gegevensstroomeindpunten.

Download het bestand naar uw lokale locatie en zorg ervoor dat u de waarden voor customLocationName, aioInstanceNameeventGridHostName vervangt door die van u.

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

Voer vervolgens de volgende opdracht uit in uw terminal. Vervang door <FILE> de naam van het Bicep-bestand dat u hebt gedownload.

az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep

Hier is de verificatiemethode ingesteld om SystemAssignedManagedIdentity de beheerde identiteit van de Azure IoT-bewerkingen-extensie te gebruiken voor verificatie met de Event Grid MQTT-broker. Deze instelling werkt omdat de Azure IoT-bewerkingen-extensie over de benodigde machtigingen beschikt voor het publiceren en abonneren op de Event Grid-onderwerpruimte die is geconfigureerd via Azure RBAC-rollen. U ziet dat er geen geheimen, zoals gebruikersnaam of wachtwoord, nodig zijn in de configuratie.

Omdat voor de Event Grid MQTT-broker TLS is vereist, is de tls instelling ingeschakeld. U hoeft geen vertrouwd CA-certificaat op te geven, omdat de Event Grid MQTT-broker gebruikmaakt van een algemeen vertrouwde certificeringsinstantie.

Gegevensstromen maken

Maak twee gegevensstromen met het Azure IoT-bewerkingen MQTT-brokereindpunt als de bron en het Azure Event Grid-eindpunt als doel en vice versa. U hoeft transformatie niet te configureren.

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: 'sensor/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('sensor/#')
        }
      }
      {
        operationType: 'BuiltInTransformation'

        builtInTransformationSettings: {
        serializationFormat: 'Json'
        datasets: []
        filter: []
        map: [
          {
            type: 'PassThrough'
            inputs: [
              '*'
            ]
            output: '*'
          }
        ]
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: 'default'
          dataDestination: 'tutorial/cloud'
        }
      }
    ]
  }
}

Voer net als het eindpunt van de gegevensstroom de volgende opdracht uit in uw terminal:

az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep

Samen vormen de twee gegevensstromen een MQTT-brug, waar u:

  • De Event Grid MQTT-broker gebruiken als externe broker
  • De lokale Azure IoT-bewerkingen MQTT-broker gebruiken als de lokale broker
  • TLS gebruiken voor externe en lokale brokers
  • Door het systeem toegewezen beheerde identiteit gebruiken voor verificatie bij de externe broker
  • Kubernetes-serviceaccount gebruiken voor verificatie bij de lokale broker
  • Gebruik de onderwerptoewijzing om het tutorial/local onderwerp toe te wijzen aan het sensor/aio onderwerp op de externe broker
  • Gebruik het onderwerpschema om het sensor/# onderwerp op de externe broker toe te wijzen aan het tutorial/cloud onderwerp op de lokale broker

Notitie

Azure IoT-bewerkingen implementeert standaard een MQTT-broker en een MQTT-brokergegevensstroomeindpunt. Het eindpunt van de MQTT-brokergegevensstroom wordt gebruikt om verbinding te maken met de MQTT-broker. De standaardconfiguratie maakt gebruik van het ingebouwde serviceaccounttoken voor verificatie. Het eindpunt heeft de naam default en is beschikbaar in dezelfde naamruimte als Azure IoT-bewerkingen. Het eindpunt wordt gebruikt als de bron voor de gegevensstroom die in deze handleiding is gemaakt. Zie het standaardeindpunt van de MQTT-broker voor de gegevensstroom voor meer informatie over het standaardeindpunt van de MQTT-broker.

Wanneer u publiceert naar het tutorial/local onderwerp over de lokale Azure IoT-bewerkingen MQTT-broker, wordt het bericht overbrugd naar het sensor/aio onderwerp in de externe Event Grid MQTT-broker. Vervolgens wordt het bericht teruggezet naar het tutorial/cloud onderwerp (omdat het sensor/# jokertekenonderwerp het vastlegt) op de lokale Azure IoT-bewerkingen MQTT-broker. Wanneer u publiceert naar de sensor/aio topic op de externe Event Grid MQTT-broker, wordt het bericht gebridged naar de tutorial/cloud topic op de lokale Azure IoT-bewerkingen MQTT-broker.

MQTT-client implementeren

Als u wilt controleren of de MQTT-brug werkt, implementeert u een MQTT-client in dezelfde naamruimte als Azure IoT-bewerkingen.

Bicep is momenteel niet van toepassing op het implementeren van MQTT-client.

Een abonnee starten

Gebruik kubectl exec om een shell te starten in de mosquitto-clientpod.

kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh

Start in de shell een abonnee op de Azure IoT-bewerkingen-broker in de tutorial/# onderwerpruimte met 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)

Laat de opdracht actief en open een nieuw terminalvenster.

Publiceer MQTT-berichten naar de cloud via de brug

Start in een nieuw terminalvenster een andere shell in de mosquitto-client pod.

kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh

Gebruik mosquitto in de shell om vijf berichten naar de tutorial/local topic te publiceren.

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)

De berichten in de abonnee weergeven

In de abonneeshell ziet u de berichten die u hebt gepubliceerd.

Client null sending CONNECT
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received CONNACK (0)
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 sending SUBSCRIBE (Mid: 1, Topic: tutorial/#, QoS: 0, Options: 0x00)
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received SUBACK
Subscribed (mid: 1): 0
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 sending PINGREQ
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PINGRESP
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'tutorial/local', ... (52 bytes))
This message goes all the way to the cloud and back!
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 sending PINGREQ
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PINGRESP

Hier ziet u dat de berichten worden gepubliceerd naar de lokale Azure IoT-bewerkingen-broker naar het tutorial/local-topic, vervolgens overbrugd naar de Event Grid MQTT-broker, en daarna weer terug overbrugd naar de lokale Azure IoT-bewerkingen-broker op het tutorial/cloud-topic. De berichten worden vervolgens bezorgd bij de abonnee. In dit voorbeeld is de retourtijd ongeveer 80 ms.

Metrische gegevens van Event Grid controleren om de bezorging van berichten te controleren

U kunt ook de metrische gegevens van Event Grid controleren om te controleren of de berichten worden bezorgd bij de Event Grid MQTT-broker. Ga in Azure Portal naar de Event Grid-naamruimte die u hebt gemaakt. Onder Metrics>MQTT: Succesvolle Gepubliceerde Berichten. U zou het aantal gepubliceerde en afgeleverde berichten moeten zien toenemen naarmate u berichten publiceert naar de lokale Azure IoT-bewerkingen-broker.

Schermopname van de metriekenweergave in Azure portal om succesvolle MQTT-berichten weer te geven.

Aanbeveling

U kunt de configuraties van gegevensstromen, QoS en berichtroutes controleren met de CLI-extensieaz iot ops check --detail-level 2.

Volgende stappen

In deze zelfstudie hebt u geleerd hoe u Azure IoT-bewerkingen configureert voor bidirectionele MQTT-brug met Azure Event Grid MQTT-broker. Bekijk de volgende scenario's als volgende stappen: