Cloud Foundry上で動かしたNode-REDのnode情報を取得する方法


現在『[日本Cloud Foundryグループ](http://blog.cloudfoundry.gr.jp/)』の企画として
Cloud Foundry上に1日1つのアプリをあげてみて、アプリを上げる際の知見を記事化するという企画が行われています。

その中でIBM製のNode-REDと呼ばれるIFTTT的な使い方が出来るnodeアプリが紹介されており

[Cloud Foundry 百日行 18日目Node-RED](http://blog.cloudfoundry.gr.jp/2015/06/cf100apps-018-nodered.html)


私自身iOSで様々なワークフロー処理が使える
[Workflow](https://workflow.is/)の手軽さとiOSでもプログラミングチックなことが出来る喜びからどっぷりハマってしまった経緯もあり、[Node-RED](http://nodered.org/)は同じようなことが出来るので、これからどんどん使い倒して行きたいと思い記事を投稿しました。

##　予備知識

Cloud Foundry上でNode-REDを動かす場合はアプリが終了してしまうとせっかく作ったnodeのflowが消えてしまいます。

百日業の記事に紹介されているように
Node-REDデフォルトの機能としてExportを使って、Clipboardにjsonデータとして保存する事でデータ消失を抑止する方法があります。

本来のNode-REDのアプリケーションとしては
内部でjsonファイルを書き出している為
今回はCloud Foundry上から直接api経由でjsonデータを取得したいと思います。

## 簡単なflowをNode-REDで作成

![kobito.1439000263.089048.png](https://qiita-image-store.s3.amazonaws.com/0/37192/0c7d4ef3-c1f8-f40f-34c1-426b48ca0c29.png "kobito.1439000263.089048.png")

1. サイドメニューの『Inputカテゴリー』から『inject』のnodeを設置しデフォルトのままにします。

2. 『functionカテゴリー』から『http request』のnodeを設置します。
3. 設置した『http request』のnodeをダブルクリックし詳細な設定を行います。
4. 例として『URL』部分にbluemixのapi infoのURLを指定しOKを押します。
![kobito.1439000603.118965.png](https://qiita-image-store.s3.amazonaws.com/0/37192/2eb4eaca-242e-e42c-69d3-00b11858cd78.png "kobito.1439000603.118965.png")
5. 最後にデバッグ用に『outputカテゴリー』から『debug』のnodeを設置し3つのノードを順に連結します
6. ここまでで簡単なflowが出来たので画面右上の『Deploy』を実行します
![kobito.1439000891.230029.png](https://qiita-image-store.s3.amazonaws.com/0/37192/1ae75df8-102f-a8b0-96ea-ac44273a2039.png "kobito.1439000891.230029.png")
7. 今回のflowでは任意のタイミングでflowが発火出来るので最初に設置した『inject』のnodeの左横にある四角部分を押すと処理が開始されます。
![kobito.1439001082.489859.png](https://qiita-image-store.s3.amazonaws.com/0/37192/4d1c5567-5bf0-af3f-40c7-bb37cb6890c6.png "kobito.1439001082.489859.png")
8. 成功すると画面右側の『debug』タブにリクエストの応答結果が出力されます。
![kobito.1439001200.405095.png](https://qiita-image-store.s3.amazonaws.com/0/37192/594a478b-e3e9-36e0-e4ca-d71317447a80.png "kobito.1439001200.405095.png")

## Cloud Foundry上からapi経由でNode-REDのflow情報(json)を取得

Cloud Foundry上で動作するアプリのファイルにアクセスするには
事前に[cfコマンド](https://github.com/cloudfoundry/cli/releases)と呼ばれるcliを導入する事で
以下のコマンドを入力する事でアクセス可能です.

例

```bash
$ cf files APP_NAME app/

```

今回、私はローカルにCloud Foundry環境を構築しており
nodeというアプリ名でアプリを起動している状態なので以下のように実行します。

```bash
$ cf files node app/
Getting files for app node in org develop / space develop as admin...
OK

.config.json                              6.6K
.flows_18sfeddp7da.json.backup            642B
.flows_18sfeddp7da_cred.json.backup        22B
.heroku/                                     -
.java-buildpack.log                      17.9K
.nodemonignore                             29B
.profile.d/                                  -
.travis.yml                               360B
CONTRIBUTING.md                           2.4K
Gruntfile.js                              3.3K
INSTALL.md                                1.6K
LICENSE                                   9.9K
Procfile                                   16B
README.md                                 1.7K
flows_18sfeddp7da.json                    620B
flows_18sfeddp7da_cred.json                22B
lib/                                         -
node_modules/                                -
nodes/                                       -
package.json                              2.3K
public/                                      -
red/                                         -
red.js                                    6.5K
settings.js                               6.9K
test/                                        -
```

上記の結果の場合
『flows_18sfeddp7da.json』が今回の目的のファイルとなるので
更に『cf files』でファイル名部分まで指定します。

```bash
$ cf files node app/flows_18sfeddp7da.json
Getting files for app node in org develop / space develop as admin...
OK

[{"type":"tab","id":"3c243758.c3dbc8","label":"Sheet 1"},{"id":"f4f1b593.0b0e48","type":"inject","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":116,"y":47,"z":"3c243758.c3dbc8","wires":[["36194883.c9e6b8"]]},{"id":"36194883.c9e6b8","type":"http request","name":"","method":"GET","ret":"txt","url":"http://api.ng.bluemix.net/v2/info","credentials":{},"x":233,"y":108,"z":"3c243758.c3dbc8","wires":[["5821d428.a7de2c"]]},{"id":"5821d428.a7de2c","type":"debug","name":"","active":true,"console":"false","complete":"payload","x":420,"y":141,"z":"3c243758.c3dbc8","wires":[]}]
```  

上記の結果の場合『OK』部分以降が今回必要としているflowデータのimport可能なjsonデータとなります

### ※ cf files app/配下に該当のjsonファイルが見当たらない場合

本家版のNode-RED(v0.11.1)を使って試していた所、『app/.node-red』という場所にありました。
バージョンによって格納先が異なるのかもしれません

```bash
$ cf files node2 app/.node-red
Getting files for app node2 in org develop / space develop as admin...
OK

.config.json                              8.9K
.flows_18sfeddp7es.json.backup            4.2K
.flows_18sfeddp7es_cred.json.backup       225B
flows_18sfeddp7es.json                    4.2K
flows_18sfeddp7es_cred.json               245B
lib/                                         -
```

## 取得したjsonからImportしてみる

1. Importの仕方は画面右上の部分をクリック
![kobito.1439001998.305666.png](https://qiita-image-store.s3.amazonaws.com/0/37192/9e08c8f7-a47e-dd9e-a815-242599dcc035.png "kobito.1439001998.305666.png")

2.『Import』 - 『Clipboard』を選択します
![スクリーンショット 2015-08-08 11.48.11.png](https://qiita-image-store.s3.amazonaws.com/0/37192/dd8a3b88-534e-e58a-6948-d16d76f61e49.png "スクリーンショット 2015-08-08 11.48.11.png")
3.『Nodes』に先ほど入手したjsonを貼り付けOKをクリック
![kobito.1439002250.966667.png](https://qiita-image-store.s3.amazonaws.com/0/37192/a1547f58-f931-632c-e5b4-881ba56766bb.png "kobito.1439002250.966667.png")
4. Importが成功すると『Sheet1』タブが追加されデータが復元されます。

※通常のExportとの違いはこの方法の場合Sheet毎保存されるようです。

## まとめ

今回の内容を踏まえてまとめてみると

* Cloud Foundryを使うことで簡単にWorkflow処理が可能になる
* データの保存についても『cf』コマンドを用いることで簡単に残すことが出来る
* 通常のExportでは選択したノードの情報のみが保存できる
* 今回の方式では通常のExportと違ってSheet毎保存されるので管理しやすい

といった特徴があげられると思います。

Node-REDではその他にも『Raspberry Pi』との連携や
『Phillipsのhue』との連携もLibraryを追加する事で簡単に出来るのでこれから色々と遊んで記事を投稿していきたいと思います。