Node-REDからAWS IoTにメッセージをPublishする

需要がどの程度あるか分かりませんが、Node-REDのHTTP Requestなどで受けたデータをAWS IoTにMQTTで投げる(つまりNode-REDがHTTPとMQTTのプロトコル変換を行う)方法についてまとめます。

AWS IoTにモノを作成

まず、AWS IoT Coreを開いて、モノを作成します。

「単一のモノを作成する」で良いでしょう。

モノの名前を付けます。ここで付けた名前がMQTTでPublishする際のClientIDになります。タイプとグループは任意で構いません。

モノの証明書を作成します。MQTTでPublishする際に必要となります。「1-Click証明書作成」が簡単で良いでしょう。

作成した証明書のダウンロードを行います。ルートCAのダウンロードも忘れないように。

モノを作成した後に、ポリシーのアタッチが続きますが、一旦「完了」で構いません。

AWS IoTのポリシー作成とアタッチ

次に、安全性>ポリシータブからポリシーを作成します。

ポリシーの名前を付けます。

ステートメントはアドバンスモードを選択し、下記のJSONを入力します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:*",
      "Resource": "*"
    }
  ]
}

次に、安全性>ポリシーのタブから安全性>証明書のタブに移って、先ほど作成した証明書を選択し、ポリシーをアタッチします。

これでAWS IoT側の準備は完了です。

いよいよNode-RED

Node-REDで下図のようなフローを作成します。

設定が最も必要なのはMQTT Outのノードです。

「新規にmqtt brokerを追加」を選択し、編集ボタンをクリックします。

ここで、MQTT Brokerと言っているのがAWS IoT Coreです。ちなみに、IBM CloudにもIoTサービスがありますので、そちらを使うこともできます。IBM Cloud上でNode-REDを使っている場合は、ibmiotノードを使えば簡単にPublishすることができます。

AWS IoTでの説明に戻ります。サーバの設定とTLSの設定を行います。

サーバは、AWS IoT Coreのモノの画面から操作タブを開き、HTTPSのところに書いてあるサーバを指定します(HTTPSを使うわけではないのですが、同じサーバを指定すすればMQTTも動作します)。ポートはセキュアMQTTなので8883です。

TLS設定は、先ほどダウンロードした証明書をアップロードします。

次にMQTT Outの前にあるFunctionノードで、Publishするメッセージとトピックを指定します。

このようなJavaScriptのコードです。Publishされるメッセージはmsg.payloadに、トピックはmsg.topicで指定します。

timestamp = msg.payload;
msg = {
    'payload': {
        'timestamp': timestamp
    },
    'topic': 'gw/1001/timestamp'
}
return msg;

Injectを実行する

ここまでに作成したフローをデプロイし、Injectを行います。

あらかじめ、AWS IoTのテスト画面でgw/1001/timestampトピックをサブスクライブしておくと、このようにメッセージが表示されます。

今回はInjectノードを使ってタイムスタンプの値をPublishするだけですが、HTTP Requestに変えたりすると頭書のような要件を実現することができるでしょう。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。