Partager via


Tutoriel : Ajouter des ressources OPC UA à votre cluster Opérations Azure IoT

Dans ce tutoriel, vous ajoutez manuellement des ressources OPC UA à votre cluster Opérations Azure IoT. Ces ressources publient des messages sur l’agent MQTT dans votre cluster Azure IoT Operations. En règle générale, un utilisateur OT effectue ces étapes.

Une ressource est un appareil physique ou une entité logique qui représente un appareil, un ordinateur, un système ou un processus. Par exemple, une ressource physique peut être une pompe, un moteur, un réservoir ou une ligne de production. Une ressource logique que vous définissez peut avoir des propriétés, des données de télémétrie de flux ou générer des événements.

Les serveurs OPC UA sont des applications logicielles qui communiquent avec des ressources. Les balises OPC UA sont des points de données que les serveurs OPC UA exposent. Les balises OPC UA peuvent fournir des données en temps réel ou un historique sur l’état, les performances, la qualité ou la condition des ressources.

Dans ce tutoriel, vous utilisez l’interface utilisateur web de l’expérience des opérations pour créer vos ressources. Vous pouvez également utiliser Azure CLI pour effectuer certaines de ces tâches.

Prérequis

Une instance d’Opérations Azure IoT déployée dans un cluster Kubernetes. Pour créer une instance, utilisez l’une des opérations suivantes pour déployer les Opérations Azure IoT :

Pour vous connecter à l’interface utilisateur web de l’expérience des opérations, vous devez avoir un compte Microsoft Entra ID avec au moins des autorisations de contributeur pour le groupe de ressources contenant votre instance Kubernetes – Azure Arc. Pour plus d’informations, consultez Interface utilisateur web de l’expérience des opérations.

Sauf indication contraire, vous pouvez exécuter les commandes de la console de ce tutoriel dans un environnement Bash ou PowerShell.

Quel problème résoudrons-nous ?

Les données exposées par les serveurs OPC UA peuvent avoir une structure complexe et peuvent être difficiles à comprendre. Opérations Azure IoT permettent de modéliser les ressources OPC UA en tant que balises, événements et propriétés. Cette modélisation facilite la compréhension des données et leur utilisation dans des processus en aval, comme l’Agent MQTT et les flux de données.

Déployer le simulateur de PLC OPC

Ce tutoriel utilise le simulateur OPC PLC pour générer des exemples de données. Pour déployer le simulateur OPC PLC, exécutez la commande suivante :

kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/opc-plc-deployment.yaml

L’extrait de code suivant montre le fichier YAML que vous avez appliqué :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: opc-plc-000000
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/component: opcplc-000000
  template:
    metadata:
      labels:
        app.kubernetes.io/component: opcplc-000000
    spec:
      containers:
      - name: opc-plc
        image: mcr.microsoft.com/iotedge/opc-plc:latest
        args:
          - "--ph=opcplc-000000"
          - "--cdn=opcplc-000000"
          - "--ut"
          - "--sn=25"
          - "--sr=10"
          - "--fn=2000"
          - "--veryfastrate=1000"
          - "--gn=5"
          - "--pn=50000"
          - "--maxsessioncount=100"
          - "--maxsubscriptioncount=100"
          - "--maxqueuedrequestcount=2000"
          - "--ses"
          - "--alm"
          - "--at=FlatDirectory"
          - "--drurs"
          - "--ll-debug"
          - "--nodesfile"
          - "/app/config/nodesfile.json"
        ports:
        - containerPort: 50000
        volumeMounts:
          - name: opc-plc-default-application-cert
            mountPath: /app/pki/own
          - name: opc-plc-trust-list
            mountPath: /app/pki/trusted
          - name: config-volume
            mountPath: /app/config
      volumes:
        - name: opc-plc-default-application-cert
          secret:
            secretName: opc-plc-default-application-cert
        - name: opc-plc-trust-list
          secret:
            secretName: opc-plc-trust-list
        - name: config-volume
          configMap:
            name: opc-plc-config
      serviceAccountName: opcplc-000000-service-account
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: opc-plc-config
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
data:
  nodesfile.json: |
    {
      "Folder": "MyTelemetry",
      "NodeList": [
        {
          "NodeId": "ns=3;s=FastUInt100",
          "Name": "Fryer Temperature",
          "DataType": "Double",
          "ValueRank": -1,
          "AccessLevel": "CurrentReadOrWrite",
          "Description": "Fryer Temperature with spikes",
          "Anomaly": "Spike",
          "MinValue": 150.0,
          "MaxValue": 200.0          
        }
      ]
    }
---
apiVersion: v1
kind: Service
metadata:
  name: opcplc-000000
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  type: ClusterIP
  selector:
    app.kubernetes.io/component: opcplc-000000
  ports:
    - port: 50000
      protocol: TCP
      targetPort: 50000
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: opc-plc-self-signed-issuer
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: opc-plc-default-application-cert
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  secretName: opc-plc-default-application-cert
  duration: 2160h # 90d
  renewBefore: 360h # 15d
  issuerRef:
    name: opc-plc-self-signed-issuer
    kind: Issuer
  commonName: OpcPlc
  dnsNames:
    - opcplc-000000
    - opcplc-000000.azure-iot-operations.svc.cluster.local
    - opcplc-000000.azure-iot-operations
  uris:
    - urn:OpcPlc:opcplc-000000
  usages:
    - digital signature
    - key encipherment
    - data encipherment
    - server auth
    - client auth
  privateKey:
    algorithm: RSA
    size: 2048
  encodeUsagesInRequest: true
  isCA: false
---
apiVersion: v1
kind: Secret
metadata:
  name: opc-plc-trust-list
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
data: {}
---
apiVersion: batch/v1
kind: Job
metadata:
  name: opcplc-000000-execute-mutual-trust
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  backoffLimit: 1
  template:
    spec:
      containers:
      - name: kubectl
        image: mcr.microsoft.com/oss/kubernetes/kubectl:v1.27.1
        imagePullPolicy: Always
        command: ["/bin/sh"]
        args: ["/scripts/execute-commands.sh"]
        volumeMounts:
        - name: scripts
          mountPath: /scripts
          readOnly: true
      restartPolicy: Never
      serviceAccountName: opcplc-000000-service-account
      volumes:
      - name: scripts
        configMap:
          name: opcplc-000000-execute-commands-script
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: opcplc-000000-execute-commands-script
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
data:
  execute-commands.sh: |
    #!/bin/sh

    # wait 20 seconds for the resources to be created
    sleep 20

    # Extract the OPC UA connector application instance certificate and add it to the OPC PLC trust list
    cert=$(kubectl -n azure-iot-operations get secret aio-opc-opcuabroker-default-application-cert -o jsonpath='{.data.tls\.crt}' | base64 -d)
    data=$(kubectl create secret generic temp --from-literal=opcuabroker.crt="$cert" --dry-run=client -o jsonpath='{.data}')
    kubectl patch secret opc-plc-trust-list -n azure-iot-operations -p "{\"data\": $data}"

    # Extract the OPC PLC application instance certificate and add it to the OPC UA connector trust list
    cert=$(kubectl -n azure-iot-operations get secret opc-plc-default-application-cert -o jsonpath='{.data.tls\.crt}' | base64 -d)
    data=$(kubectl create secret generic temp --from-literal=opcplc-000000.crt="$cert" --dry-run=client -o jsonpath='{.data}')
    kubectl patch secret aio-opc-ua-broker-trust-list -n azure-iot-operations -p "{\"data\": $data}"
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: opcplc-000000-service-account
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: opc-plc-000000-secret-access-role
  namespace: azure-iot-operations
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: opc-plc-000000-secret-access-rolebinding
  namespace: azure-iot-operations
subjects:
- kind: ServiceAccount
  name: opcplc-000000-service-account
  namespace: azure-iot-operations
roleRef:
  kind: Role
  name: opc-plc-000000-secret-access-role
  apiGroup: rbac.authorization.k8s.io

Attention

Cette configuration n’est pas sécurisée. N’utilisez pas cette configuration dans un environnement de production.

Se connecter à l’expérience des opérations

Pour créer des points de terminaison de ressources, des ressources et s’abonner aux étiquettes et événements OPC UA, utilisez l’expérience des opérations.

Accédez à l’expérience des opérations dans votre navigateur et connectez-vous avec vos informations d’identification Microsoft Entra ID.

Sélectionner votre site

Un site est une collection d’instances d’Opérations Azure IoT. Les sites regroupent généralement des instances par emplacement physique et facilitent la localisation et la gestion des ressources par les utilisateurs OT. Votre administrateur informatique crée des sites et leur affecte des instances Opérations Azure IoT. Étant donné que vous travaillez avec un nouveau déploiement, aucun site n’est encore présent. Vous trouverez le cluster que vous avez créé dans le guide de démarrage rapide précédent en sélectionnant Afficher des instances non attribuées. Dans l’expérience des opérations, une instance représente un cluster où vous avez déployé des opérations Azure IoT.

Capture d’écran montrant le nœud des instances non attribuées dans l’expérience des opérations.

Sélectionner votre instance

Sélectionnez l’instance sur laquelle vous avez déployé Opérations Azure IoT dans le tutoriel précédent :

Capture d’écran de la liste des instances d’Opérations Azure IoT.

Conseil

Si vous ne voyez aucune instance, il est possible que vous ne soyez pas dans le locataire Microsoft Entra ID approprié. Vous pouvez changer le locataire à partir du menu supérieur droit dans le portail.

Ajouter un point de terminaison de ressource

Lorsque vous avez déployé Opérations Azure IoT dans l’article précédent, vous avez inclus un simulateur OPC PLC intégré. Dans cette étape, vous ajoutez un point de terminaison de ressource qui vous permet de vous connecter au simulateur OPC PLC.

Pour ajouter un point de terminaison de ressource :

  1. Sélectionnez Points de terminaison de ressource, puis Créer un point de terminaison de ressource :

    Capture d’écran montrant la page des points de terminaison d’actifs dans l’expérience Opérations.

  2. Entrez les informations de point de terminaison suivantes :

    Champ Valeur
    Nom du point de terminaison de la ressource opc-ua-connector-0
    URL du serveur OPC UA opc.tcp://opcplc-000000:50000
    Mode d’authentification utilisateur Anonymous
  3. Pour enregistrer la définition, sélectionnez Créer.

    Cette configuration déploie un nouveau point de terminaison de ressource appelé opc-ua-connector-0 sur le cluster. Vous pouvez utiliser kubectl pour voir les points de terminaison de ressource :

    kubectl get assetendpointprofile -n azure-iot-operations
    

Gérer vos actifs

Une fois que vous avez sélectionné votre instance dans l’expérience des opérations, vous voyez la liste disponible des ressources dans la page Ressources. S’il n’y a pas encore de ressources, cette liste est vide :

Capture d’écran de la liste des ressources vides Opérations Azure IoT.

Créer un actif

Pour créer une ressource, sélectionnez Créer une ressource. Entrez ensuite les informations de ressource suivantes :

Champ Valeur
Point de terminaison de ressource opc-ua-connector-0
Nom de l’actif thermostat
Description A simulated thermostat asset
Rubrique MQTT par défaut azure-iot-operations/data/thermostat

Supprimez les Propriétés personnalisées existantes et ajoutez les propriétés personnalisées suivantes. Veillez à utiliser les noms de propriété exacts, car le modèle Power BI les demande dans un tutoriel ultérieur :

Nom de la propriété Détail de la propriété
batch 102
client Contoso
équipement Chaudière
isSpare true
location Seattle

Capture d’écran de la page de détails des ressources Opérations Azure IoT.

Sélectionnez Suivant pour accéder à la page Ajouter des balises.

Créer des balises OPC UA

Ajoutez deux étiquettes OPC UA sur la page Ajouter des étiquettes. Pour ajouter chaque étiquette, sélectionnez Ajouter une étiquette ou un CSV, puis Ajouter une étiquette. Entrez les détails de la balise indiqués dans le tableau suivant :

ID de nœud Nom de la balise Mode d’observabilité
ns=3;s=FastUInt10 température Aucune
ns=3;s=FastUInt100 Balise 10 Aucune

Le mode Observabilité est l’une des valeurs suivantes : None, Gauge, Counter, Histogram ou Log.

Vous pouvez sélectionner Gérer les paramètres par défaut pour modifier l’intervalle d’échantillonnage et la taille de file d’attente par défaut pour chaque balise.

Capture d’écran de la page Ajouter une balise Opérations Azure IoT.

Sélectionnez Suivant pour accéder à la page Ajouter des évènements, puis Suivant pour la page Révision.

Révision

Passez en revue votre ressource et les détails de la balise et apportez les ajustements nécessaires avant de sélectionner Créer :

Capture d’écran de la page de révision de création de ressources Opérations Azure IoT.

Cette configuration déploie une nouvelle ressource appelée thermostat sur le cluster. Vous pouvez utiliser kubectl pour voir les ressources :

kubectl get assets -n azure-iot-operations

Afficher des ressources dans le portail Azure

Pour afficher le point de terminaison du bien et le bien que vous avez créé dans le portail Azure, accédez au groupe de ressources qui contient votre instance Opérations Azure IoT. Vous pouvez voir la ressource thermostat dans le groupe de ressources Opérations Azure IoT. Si vous sélectionnez Afficher les types masqués, vous pouvez également voir le point de terminaison de ressource :

Capture d’écran du portail Azure montrant le groupe de ressources Opérations Azure IoT, y compris le point de terminaison de ressource et de ressource.

Le portail vous permet d’afficher les détails de la ressource. Sélectionnez vue JSON pour plus d’informations :

Capture d'écran des détails des ressources Opérations Azure IoT dans le portail Azure.

Vérifier que les données circulent

Vérifiez que les données circulent vers l’agent MQTT à l’aide de l’outil mosquitto_sub. Dans cet exemple, vous exécutez l’outil mosquitto_sub à l’intérieur de votre cluster Kubernetes :

  1. Exécutez la commande suivante pour déployer un pod qui inclut les mosquitto_pub et les outils mosquitto_sub qui sont utiles pour interagir avec l’agent MQTT dans le cluster :

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
    

    L’extrait de code suivant montre le fichier YAML que vous avez appliqué :

    # Important: do not use in production environments
    # Create a service account
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: mqtt-client
      namespace: azure-iot-operations
    ---
    # Creates a pod with mosquitto-clients and mqttui utilities in your cluster
    apiVersion: v1
    kind: Pod
    metadata:
      name: mqtt-client
      # The namespace must match the IoT MQ BrokerListener's namespace
      # Otherwise use the long hostname: aio-broker.azure-iot-operations.svc.cluster.local
      namespace: azure-iot-operations
    spec:
      # Use the "mqtt-client" service account which comes with default deployment
      # Otherwise create it with `kubectl create serviceaccount mqtt-client -n azure-iot-operations`
      serviceAccountName: mqtt-client
      containers:
        # Install mosquitto and mqttui utilities on Alpine linux
      - image: alpine
        name: mqtt-client
        command: ["sh", "-c"]
        args: ["apk add mosquitto-clients mqttui && sleep infinity"]
        resources:
          limits:
            cpu: 500m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
        - name: broker-sat
          mountPath: /var/run/secrets/tokens
        - name: trust-bundle
          mountPath: /var/run/certs
      volumes:
      - name: broker-sat
        projected:
          sources:
          - serviceAccountToken:
              path: broker-sat
              audience: aio-internal # Must match audience in BrokerAuthentication
              expirationSeconds: 86400
      - name: trust-bundle
        configMap:
          name: azure-iot-operations-aio-ca-trust-bundle # Default root CA cert
    

    Attention

    Cette configuration n’est pas sécurisée. N’utilisez pas cette configuration dans un environnement de production.

  2. Quand le pod mqtt-client s’exécute, exécutez la commande suivante pour créer un environnement d’interpréteur de commandes dans le pod que vous avez créé :

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  3. Dans le shell Bash du pod mqtt-client, exécutez la commande suivante pour vous connecter à l’Agent MQTT en utilisant l’outil mosquitto_sub abonné à la rubrique data/thermostat :

    mosquitto_sub --host aio-broker --port 18883 --topic "azure-iot-operations/data/#" -v --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
    

    Cette commande continue à s’exécuter et affiche les messages à mesure qu’ils arrivent sur la rubrique data/thermostat jusqu’à ce que vous appuyiez sur Ctrl+C pour l’arrêter. Pour quitter l’environnement shell, tapez exit.

Pour vérifier que la ressource thermostat que vous avez ajoutée publie des données, visualisez la télémétrie dans la rubrique azure-iot-operations/data :

Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:17.1858435Z","Value":4558},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:17.1858869Z","Value":4558}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:18.1838125Z","Value":4559},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:18.1838523Z","Value":4559}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:19.1834363Z","Value":4560},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:19.1834879Z","Value":4560}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:20.1861251Z","Value":4561},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:20.1861709Z","Value":4561}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:21.1856798Z","Value":4562},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:21.1857211Z","Value":4562}}

Si aucune donnée ne circule, redémarrez le pod aio-opc-opc.tcp-1 :

  1. Recherchez le nom de votre pod aio-opc-opc.tcp-1 à l’aide de la commande suivante :

    kubectl get pods -n azure-iot-operations
    

    Le nom de votre pod ressemble à aio-opc-opc.tcp-1-849dd78866-vhmz6.

  2. Redémarrez le pod aio-opc-opc.tcp-1 en utilisant une commande semblable à celle de l’exemple suivant. Utilisez le nom du pod aio-opc-opc.tcp-1 de l’étape précédente :

    kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
    

Les exemples de balises que vous avez ajoutés dans le tutoriel précédent génèrent des messages à partir de votre ressource qui ressemblent à l’exemple suivant :

{
    "temperature": {
        "SourceTimestamp": "2024-08-02T13:52:15.1969959Z",
        "Value": 2696
    },
    "Tag 10": {
        "SourceTimestamp": "2024-08-02T13:52:15.1970198Z",
        "Value": 2696
    }
}

Comment avons-nous résolu le problème ?

Dans ce tutoriel, vous avez ajouté un point de terminaison de ressource, puis défini une ressource et des balises. Les ressources et balises modélisent les données du serveur OPC UA pour faciliter l’utilisation des données dans un répartiteur MQTT et d’autres processus en aval. Vous utilisez la ressource thermostat que vous avez définie dans le tutoriel suivant.

Nettoyer les ressources

Si vous passez au tutoriel suivant, conservez toutes vos ressources.

Si vous voulez supprimer le déploiement d’Opérations Azure IoT mais conserver votre cluster, utilisez la commande az iot ops delete :

az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP

Si vous voulez supprimer toutes les ressources que vous avez créées pour ce démarrage rapide, supprimez le cluster Kubernetes où vous avez déployé Opérations Azure IoT, puis supprimez le groupe de ressources Azure qui contenait le cluster.

Si vous avez utilisé Codespaces pour ces démarrages rapides, supprimez votre codespace de GitHub.

Étape suivante

Tutoriel : Envoyer la télémétrie de ressources dans le cloud en utilisant un flux de données