次の方法で共有


チュートリアル: Dapr と MQTT ブローカーを使用してイベントドリブン アプリを構築する

重要

Azure Arc によって有効にされる Azure IoT Operations Preview は、現在プレビュー段階です。 運用環境ではこのプレビュー ソフトウェアを使わないでください。

一般提供リリースが利用できるようになった時点で、新しい Azure IoT Operations のインストールをデプロイする必要があります。 プレビュー インストールをアップグレードすることはできません。

ベータ版、プレビュー版、または一般提供としてまだリリースされていない Azure の機能に適用される法律条項については、「Microsoft Azure プレビューの追加使用条件」を参照してください。

このチュートリアルでは、Dapr アプリケーションをクラスターにデプロイします。 Dapr アプリケーションは、MQTT ブローカー に発行されたシミュレートされた MQTT データを使用し、ウィンドウ関数を適用して、結果を MQTT ブローカー に発行します。 公開された出力は、メッセージの頻度とサイズを減らすために、エッジで大量のデータを集計する方法を表します。 Dapr アプリケーションはステートレスであり、MQTT ブローカー 状態ストアを使用して、ウィンドウの計算に必要な過去の値をキャッシュします。

Dapr アプリケーションは、次の手順を実行します:

  1. センサー データの sensor/data トピックをサブスクライブします。
  2. このトピックのデータを受信すると、MQTT ブローカー 状態ストアに転送されます。
  3. 10 秒ごとに、状態ストアからデータをフェッチし、過去 30 秒にタイムスタンプが付いたセンサー データの 最小最大平均中央値、および 75 パーセンタイルの値を計算します。
  4. 30 秒を超えるデータは状態ストアから有効期限が切れています。
  5. 結果は JSON 形式で sensor/window_data トピックに発行されます。

Note

このチュートリアルでは、生の MQTT を使用して公開やサブスクライブできるようにする Dapr CloudEvents を無効にします。

前提条件

Dapr アプリケーションをデプロイする

この時点で、Dapr アプリケーションをデプロイできます。 コンポーネントを登録しても、パッケージ化された関連バイナリはコンテナーにデプロイされません。 アプリケーションとともにバイナリをデプロイするには、[デプロイ] を使用して、コンテナー化された Dapr アプリケーションと 2 つのコンポーネントを一緒にグループ化します。

まず、次の定義を使用する yaml ファイルを作成します。

コンポーネント 説明
volumes.mqtt-client-token MQTT ブローカーおよび状態ストアによる Dapr プラグイン可能なコンポーネントの認証に使用される SAT
volumes.aio-internal-ca-cert-chain MQTT ブローカー TLS 証明書を検証するための信頼チェーン
containers.mq-event-driven 事前ビルド済みの Dapr アプリケーション コンテナー。
  1. app.yaml という名前のファイルに次のデプロイ yaml を保存します。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: dapr-client
      namespace: azure-iot-operations
      annotations:
        aio-broker-auth/group: dapr-workload
    ---    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mq-event-driven-dapr
      namespace: azure-iot-operations
    spec:
      selector:
        matchLabels:
          app: mq-event-driven-dapr
      template:
        metadata:
          labels:
            app: mq-event-driven-dapr
          annotations:
            dapr.io/enabled: "true"
            dapr.io/inject-pluggable-components: "true"
            dapr.io/app-id: "mq-event-driven-dapr"
            dapr.io/app-port: "6001"
            dapr.io/app-protocol: "grpc"
        spec:
          serviceAccountName: dapr-client
    
          volumes:
          # SAT token used to authenticate between Dapr and the MQTT broker
          - name: mqtt-client-token
            projected:
              sources:
                - serviceAccountToken:
                    path: mqtt-client-token
                    audience: aio-internal
                    expirationSeconds: 86400
    
          # Certificate chain for Dapr to validate the MQTT broker
          - name: aio-ca-trust-bundle
            configMap:
              name: azure-iot-operations-aio-ca-trust-bundle
    
          containers:
          - name: mq-event-driven-dapr
            image: ghcr.io/azure-samples/explore-iot-operations/mq-event-driven-dapr:latest
    
  2. 次のコマンドを実行して、アプリケーションをデプロイします。

    kubectl apply -f app.yaml
    
  3. アプリケーションが正しくデプロイされたことを確認します。 ポッドは、次のコマンドで示すように、しばらくしてからすべてのコンテナーの準備ができたことを報告するはずです。

    kubectl get pods -l app=mq-event-driven-dapr -n azure-iot-operations
    

    次の出力を使用します。

    NAME                         READY   STATUS              RESTARTS   AGE
    mq-event-driven-dapr         3/3     Running             0          30s
    

シミュレーターをデプロイする

Kubernetes ワークロードをデプロイしてテスト データをシミュレートします。 sensor/data トピックの MQTT クライアントを使用して、サンプル温度、振動、圧力の読み取り値を定期的に MQTT ブローカーに送信することで、センサーをシミュレートします。

  1. Explore IoT Operations リポジトリからシミュレーターをデプロイします。

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/tutorials/mq-event-driven-dapr/simulate-data.yaml    
    
  2. シミュレーターが正常に実行中であることを確認します:

    kubectl logs deployment/mqtt-publisher-deployment -n azure-iot-operations -f
    

    次の出力を使用します。

    Get:1 http://deb.debian.org/debian stable InRelease [151 kB]
    Get:2 http://deb.debian.org/debian stable-updates InRelease [52.1 kB]
    Get:3 http://deb.debian.org/debian-security stable-security InRelease [48.0 kB]
    Get:4 http://deb.debian.org/debian stable/main amd64 Packages [8780 kB]
    Get:5 http://deb.debian.org/debian stable-updates/main amd64 Packages [6668 B]
    Get:6 http://deb.debian.org/debian-security stable-security/main amd64 Packages [101 kB]
    Fetched 9139 kB in 3s (3570 kB/s)
    ...
    Messages published in the last 10 seconds: 10
    Messages published in the last 10 seconds: 10
    Messages published in the last 10 seconds: 10
    

MQTT クライアントをデプロイする

MQTT ブリッジが動作していることを確認するには、クラスターに MQTT クライアントをデプロイします。

  1. 次の client.yaml という名前の新しいファイルで、クライアントのデプロイを指定します。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: mqtt-client
      namespace: azure-iot-operations
    ---
    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: mqtt-client-token
          mountPath: /var/run/secrets/tokens
        - name: aio-ca-trust-bundle
          mountPath: /var/run/certs/aio-internal-ca-cert/
      volumes:
      - name: mqtt-client-token
        projected:
          sources:
          - serviceAccountToken:
              path: mqtt-client-token
              audience: aio-internal
              expirationSeconds: 86400
      - name: aio-ca-trust-bundle
        configMap:
          name: azure-iot-operations-aio-ca-trust-bundle
    
  2. kubectl を使用してデプロイ ファイルを適用します。

    kubectl apply -f client.yaml
    

    次の出力を確認します。

    pod/mqtt-client created
    

Dapr アプリケーション出力を確認する

  1. Mosquitto クライアント ポッドに対してシェルを開きます。

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  2. Dapr アプリケーションからの公開出力を確認するには、sensor/window_data トピックをサブスクリプションしてください。

    mosquitto_sub -L mqtt://aio-broker/sensor/window_data
    
  3. アプリケーションが次のようなセンサーのスライディング ウィンドウの計算を出力していることを 10 秒ごとに確認します。

    {
        "timestamp": "2023-11-16T21:59:53.939690+00:00",
        "window_size": 30,
        "temperature": {
            "min": 553.024,
            "max": 598.907,
            "mean": 576.4647857142858,
            "median": 577.4905,
            "75_per": 585.96125,
            "count": 28
        },
        "pressure": {
            "min": 290.605,
            "max": 299.781,
            "mean": 295.521,
            "median": 295.648,
            "75_per": 297.64050000000003,
            "count": 28
        },
        "vibration": {
            "min": 0.00124192,
            "max": 0.00491257,
            "mean": 0.0031171810714285715,
            "median": 0.003199235,
            "75_per": 0.0038769150000000003,
            "count": 28
        }
    }
    

オプション ‐ Dapr アプリケーションを作成する

このチュートリアルでは、Dapr アプリケーションの事前構築済みコンテナーを使用します。 コードを自分で変更してビルドする場合は、次の手順に従います:

前提条件

  1. Docker - アプリケーション コンテナーのビルド用
  2. コンテナー レジストリ - アプリケーション コンテナーのホスト用

アプリケーションのビルド

  1. Explore IoT Operations リポジトリを複製します。

    git clone https://github.com/Azure-Samples/explore-iot-operations
    
  2. Dapr チュートリアル ディレクトリに移動します。

    cd explore-iot-operations/tutorials/mq-event-driven-dapr/src
    
  3. Docker イメージをビルドします:

    docker build docker build . -t mq-event-driven-dapr
    
  4. Kubernetes クラスターでアプリケーションを使用するには、Azure Container Registry などのコンテナー レジストリにイメージをプッシュする必要があります。 minikubeDocker などのローカル コンテナー レジストリにプッシュすることもできます。

    docker tag mq-event-driven-dapr <container-alias>
    docker push <container-alias>
    
  5. app.yaml を更新して、新しく作成したイメージをプルします。

トラブルシューティング

アプリケーションが起動しない場合や、CrashLoopBackoff にコンテナーがある場合は、多くの場合、daprd コンテナー ログに役立つ情報が含まれます。

次のコマンドを実行して、daprd コンポーネントのログを表示します。

kubectl logs -l app=mq-event-driven-dapr -n azure-iot-operations -c daprd

次のステップ