Node-REDについて聞いたことがありますか?もし知っているならお気に入りのツールとしてすでによく使っているかもしれません。Node-REDインスタンスは簡単に管理できますが、仮に数十〜数百台のデバイスに展開する必要がある場合はどうしたら良いでしょうか?その問題、isaaxが解決します!

この記事ではIsaaxプロジェクトをセットアップしてNode-REDフローをsystemdサービスとして実行し、githubリポジトリへコミットするだけでアップデートする方法を学びます。

Node-REDとは?

この記事の趣旨から外れるのでNode-REDの基本については説明しませんが、もしNode-REDについて知らない場合はnodered.orgまたはNode-RED User Group Japanのドキュメントを確認してください。Node-REDはとても優れたツールです。チェックすることを強くオススメします。

Node-REDはシンプルなツールでIoTの自動化にも活用できますが、私はコーディングの未来を示していると思っています。あなたは…

  • プログラムを線で繋がれたノードな フロー として表現できます
  • ノードはある特定のタスクを行い、膨大なライブラリ群からnpmでインポートするか自分で作ることができます
  • あらゆる方法でフローを操作できます。例えば、複数のフローを同時に実行する、それらをリンクする、データを共有するなど

フローを準備する

簡単なフローを用意しました。これはタイムスタンプをMomentJSでフォーマットした後johnny5を使ったノードに渡します。タイムスタンプはFirmataで接続されたLCDディスプレイ付きのNodeMCUに順番に表示されます。

このフローは下図のようないい感じのLCD時計になりました:

これで、作成したフローをインポートすればどのNode-REDランタイムでも動作させることができます。ただし、もしこれを数百台のデバイスで動かしてメンテナンスもするとしたらどうすればいいのでしょうか?さらに、同じローカルネットワーク内にとどまらず世界中に散在しているとしたら(ただし、ネットワークには繋がっている)、どうすればいいでしょうか?

そこでisaaxの出番です。isaaxを使って複数のデバイスにフローをデプロイしましょう。

デバイスのセットアップ

Node-REDを動かすために、Node.jsとNode-REDをデバイスにインストールする必要があります。インストールの方法はNode-REDのインストールページ 日本語)から確認できます。

デバイス上で動作させるなら、ブート後やプロセスが何らかの理由で失敗した際に自動的に立ち上がるようにプロセスを常駐化したいですね。簡単に行うための選択肢としてはpm2のようなNode.js向けのパッケージや、似たものとしてsupervisordがあります。

しかし、isaaxではその問題について考える必要はありません!デバイス上で動作するisaaxのエージェントがあなたのNode-REDフローをsystemdサービスとして登録してくれます。私たちがすることはisaaxに正しい起動スクリプトを教えてあげるだけです。その方法についてみていきましょう。

isaaxプロジェクトの作成

isaaxプロジェクトの作り方はこちらです。新しいプロジェクトには、常にデバイスをグルーピングするためにデフォルトのクラスターが用意されています(クラスターは開発用のデバイスと本番用のデバイスを分けるなどの用途で使用できます。今回はデフォルトのクラスターのみを使います)。

プロジェクトを作成するには、Github(またはBitbucket)リポジトリが必要です。そのリポジトリにアップデートがあると、isaaxを通してクラスターに紐づけられたデバイスにNode-REDフローをデプロイします。リンクは、このワークフローの例です:

https://github.com/yentsun/node-red-watch

注意して欲しいのは、isaax.jsonがリポジトリに必須であることです。このファイルは実行するエントリーポイントと、デプロイするサービスの名前をIsaax Agentに指示します。

{
  "name": "node-red-watch",
  "version": "0.1.0",
  "description": "A sample Node-RED flow, displaying date and time on a 2x16 LCD",
  "main": "info-watch.json",
  "author": "Max Korinets",
  "license": "MIT",
  "language":"json",
  "scripts": {
    "start": "node-red -v --userDir=\"./\" --settings settings.js info-watch.json"
  },
  "dependency": null
}

npmのpackage.jsonに似ていますね。startスクリプトを見てください。userDirを指定し(なんらかの理由で、スクリプトを実行することができなかったことを想定して)、設定とフローファイルを明示的に指定しています。これは、rootユーザーとしてNode-REDをnpmでグローバルにインストールしたと仮定しています。

isaaxスクリプトの設定

新しくノードやnpmの依存関係をフローに追加しなければ、何もする必要はありません。ただし、settings.jsに下記を入れる必要があります。

  functionGlobalContext: {
    moment: require('moment')
  }

このコードは momentパッケージをグローバルにアクセス可能なオブジェクトとして追加します。私たちは momentを package.jsonに依存関係として追加しました。なので、Isaax AgentがNode-REDフローを実行させる前に npm installコマンドを実行してmomentをインストールする必要があります。

そこで、isaaxのスクリプトサービスが必要になります!isaaxのプロジェクトパネルにあるSHELL SCRIPTタブから pre-update スクリプトを編集できます。

#!/bin/bash
echo "Installing npm dependencies..."
npm install
exit 0

これだけです。今度はisaaxを介してプログラムが更新されるたびに、依存関係(package.jsonで宣言されたもの)がインストールされます。

デバイスの登録

isaax経由でデバイスを更新する前に、デバイスをプロジェクトに追加する必要があります。追加方法のチュートリアルはこちらです。

isaaxについてもう少し

さて、isaaxプロジェクトとisaaxエージェントが動作するデバイスを用意しました。すべての作業をまとめ、isaaxの魔法を見てみましょう。

  1. あなたのフローにいくつかの変更を加える(あなたのフローがデザインされているマシンで)
  2. リポジトリにフローをエクスポートします(簡単な方法はクリップボードからコピー/ペーストするだけです)。package.jsonに新しい依存関係を宣言してコミットすることを忘れないでください
    1. isaaxデバイスのログでデバイスの出力を観察します。
  3. デバイスをしばらく放置し、アップデートが有効になるのを確認してください。

では、isaaxクラスタに接続されたデバイス群があったと想像してみてください。それらは一度にすべて更新されるでしょう。これで、Node-REDフローの素晴らしさとisaaxの展開力で、工業生産ラインを運用する準備が整いました!(工業生産ラインは、ちょっとした冗談ですが…)


isaax

IoT向けの継続的デリバリーサービス isaax (アイザックス) isaaxを使えば1アクションで数百・数千のデバイスをアップデートできます。 IoTシステムの構築をより簡単にします。

Leave a Reply

Your email address will not be published. Required fields are marked *