水津です。はじめまして。
こちらのブログも時々執筆することになりました。よろしくお願いします。

今回の記事は私の失敗談から生まれた話です。
GUIでワイヤリングしちょっとコードを書くだけで簡単に処理ロジックが作成できる便利なツール「Node-RED」。私も検証等ちょっと試したいことがあった時によく使うのですが、フローの修正等をやってDeployをした後、「あ、しまった、ちょっと前に戻したい」とか思ったことはないでしょうか。このパターンはまだいいのですが、私こないだNode-REDのビジュアルエディタ画面を複数人で開いて見てた際に誤ってDeployボタンを押しちゃったんです。。。当然私の画面に表示されているFlowが保存されDeployされるわけで、、、、はい、やらかしちゃいました。ほんとごめんなさい。。。
この出来事が起きた際改めて思ったのですが、Node-REDって便利な半面Flow定義はコード管理とかされてなく、前の定義に戻したいと思っても、ちゃんとFlow定義をExportしてないと元には戻せないんですね。自動でバックアップとか履歴管理とかしてくれればいいのに。・・・・・・無いなら作っちゃうか!と思いたち、Flow定義をバックアップするためのNodeを作成しちゃいました!!

ということで、今回は作成したNode-REDのFlow定義をバックアップするためのNode「FlowBasket toBackup」をBluemix上で使用する場合の使い方をご紹介します。

「FlowBasket toBackup」とは

「FlowBasket toBackup」は、CloudantDBに保存されているBluemix Node-REDのFlow定義を取得し、他のCloudantDBにバックアップすることができるNodeです。
バックアップ先DBへは、バックアップの度に新規文書として以下文書形式で保存されます。文書内にバックアップした際の日時やFlow定義のオリジナルのRevisionも保持させており、後で何時時点に戻したいといった際、その該当文書を探しやすくしてます。

{
"_id": <自動採番>,
"_rev": <自動採番>.
"timestamp": <Flow定義をバックアップした日時>,
"message": <Flow定義をバックアップする際に入力したメッセージ>,
"org_id": <Flow定義のオリジナルID>
"org_rev": <Flow定義のオリジナルRev>,
"flow": <Flow定義>
};

Node-REDに「FlowBasket toBackup」Nodeを追加する

利用するためにまずはNode-REDアプリケーションにこのNodeを追加する必要があります。以下手順で追加してください。

  1. BluemixのNode-REDより、Starter codeをダウンロードする
    スクリーンショット 2016-05-16 17.13.07

  2. DLしたアーカイブ内にあるpackage.jsonを開き、dependenciesに以下エントリーを追加し保存する

    "node-red-flowbasket":"git+https://bitbucket.org/KotaSuizu/node-red-flowbasket"
    

    追加後は以下のような感じになる。
    スクリーンショット 2016-05-16 17.31.00

  3. Bluemix Runtimeにpushする

    cf push <Application Name>
    
  4. Node-REDのWeb画面を開き、Node一覧のNIandCセクション内に、FlowBasket toBackup Nodeが追加されたことを確認する
    スクリーンショット 2016-05-16 17.36.42

これでNode-REDの準備は完了です。つづいてバックアップ先のCloudantDBの準備を行います。

バックアップ先CloudantDBを準備する

今回作成したNodeはFlow定義のバックアップ先としてCloudantDBを用いますので、バックアップ先のCloudantDBの準備委が必要です。以下手順で準備してください。

  1. Flow情報を保存するCloudantサービスを作成する
    Bluemixの画面からポチッとCloudantサービスをオーダーしちゃってください。尚、Node-REDアプリケーションが構成保存先として利用しているCloudantサービスをバックアップ先としても利用する場合は、この手順は不要です。

  2. 作成したCloudantサービスに、Flow情報を保存するDBを作成する
    Cloudantにバックアップ先DBを作成ください。

  3. 作成したDBに、以下のSearch Indexを作成する
    Node内処理にて、同一バックアップが存在するかどうかのチェックにSearch Indexを用いてます。そのため、以下画像のSearch Indexを作成ください。
    searchindex

これでバックアップ先CloudantDBの準備は完了です。続いて、Node-RED上での使い方です。

「FlowBasket toBackup」を使う

このバックアップ処理はNode-RED上のNodeとして動きますので、動かすためのFlowの作成が必要となります。今回は定期的にauto backupをとるフローを作成してみたいと思います。

  1. フローを作成する
    とりあえず、Inject, Function, FlowBasket-toBackup, debug のNodeを組み合わせ、以下の様なフローを作成ください。
    スクリーンショット 2016-05-16 20.59.48

    フローのソースは以下となります。

    [{"id":"607a41.ff9f85c","type":"flowbasket-config","z":"3e76a69b.c1895a","host":"cc0a6e79-cfa9-4dc5-b4cd-8fe3792ab921-bluemix.cloudant.com","name":"MyTest"},{"id":"2aae33ba.d551cc","type":"flowbasket-config","z":"3e76a69b.c1895a","host":"f6da100c-044a-4b1f-9b60-dc528080d21e-bluemix.cloudant.com","name":"nodeRed"},{"id":"3a9c8b0a.c56374","type":"FlowBasket toBackup","z":"3e76a69b.c1895a","name":"MyNodeTest","fbsourceconfig":"2aae33ba.d551cc","fbtargetconfig":"607a41.ff9f85c","fbsourceappname":"KSTestNodeRED","fbtargetdbname":"mydb","x":465,"y":1282,"wires":[["29bf45d8.d640ba"]]},{"id":"f85ec40b.07a138","type":"inject","z":"3e76a69b.c1895a","name":"","topic":"","payload":"","payloadType":"date","repeat":"3600","crontab":"","once":false,"x":143,"y":1282,"wires":[["b9b6956b.464968"]]},{"id":"29bf45d8.d640ba","type":"debug","z":"3e76a69b.c1895a","name":"","active":true,"console":"false","complete":"false","x":633,"y":1282,"wires":[]},{"id":"b9b6956b.464968","type":"function","z":"3e76a69b.c1895a","name":"SetMSG","func":"var payload =  {\n    \"isAddable\": false,\n    \"message\" : \"auto save\"\n};\n\nmsg.payload = payload;\nreturn msg;","outputs":1,"noerr":0,"x":301,"y":1282,"wires":[["3a9c8b0a.c56374"]]}]
    
  2. Inject Nodeの設定
    1時間おきにバックアップが動くよう、Inject Nodeを設定しましょう。
    スクリーンショット 2016-05-16 21.04.44

  3. Function Nodeの設定
    バックアップDBに保存する際、自動実行とわかるようにちょっとメッセージをいれましょう。ちなみにこの後ろに接続する「FlowBasket toBackup」のInputは以下payload内の2つの変数となります。isAddableは同一バックアップが存在する際にバックアップするか否か、messageは保存時に入れるメッセージとなります。何も設定しない場合はisAddableはfalseで、messageはブランクとして動作します。

    var payload =  {
        "isAddable": false,
        "message" : "auto save"
    };
    
    msg.payload = payload;
    return msg;
    
  4. FlowBasket-toBackupの設定
    このNodeでバックアップを行いますので、バックアップ元と先の情報を設定する必要があります。
    まず下図のAppNameに、バックアップしたいFlowが動くNode-REDアプリケーション名を設定ください。TargetDBには、バックアップ先CloudantDBのDB名を記入ください。
    スクリーンショット 2016-05-17 23.22.56

    次に、SourceCloudant, TargetCloudantを設定します。それぞれ、バックアップ元(Node-REDアプリケーションが構成を保存しているCloudant)とバックアップ先のCloudant接続情報を設定ください。接続情報の設定画面は以下となります。
    スクリーンショット 2016-05-17 23.23.15

これで設定は完了です。

動作確認

それでは動作確認をしましょう。
とりあえずInject Nodeのボタンをポチッと押してください。バックアップに成功すると以下メッセージが出力されます。
スクリーンショット 2016-05-16 21.39.39

すでにバックアップがあり実行されなかった場合は以下メッセージが出力されます。上記、下記両方とも正常終了です。
スクリーンショット 2016-05-16 21.40.03

バックアップ先のCloudantDBには以下のようにドキュメントが保存されました。
スクリーンショット 2016-05-16 21.43.53

まとめ

いかがでしたでしょうか??これでFlowのバックアップが簡単に取れるようになりましたので、Node-REDでのFlow開発も安心して進められるのでは、と思います!!ぜひご利用くださいませ。

Nodeソース保存先:
https://bitbucket.org/KotaSuizu/node-red-flowbasket