2018.07.17 · 技術と道具

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を入力します。

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で指定します。

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

Injectを実行する

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

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

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

2018/07/17 12:39
← AWS IoTでS3に蓄積したログをAthenaでアドホック…
MacBook Pro (13-inch, 2018, Fo… →
井上 研一
経済産業省推進資格ITコーディネータとして中小企業のDX・AI活用の現場で伴走支援を行う。「ITCプロセスガイドライン4.0」および「中小企業向けAI活用ガイド」執筆メンバー。著書・講演多数。ITエンジニアとして25年以上の実務経験。AI導入の実務に10年以上携わる。自ら開発したAIサービス「Gen2Go」が北九州発!新商品創出事業の認定を受ける。2026年4月より北九州市立大学大学院マネジメント研究科の学生としての顔も持つ。

本サイトおよびブログに掲載している内容は、特に明記のない限り、井上研一個人の見解に基づくものです。所属・関与する組織、団体、企業、研究会等の公式見解を示すものではありません。