IBM Cloud で Node-RED セットアップ (2021年12月)

執筆時点で、IBM Cloud LitePlan で `Node-RED スターター・キット` を使った CloudFoundry の Node-RED 環境が作れないです。
**でもっ！IBM Cloud でっ！Node-RED をっ！使いたいっ！**という気持ちを常に持っているので、なんとかして動かす手順をまとめました。

「コマンド一発でデプロイ！」「クリック一発でデプロイ！」な環境も作れそうな気がするけれど、今はやり方がわからないので１つ１つ手作業で準備していきました。

:::note warn
ライトアカウントの場合、CloudFoundryアプリとcloudantは１つしか作成できないため、すでに作成済みの場合はエラーになります。
:::

# Cloud Shell 設定
Node-RED をデプロイするために、`CLI` を使用して設定します。 Cloud Shellを使用するのがオススメです。あらかじめ下記項目を設定しておく必要があります。

- リージョン設定
- リソースグループ設定
- 組織(Org)
- スペース

**※筆者は us-south(ダラス）リージョンで検証しました。us-south をご利用であればスムーズに環境構築できると思います。**

[設定手順記事 - Qiita IBM Cloud Shell を使う](https://qiita.com/Kakimoty_Field/items/f79120e6bfa42c5e2d9b)

# Cloudant 
Node-RED のフローを格納するためのデータベースを準備します。

Cloudant の設定は、CLI で行います。
[IBM Cloudant CLI](https://cloud.ibm.com/docs/Cloudant?topic=Cloudant-creating-an-ibm-cloudant-instance-on-ibm-cloud-by-using-the-ibm-cloud-cli)

次項でコピペ可能なコマンドを紹介します。

## インスタンスプロビジョニング
Node-RED のフローや設定を保存する cloudant のインスタンスをプロビジョニングします

```terminal:Cloudant作成コマンド
ibmcloud resource service-instance-create \
node-red-db \
cloudantnosqldb \
lite \
us-south \
-p '{"legacyCredentials": true}'
```

`node-red-db`という名前の`CloudantNoSqlDB`インスタンスを`us-southリージョン`に作成します。`古い形式の認証方式を有効`にします。 

:::note warn
※us-south の部分は、ご自身が選択しているリージョンを設定してください
:::


成功すると以下のようなレスポンスが表示されます

```
Creating service instance node-red-db in resource group Default of account [Account]'s Account as [User]...
OK
Service instance node-red-db was created.
                     
Name:             node-red-db   
ID:               crn:v1:bluemix:public:cloudantnosqldb:us-south:a/16f6f09579814077a8e2d4cca68d3e4a:5d08c019-5d35-43f6-a005-4dfdfe31f6ad::   
GUID:             5d08c019-5d35-43f6-a005-4dfdfe31f6ad   
Location:         us-south   
State:            provisioning   
Type:             service_instance   
Sub Type:            
Allow Cleanup:    false   
Locked:           false   
Created at:       2021-11-20T11:08:50Z   
Updated at:       2021-11-20T11:08:52Z   
Last Operation:                   
                  Status    create in progress      
                  Message   Started create instance operation     
```

## エイリアス作成
CloudFoundryと連携するためのエイリアスを作成します

```terminal:エイリアス作成コマンド
ibmcloud resource service-alias-create node-red-db-alias --instance-name node-red-db
```
`node-red-db`インスタンスに`node-red-db-alias`というエイリアスを作成します。

成功すると以下のようなレスポンスが表示されます

```
Creating alias node-red-db-alias of service instance node-red-db from resource group Default into space dev...
OK
Service alias node-red-db-alias was successfully created.
                       
ID:                 crn:v1:bluemix:public:cloudantnosqldb:us-south:a/16f6f09579814077a8e2d4cca68d3e4a:5d08c019-5d35-43f6-a005-4dfdfe31f6ad:resource-alias:4ddf2cd0-bfb3-44c5-9a13-c3d0e28c44f6   
Name:               node-red-db-alias   
State               active   
Service Instance:   node-red-db   
Space:              dev   
Tags:                  
```

# Node-RED ソースコード編集
Github に公開されている IBM/node-red-app のソースコードをそのままデプロイしても正しく動作しなかったので、一部ソースコードを変更します。

https://github.com/IBM/node-red-app

```terminal:リポジトリクローンコマンド
git clone https://github.com/IBM/node-red-app
```

## 設定読み込み部分修正
公開されていたソースのままだと、Cloud Foundry と cloudant の接続がうまくいかなかったので、環境変数から接続情報を取得するように更新します。
[VCAP変数 ドキュメント](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-cloud-foundry&locale=ja)

```js:bluemix-settings.js
//const cloudantUrl = IBMCloudEnv.getString('cloudant_url'); ← コメントに
// 下記４行をコピペ
var VCAP = process.env.VCAP_SERVICES;
var cloudantEnv = VCAP ? JSON.parse(VCAP)['cloudantNoSQLDB'] : null;
var credential = cloudantEnv?.length ? cloudantEnv[0].credentials : null;
const cloudantUrl = credential?.url || IBMCloudEnv.getString('cloudant_url');
```
IBMのリポジトリをフォークした、修正済みソースファイルは[こちらのリポジトリ](https://github.com/Kakimoty-Field/node-red-app)で公開しています

# Cloud Foundry
Node-REDの実行環境を準備します
## manifest.yaml
Cloud Foundry を設定するためのマニュフェストファイルを作成します。

[manifest.yaml ドキュメント](https://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html)

```yaml:manifest.yamlサンプル 
---
version: 1
applications:
- name: dummy
  memory: 256M
  instances: 1
```
- memory : 利用メモリ。 ライトアカウントでは`２５６MByte`までしか利用できませんので、`256M` を指定します
- instances : インスタンス数。 LiteAccount では１つしか立ち上がらないので　`1` を指定します

## デプロイ

```terminal:node-redアプリデプロイコマンド
ibmcloud cf push [アプリケーション名]
```
**※アプリケーション名はご自身の好きな名前を入力してください**

:::note alert
世界中でユニークな名前である必要があります。すでに他で利用されている名前を設定するとエラーになります
:::

## バインド
Cloud Foundry の Node-RED と、cloudant を連携（バインド）します

```terminal:node-redとcloudantをバインドするコマンド
ibmcloud resource service-binding-create \
node-red-db-alias \
[アプリケーション名] \
Manager \
-n Connect-cloudant-nodered
```
`node-red-db-alias`と`[アプリケーション名]`をバインドします。


サービスバインドが作成されたら CloudFoundry を再起動します。

```
ibmcloud cf restart [アプリケーション名]
```

:::note warn
※アプリケーション名は、CloudFoundryデプロイで指定した名前を入力してください
:::

# 動作確認
ブラウザで IBM Cloud にアクセスすると、この手順で作成されて Cloud Foundry アプリケーションが一覧に表示されます。

`アプリURLにアクセス` をクリックすると快適なNode-RED環境が表示されます。