Node-REDでAWS IoT Coreを使ってみた

AWS IoT Coreで発行した証明書ファイルをRaspberry Piに入れて、Node-REDをセットアップします。Raspberry PiをAWS IoT CoreのMQTT clientとして活用できるようにしたいと思います。
2021.01.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部の藤川です。
microSDカードの単価が下がり、5枚、10枚セットで販売されるようになりました。大変ありがたいことですが、増え続けるmicroSDカードの管理方法はちょっと問題です。
microSDカードはサイズが小さいため、ラベルを貼り付けるスペースもありません。また、シリアル番号のような識別情報が書き込まれていないようです。どうにか簡単に管理できる方法はないかと考えあぐねていました。
そして、たどり着いたのは、AWS IoT Coreの証明書ファイルです。これを利用できないものかと思い、試してみました。
ただ証明書ファイルを作成するだけでは面白くありません。Raspberry PiをMQTT clientとして活用する準備を兼ねて、AWS IoT Coreで発行した証明書ファイルをRaspberry Piに入れて、Node-REDで使用する方法をご紹介したいと思います。

ゴール

準備

  • Raspberry Pi本体
  • 8GB以上のmicroSDカード

設定方法

AWS IoT Coreで証明書を発行

  1. AWS IoT Coreで証明書を発行します。こちらのブログRaspberry PiとAWS IoTでLチカを参考にしてください。次の4ステップです。
  2. 作成した証明書をRaspberry Pi本体にアップロードします。アップロード先について、特に決まりはありません。私は、microSDカードの管理も兼ねて、証明書ファイルを/boot/certsディレクトリに置くようにしています。こちらのブログが参考になります。
    sudo mkdir /boot/certs
  3. /boot/certsディレクトリにアップロードする証明書ファイルは、このモノの証明書プライベートキーのみで構いません。パブリックキーはここでは不要です。
    証明書の種類 表示されているファイル名 実際にダウンロードされるファイル名 今回、使用する?
    このモノの証明書 *.cert.pem *-certificate.pem.crt 使用
    パブリックキー *.public.key *-public.pem.key 不要
    プライベートキー *.private.key *-private.pem.key 使用
    AWS IoTのルートCA ※なし AmazonRootCA1.pem 使用
  4. AWS IoTのルートCAは、ここからRSA2048ビットキー: Amazon Root CA 1ファイルをダウンロードします。次のコマンドを実行してください。
    cd /boot/certs
    sudo wget https://www.amazontrust.com/repository/AmazonRootCA1.pem -O AmazonRootCA1.pem
  5. 次のファイル構成になっていれば問題ありません。
    /boot/certs
      - *-certificate.pem.crt
      - *-private.pem.key
      - AmazonRootCA1.pem

Node-REDをインストール

※参考:Raspberry Piで実行する : Node-RED日本ユーザ会

  1. Raspberry PiにSSH接続します。
  2. Node-REDのインストーラをダウンロードし、実行します。
    bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
    Running Node-RED install for user pi at /home/pi on raspbian
    
    This can take 20-30 minutes on the slower Pi versions - please wait.
    
      Stop Node-RED                       ✔
      Remove old version of Node-RED      ✔
      Remove old version of Node.js       ✔
      Install Node.js LTS                 ✔   Node v12.18.2   Npm 6.14.7
      Clean npm cache                     ✔
      Install Node-RED core               ✔   1.1.2
      Move global nodes to local          ✔
      Install extra Pi nodes              ✔
      Npm rebuild existing nodes          ✔
      Add shortcut commands               ✔
      Update systemd script               ✔
    
    
    Any errors will be logged to   /var/log/nodered-install.log
    All done.
      You can now start Node-RED with the command  node-red-start
      or using the icon under   Menu / Programming / Node-RED
      Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880
    
    Started  Thu Jun 21 12:34:44 UTC 2018  -  Finished  Thu Jun 21 12:48:37 UTC 2018
  3. Node-REDを起動します。
    sudo systemctl start nodered.service
  4. ブラウザでNode-REDにアクセスします。デフォルトのポート番号は1880です。

    http://example.com:1880/

  5. 問題なければ、システム起動時に自動起動するよう設定します。

    sudo systemctl enable nodered.service

Node-REDのMQTTノードをインストール

  1. Raspberry PiにSSH接続します。
  2. node-red-contrib-aws-iotモジュール(node-red-contrib-aws-iot - npm)をインストールします。
    cd ~/.node-red
    npm install node-red-contrib-aws-iot
  3. Node-REDを再起動します。
    sudo systemctl restart nodered
  4. Node-REDにアクセスします。

    http://example.com:1880/

  5. パレットに次のノードが追加されていることを確認します。

    • aws-iot-inノード
    • aws-iot-outノード
    • aws-iot-brokerノード

Node-REDにAWS IoT Coreを設定

  1. Node-REDで、次のノードをフローにドロップします。
    • aws-iot-inノード
    • aws-iot-outノード
    • injectノード
    • debugノード
  2. aws-iot-inノードとdebugノード、injectノードとaws-iot-outノードをそれぞれ接続します。

  3. aws-iot-inノードをダブルクリックして開きます。

  4. aws-iot-brokerノードの編集画面で、Server項目の右側にある鉛筆アイコンをクリックします。
  5. ConnectionタブにAWS IoT Coreの設定を入力します。

    aws-iot-brokerノードの設定項目 AWS IoT Coreの設定項目 設定値
    Server カスタムエンドポイント <*-ats>.iot.ap-northeast-1.amazonaws.com
    Port ※指定なし 8883
    Client ID モノの名前 <モノの名前>
    Keep alive time(s) ※指定なし 60
  6. Securityタブに証明書ファイルへのパスを入力します。

    項目
    Key Path /boot/certs/*-private.pem.key
    Cert Path /boot/certs/*-certificate.pem.crt
    CA Path /boot/certs/AmazonRootCA1.pem
  7. 追加ボタンをクリックします。

  8. aws-iot-inノードの編集画面に戻り、次の値を入力します。Server項目には、aws-iot-brokerノードで設定した値が入力されています。

    項目
    Server <Client ID>@<Server>
    Topic data/<モノの名前>
    Name <モノの名前>
  9. 完了ボタンをクリックします。

  10. aws-iot-outノードをダブルクリックして開きます。
  11. aws-iot-outノードの編集画面で、次の値を入力します。Server項目には、aws-iot-brokerノードで設定した値が入力されています。

    項目
    Server <Client ID>@<Server>
    Topic data/<モノの名前>
    Name <モノの名前>
  12. 完了ボタンをクリックします。

  13. デプロイボタンをクリックします。

動作確認

AWS IoT Core側の作業

  1. このブログにある通信テストをしてみるを参考に動作確認します。
  2. AWSマネジメントコンソールAWS IoT Coreを開きます。
  3. テストを開きます。
  4. MQTTクライアントトピックdata/<モノの名前>と入力します。
  5. トピックへのサブスクライブボタンをクリックします。
  6. トピックへの発行ページに画面遷移します。
  7. メッセージウィンドウに表示されている次のJSONデータを適当に編集します。

    {
      "message": "Hello from AWS IoT console"
    }
  8. トピックに発行ボタンをクリックします。

  9. Node-REDのデバッグウィンドウに、送信したJSONデータが表示されたことを確認します。
  10. 次に、injectノードの左側のボタンをクリックします。
  11. Node-REDのデバッグウィンドウに、タイムスタンプ(13桁の数値)が表示されたことを確認します。
  12. トピックへの発行ページにも、タイムスタンプ(13桁の数値)が表示されたことを確認します。
  13. これで完了です。

さいごに

証明書ファイルを入れることで、microSDカードを識別できるようになり、管理し易くなりました。
また、Raspberry Piをエッジデバイスとして登録し、簡単にMQTTクライアントとして使用できるようになりました。
IFTTTZapierのようなハブサービスと連携し、ローコードかつローコストでIoTを楽しむ準備ができました。
様々なアイディアをご紹介して参りたいと思います。

参考