水津です。はじめまして。
こちらのブログも時々執筆することになりました。よろしくお願いします。
今回の記事は私の失敗談から生まれた話です。
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を追加する必要があります。以下手順で追加してください。
- BluemixのNode-REDより、Starter codeをダウンロードする
-
DLしたアーカイブ内にあるpackage.jsonを開き、dependenciesに以下エントリーを追加し保存する
"node-red-flowbasket":"git+https://bitbucket.org/KotaSuizu/node-red-flowbasket"
追加後は以下のような感じになる。
-
Bluemix Runtimeにpushする
cf push <Application Name>
- Node-REDのWeb画面を開き、Node一覧のNIandCセクション内に、FlowBasket toBackup Nodeが追加されたことを確認する
これでNode-REDの準備は完了です。つづいてバックアップ先のCloudantDBの準備を行います。
バックアップ先CloudantDBを準備する
今回作成したNodeはFlow定義のバックアップ先としてCloudantDBを用いますので、バックアップ先のCloudantDBの準備委が必要です。以下手順で準備してください。
- Flow情報を保存するCloudantサービスを作成する
Bluemixの画面からポチッとCloudantサービスをオーダーしちゃってください。尚、Node-REDアプリケーションが構成保存先として利用しているCloudantサービスをバックアップ先としても利用する場合は、この手順は不要です。 -
作成したCloudantサービスに、Flow情報を保存するDBを作成する
Cloudantにバックアップ先DBを作成ください。 -
作成したDBに、以下のSearch Indexを作成する
Node内処理にて、同一バックアップが存在するかどうかのチェックにSearch Indexを用いてます。そのため、以下画像のSearch Indexを作成ください。
これでバックアップ先CloudantDBの準備は完了です。続いて、Node-RED上での使い方です。
「FlowBasket toBackup」を使う
このバックアップ処理はNode-RED上のNodeとして動きますので、動かすためのFlowの作成が必要となります。今回は定期的にauto backupをとるフローを作成してみたいと思います。
- フローを作成する
とりあえず、Inject, Function, FlowBasket-toBackup, debug のNodeを組み合わせ、以下の様なフローを作成ください。
フローのソースは以下となります。
[{"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"]]}]
- Inject Nodeの設定
1時間おきにバックアップが動くよう、Inject Nodeを設定しましょう。
-
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;
- FlowBasket-toBackupの設定
このNodeでバックアップを行いますので、バックアップ元と先の情報を設定する必要があります。
まず下図のAppNameに、バックアップしたいFlowが動くNode-REDアプリケーション名を設定ください。TargetDBには、バックアップ先CloudantDBのDB名を記入ください。
次に、SourceCloudant, TargetCloudantを設定します。それぞれ、バックアップ元(Node-REDアプリケーションが構成を保存しているCloudant)とバックアップ先のCloudant接続情報を設定ください。接続情報の設定画面は以下となります。
これで設定は完了です。
動作確認
それでは動作確認をしましょう。
とりあえずInject Nodeのボタンをポチッと押してください。バックアップに成功すると以下メッセージが出力されます。
すでにバックアップがあり実行されなかった場合は以下メッセージが出力されます。上記、下記両方とも正常終了です。
バックアップ先のCloudantDBには以下のようにドキュメントが保存されました。
まとめ
いかがでしたでしょうか??これでFlowのバックアップが簡単に取れるようになりましたので、Node-REDでのFlow開発も安心して進められるのでは、と思います!!ぜひご利用くださいませ。
Nodeソース保存先:
https://bitbucket.org/KotaSuizu/node-red-flowbasket