Kubernetes上で稼働するCloud Foundry -  Cloud Foundry Enterprise Environment 事始め

# Cloud Foundry Enterprise Environment(CFEE)とは
IBM Cloudでは2014年にBluemixとしてサービスを提供を開始して以来、Cloud Foundryのアプリケーション実行環境をマネージド・サービスが利用可能です。Cloud FoundryはPaaSのアプリケーション・プラットフォームであり、アプリケーションを実行するためのリソースについて、細かな管理をしなくても柔軟にアプリケーションの稼働環境を利用できる特徴があります。具体的にはビルドパックという仕組みを使って複数の言語をサポート可能なほか、デプロイされたアプリケーションのスケーリング、障害からの回復性、高可用性かつ災害対策を考慮した構成などをとることできるあたりが特徴的です。
IBM Cloud上のサービスではマルチテナントで稼働するPublicサービスの他に、IBM Cloud内のシングルテナント環境で稼働する専有型のサービスがあり、CFEEはこの専有型サービスにあたります。お客様が稼働されるアプリケーションの種類により、非常に安価に利用できるPublicサービスと専有環境を構築できるCFEEを使い分けることが可能です。

今回はCFEEがどのようなものかというところをお伝えしたいと思います。

# CFEEの稼働スタック

CFEEはCloud Foundry Publicサービスとは異なり利用者のアカウントの中でワークロードが稼働できます。一方で利用者のアカウント内のリソースについては利用者が維持・運用する必要があります。そのため、どういうスタックで稼働するかを利用者側で意識する必要があります。CFEEが稼働するスタックは以下の図のような環境です。

<img width="966" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/d6f4f4f0-7a9e-2abe-d048-de38efe3ad69.png">

CFEEを一言で表すとKubernetesクラスター上で稼働するように構成されたCloud Foundry環境です。そのため、Kubernetesの実行環境が必要となります。IBM CloudではKubernetes Service(IKS)の上で稼働します。Kubernetesクラスター上にCFEEのDiegoセルとControl Planeがそれぞれ別のノードとして稼働します。Diegoセルはお客様のアプリケーション・インスタンスが稼働するサーバーでこのセルの数を増やしたりスペックをあげることでCFEE環境全体の処理能力を増強させることができます。冗長性の観点から2つ以上のDiegoセルを配置することがお勧めです。Control Planeは利用者のアプリケーション以外の管理機能を含みます。Diegoセルの構成によらず、冗長構成がとられ、複数台のサーバー上で稼働されるように構成されます。
Databases for PostgreSQLとCloud Object StorageはCloud Foundry環境を管理するためのメタデータやBlobオブジェクトが配置されます。利用者が意識的に管理する必要はありませんが、これらのサービスも使われていることは意識する必要があります。CFEEを稼働させるための最小構成ではこれらのサービスも必要で、利用量に応じた課金が発生します。
CFEEサービス管理とIKS Master Nodeはマネージド・サービスとして運用する上で必要な機能をIBM側で用意し、維持・運用しているものです。利用者の視点ではネットワーク越しにアクセスできる環境を維持する必要があります。


# CFEEのプロビジョニング

## アクセスポリシーの設定

CFEEのプロビジョニングを開始するために利用者にIBM Cloudユーザー管理におけるアクセス権限を付与しておく必要があります。詳細はIBM Cloud Docsの[ページ](https://cloud.ibm.com/docs/cloud-foundry?topic=cloud-foundry-permissions)にてご確認ください。
プロビジョニングして諸々の操作をを行うためには以下の権限を設定するのがよいと思います。
- CFEEを作成する`リソース・グループ`に対する `「ビューアー」` 役割
- `CFEE`サービスに対する `「プラットフォーム・アクセス」の「管理者」` 役割
- `Kubernetes`サービスに対する `「プラットフォーム・アクセス」の「管理者」` 役割
- `Databases for PostgreSQL`サービスに対する `「プラットフォーム・アクセス」の「管理者」` 役割
- `クラシック・インフラストラクチャー`サービスにおける `Power Users`許可セット
- `Object Storage`サービスに対する`「プラットフォーム・アクセス」の「エディター」 `および` 「サービス・アクセス」の「管理者」`役割
- アカウント管理サービス`Support Center`に対する`「エディター」`役割

## カタログ上におけるプロビジョニングの設定
まずはIBM Cloudの[カタログ](https://cloud.ibm.com/catalog)にアクセスしましょう。「Cloud Foundry Enterprise Environment」というタイルはなく「Cloud Foundry」とまとめられているので、そちらを探してクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/821e2cb7-39ac-0b19-11af-47c893300c4b.png)

Cloud FoundryのPublicサービスとCFEEを選択する画面が表示されるので「エンタープライズ環境」の「作成」ボタンをクリックします。次の画面では「続行」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/33711d60-23fc-00cd-552d-f326dac761ff.png)

「Cloud Foundry Enterprise Environmentの構成」画面は縦に長いので順番に説明していきます。

- 「プラン」は現在は「Standard」プランしかありません。
- 「環境の選択」では「クラシック」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/83d0fce9-05e2-ce58-9f5c-6a717cab8815.png)

- 「名前」にはCFEE環境の名称を設定します。
- 「リソース・グループ」は変更する理由がなければ「Default」のままで構いません。
- 「可用性」は用途に応じて選択します。本番環境として利用される場合には複数のアベイラビリティーゾーンに分散配置される「複数ゾーン」の利用がおすすめです。
- 「リージョン」は「東京」とすることで東京リージョンにデプロイされます。
- 「ワーカー・ゾーン」はデプロイする先のゾーンを選択します。この例では東京2(tok04), 東京3(tok05)を選択していますが、2つのゾーンにデプロイする設定となっています。
- 「ハードウェアの分離」は共有型(マルチテナント)の仮想サーバーを使用するか、専有型(シングルテナント)の仮想サーバーを使用するかを選択します。
- 「ローカル・ディスクの暗号化」は仮想サーバーの内蔵ディスクを暗号化するか否かを選択します。デフォルトはチェックありなので、そのままチェックを入れておきます。
- 「管理に使用するサービス・アクセス・エンドポイント」はアカウントの状況により、プライベート・ネットワークを利用できる場合にはプライベート・ネットワークを利用し、それ以外はパブリック・ネットワークが使用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/fb112c67-8a80-4a63-3001-26f97d582a26.png)

最後にクラスターを構成するノードの台数とスペックを指定します。

- 「ゾーンあたりのセルの数」にはアベイラビリティー・ゾーンあたりのセルの数を指定します。右側の「コントロール・ブレーン・ノード数」は「ワーカー・ゾーン」として指定されたゾーンの数に応じてControl Planeのデプロイ先とその数が決まります。単一ゾーン構成の場合には指定されたゾーンに2台のControl Planeノードが設定され、複数ゾーン構成の場合には指定されたゾーンに各1ノードずつデプロイされます。イメージが湧くように下に図示してみました。

<img width="606" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/103ea5cf-e7e9-66ca-bf8c-1eb288442d8d.png">

<img width="728" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/c09f0235-8ecd-334f-0814-14a56ed3fdfe.png">

- 「セル・ノード」と「コントロール・プレーン・ノード」はそれぞれ仮想サーバーのスペックを選択します。「4コア 16GB RAM」もしくは「8コア 32GB RAM」から選択します。組み合わせで利用できない組み合わせ（下表参照）もあります。


||セル・ノード 4コア16GB|セル・ノード 8コア32GB|
|:-:|:-:|:-:|
|<Strong>コントロール・プレーン・ノード 4コア16GB</Strong>|○|×|
|<Strong>コントロール・プレーン・ノード 8コア32GB</Strong>|○|○|

最後に「作成」(もしくは「Create」)ボタンをクリックすると環境作成が始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/61043c1d-d562-4c3d-8a07-c02b2f39c7ad.png)


今回は1時間半ほどでプロビジョニングが完了しました。「概要」をクリックすると稼働しているノード（セル、コントロール・プレーン）の稼働状況が表示されます。ここまでで専有のCloud Foundry環境ができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/7c21b647-d6e9-7e3d-7dd2-dfa1d4f28c45.png)

なお、この画面を閉じてしまい、戻れなくなった場合には[リソース・リスト](https://cloud.ibm.com/resources)のCloud Foundry enterprise environmentsのサービス名（以下の例ではmycfee）をクリックすると戻れます。

<img width="1523" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/2385df21-2bfb-b774-bab5-6083b7c38a1e.png">



# 組織とスペースを作ってみる

ここからはCloud Foundryアプリケーションを稼働させるための手順となります。Cloud FoundryのPublicサービスでも組織とスペースを作成しますが、CFEEを利用する場合にはCFEEサービスのインスタンスごとにそれらを管理します。
サービスインスタンスの「組織」を表示します。プロビジョニング時に作成される`system`という組織がリストされます。
今回は開発チームがデモを行うための組織とスペースを作っていきます。
まず、新しい`dev`という組織を作成していきます。「組織の作成」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/cd81a3b5-3058-e55a-37c5-0c2f359c87c6.png)

- 「組織名」は`dev`とします。
- 「管理者」はIBM Cloudアカウントに招待されているメンバーを設定する必要があります。
- 「割り当て量プラン」は`default`のままで構いませんが、`qxGB`という表示の別のプランに変更しても構いません。アプリケーションで利用できるメモリー量の合計、サービス・インスタンス数の上限、Cloud Foundryアプリケーションの経路の数がプランにより異なります。
- 「追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/5ed799cd-eff5-05f4-9b68-f89c1e08fba8.png)

`dev`という組織が作成されたので、表内の「dev」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/68de55fd-f602-568b-142d-4b18737f6161.png)

「スペース」タブを選択します。まだスペースは作成されていないので空の表が表示されます。
次に新しい`demo`というスペースを作成していきます。「スペースの作成」ボタンをクリックします。

<img width="1269" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/26dcd692-d628-33b2-0f00-f86c1086836b.png">

- 「スペース名」は`demo`とします。
- 「管理者」はIBM Cloudアカウントに招待されているメンバーを設定する必要があります。組織の管理者と同一である必要はありません。
- 「追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/267cf0f3-fb3a-05e6-672d-bd285f64be1a.png)

必要に応じて追加のメンバーを組織やスペースに追加し、必要な役割を与えます。この辺りの考え方はCloud Foundry Publicサービスと同じ考え方です。操作画面が異なることを除けば新しいことは何もありません。



# 簡単なアプリをデプロイしてみる

組織とスペースを作成したので、サンプルアプリケーションをデプロイしていきましょう。IBM Cloud CLIもしくはCloud Foundry CLIをインストールしておく必要があります。
サンプルアプリケーションとしてはNode.jsのHello Worldアプリケーション[URL](https://github.com/IBM-Cloud/node-helloworld)を利用します。ローカル環境にcloneしておきます。

今回はCloud Foundfry CLIを使っていきます。まずは`cf login`コマンドでログインします。`-a`オプションで指定するAPIのエンドポイントは管理今ソースのCFEEのサービスインスタンスの「概要」画面の右上に表示されるのでコピーして使います。
また、組織を選択する箇所では`dev`という組織を使用するのでそちらの番号を選択します。(下記の例では1番)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/bcec2565-9980-757e-e464-8af9e97703fd.png)



```
$ cf login -a https://api.mycfee-cluster-c82xxx5867b41450588f492846xxx9a8-0000.jp-tok.containers.appdomain.cloud
API エンドポイント: https://api.mycfee-cluster-c82xxx5867b41450588f492846xxx9a8-0000.jp-tok.containers.appdomain.cloud


Email: <IBMidのE-mailアドレス>

パスワード: 
認証中です...

OK


Select an org:
1. dev
2. system

組織 (enter to skip): 1
Targeted org dev

Targeted space demo



API エンドポイント:   https://api.mycfee-cluster-c82xxx5867b41450588f492846xxx9a8-0000.jp-tok.containers.appdomain.cloud (API version: 3.72.0)
ユーザー:             <IBMidのE-mailアドレス>
組織:                 dev
スペース:             demo

```

ログインできました。それではアプリケーションをデプロイしていきます。Cloud Foundryアプリケーションでは`cf push`コマンドを実行します。バインドされるサービスなどがある場合にはオプションを指定する必要がありますが、今回はスタンドアローンで稼働するアプリケーションなので、コマンドだけを実行します。

```

$ cf push
<IBMidのE-mailアドレス> としてマニフェストから組織 dev / スペース demo にプッシュしています...
マニフェスト・ファイル /<ファイルを配置したパス>/node-helloworld/manifest.yml を使用しています
アプリ情報を取得しています...
これらの属性でアプリを作成しています...
+ 名前:       hello-node
  パス:       /<ファイルを配置したパス>/node-helloworld
+ メモリー:   128M
  経路:
+   hello-node-rested-porcupine-ap.mycfee-cluster-c82xxx5867b41450588f492846xxx9a8-0000.jp-tok.containers.appdomain.cloud

アプリ hello-node を作成しています...
経路をマップしています...
ローカル・ファイルをリモート・キャッシュと比較しています...
Packaging files to upload...
ファイルをアップロードしています...
 15.19 KiB / 15.19 KiB [======================================================================================================================================================================] 100.00% 1s

API がファイルの処理を完了するのを待機しています...

アプリをステージングし、ログをトレースしています...
   Downloading xpages_buildpack_v1_2_2...
   Downloading ruby_buildpack...
   Downloading binary_buildpack...
   Downloading nodejs_buildpack...
   Downloading go_buildpack...
   Downloaded binary_buildpack
   Downloading python_buildpack...
   Downloaded go_buildpack (4.5M)
   Downloading php_buildpack...
   Downloaded nodejs_buildpack (4.6M)
   Downloading swift_buildpack...
   Downloaded ruby_buildpack (5M)
   Downloading liberty-for-java...
   Downloaded python_buildpack (4.5M)
   Downloading sdk-for-nodejs...
   Downloaded php_buildpack (324.7K)
   Downloading dotnet-core...
   Downloaded sdk-for-nodejs (155.8M)
   Downloading staticfile_buildpack...
   Downloaded staticfile_buildpack (5M)
   Downloading xpages_buildpack...
   Downloaded xpages_buildpack (307.5M)
   Downloading java_buildpack...
   Downloaded dotnet-core (944.6M)
   Downloading dotnet-core_v2_4-20190912-1554...
   Downloaded java_buildpack (207.1K)
   Downloading liberty-for-java_v3_38-20191031-1433...
   Downloaded xpages_buildpack_v1_2_2 (307.5M)
   Downloading sdk-for-nodejs_v4_0_1-20190930-1425...
   Downloaded liberty-for-java (757M)
   Downloading swift_buildpack_cflinuxfs3_v2_1_0-20190404-1206...
   Downloaded swift_buildpack (813.4M)
   Downloaded sdk-for-nodejs_v4_0_1-20190930-1425 (155.8M)
   Downloaded dotnet-core_v2_4-20190912-1554 (944.6M)
   Downloaded liberty-for-java_v3_38-20191031-1433 (757M)
   Downloaded swift_buildpack_cflinuxfs3_v2_1_0-20190404-1206 (813.4M)
   Cell diego-cell-1 creating container for instance 0e59af6b-d11a-4b93-8ac8-57c17aac87fb
   Cell diego-cell-1 successfully created container for instance 0e59af6b-d11a-4b93-8ac8-57c17aac87fb
   Downloading app package...
   Downloaded app package (15.2K)
   cat: /VERSION: No such file or directory
   -----> IBM SDK for Node.js Buildpack v4.0.1-20190930-1425
          Based on Cloud Foundry Node.js Buildpack 1.6.53
          
   -----> Installing binaries
          engines.node (package.json): unspecified
          engines.npm (package.json): unspecified (use default)
          **WARNING** Node version not specified in package.json or .nvmrc. See: http://docs.cloudfoundry.org/buildpacks/node/node-tips.html
          Attempting to install: 10.16.3
   -----> Installing node 10.16.3
          Copy [/tmp/buildpacks/700edfaeef3b2e3a8718371a6adec764/dependencies/9afdb4f3300cc6a181909f11075912df/node-10.16.3-linux-x64-cflinuxfs3-33294d36.tgz]
          Using default npm version: 6.9.0
   -----> Installing yarn 1.17.3
          Copy [/tmp/buildpacks/700edfaeef3b2e3a8718371a6adec764/dependencies/748132b4ee4ecaf8bbb5bfa5932e6689/yarn-1.17.3-any-stack-e3835194.tar.gz]
          Installed yarn 1.17.3
   -----> Creating runtime environment
          PRO TIP: It is recommended to vendor the application's Node.js dependencies
          Visit http://docs.cloudfoundry.org/buildpacks/node/index.html#vendoring
          NODE_ENV=production
          NODE_HOME=/tmp/contents291082166/deps/0/node
          NODE_MODULES_CACHE=true
          NODE_VERBOSE=false
          NPM_CONFIG_LOGLEVEL=error
          NPM_CONFIG_PRODUCTION=true
   -----> Building dependencies
          Installing node modules (package.json + package-lock.json)
   added 59 packages from 44 contributors and audited 135 packages in 1.141s
   found 0 vulnerabilities
          **WARNING** Unmet dependencies don't fail npm install but may cause runtime issues
          See: https://github.com/npm/npm/issues/7494
          Contrast Security no credentials found. Will not write environment files.
   Exit status 0
   Uploading droplet, build artifacts cache...
   Uploading droplet...
   Uploading build artifacts cache...
   Uploaded build artifacts cache (703.3K)
   Uploaded droplet (21.9M)
   Uploading complete
   Cell diego-cell-1 stopping instance 0e59af6b-d11a-4b93-8ac8-57c17aac87fb
   Cell diego-cell-1 destroying container for instance 0e59af6b-d11a-4b93-8ac8-57c17aac87fb
   Cell diego-cell-1 successfully destroyed container for instance 0e59af6b-d11a-4b93-8ac8-57c17aac87fb

アプリが開始するのを待機しています...

名前:                   hello-node
要求された状態:         started
経路:                   hello-node-rested-porcupine-ap.mycfee-cluster-c82xxx5867b41450588f492846xxx9a8-0000.jp-tok.containers.appdomain.cloud
最終アップロード日時:   
スタック:               cflinuxfs3
ビルドパック:           sdk-for-nodejs

タイプ:           web
インスタンス:     1/1
メモリー使用量:   128M
開始コマンド:     node server
     状態   開始日時               cpu    メモリー        ディスク      詳細
#0   実行   2019-12-               0.0%   128M の中の 0   1G の中の 0   



```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/51ca28ba-0b48-02d4-1bdd-7b04727965b4.png)

Cloud Foundryアプリケーションが稼働できました。念のため、URLにアクセスして画面を表示してみましょう。経路の情報は上のコマンドの実行結果の最後から10行目の「経路:」に表示されるものです。アクセスしてみると、無事に表示されますね。

<img width="1091" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/1afdc2ae-e0bb-318c-886f-2894c7d54e43.png">

このセクションでの操作内容を振り返ると、Cloud Foundry環境にログインして、`cf push`コマンドを実行するところまで、Publicサービスにおけるそれと全く同じ手順なのがわかると思います。違うのはログイン時に利用したAPIのエンドポイントだけです。


# 管理コンソール(Stratos)をインストールする

プロビジョニング直後の状態では、Cloud Foundryの詳細な情報にアクセスできるGUIベースの管理コンソールは利用できません。Cloud Foundryの[Stratos](https://github.com/cloudfoundry/stratos)という管理コンソールをインストールすることで利用することができます。StratosもCFEE環境上で稼働するKubernetesもしくはCloud Foundryアプリケーションです。
この先サービスの管理など行うためにインストールしていきます。CFEEサービスインスタンスの概要画面右上にある「Stratos Consoleのインストール」ボタンをクリックします。

インストール・オプションの設定画面が表示されるので、今回は「Kubernetesのデプロイメント」としてアプリ・インスタンスを`2`としてインストールします。Cloud Foundryアプリの場合には後ほど説明する組織とスペースの作成をあらかじめ実施する必要があります。

<img width="835" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/7dbf5120-1375-a468-1634-6ee6b386f99b.png">

インストールは3分程度で終わりました。終わると「Stratos Console」というボタンが表示されるのでそちらをクリックします。

<img width="1523" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/7e9868ad-03f2-20f0-771e-fc56ea394c2a.png">

StratosコンソールのHome画面が表示されます。まだ何も実施していないので空の画面となっています。

<img width="1523" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/afc29e26-a7ef-ba4d-7a9c-477135864993.png">


## 参考: StratosのKubernetes Deploymentの確認
インストール後にIKS上で稼働中のデプロイメントやポッドを確認すると`stratos`というネームスペースにデプロイメントが作成され、先ほど指定したとおり`2`つのポッドが稼働していることがわかります。
なお、IKS上に直接利用者のアプリケーションをインストールして稼働させることは技術的にはできますが、CFEE利用上は非推奨となっていますので、別途IKSのクラスターを準備する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/99b56d9b-c6de-9ea7-c644-7ba6adf3bd3a.png)



# Node-REDを稼働させてみる

先ほど簡単なスタンドアロンアプリケーションは簡単に稼働できました。最後にもう少し複雑なアプリケーションの例としてNode-REDを稼働させてみましょう。IBMがサンプルとして公開している[Node-RED Starter](https://github.com/ibmets/node-red-bluemix-starter)を使ってみます。

Node-RED Starterは以下のアプリとサービスから構成されます。

- Node.jsで稼働するNode-REDアプリケーション
- フローデータを保存するCloudantデータベース

Node-RED Starterを稼働させるためにはこれらをデプロイした後に正しくこれらをバインドして起動する必要があります。ここでは以下のような手順で進めていきます。

- (手順1) Cloudantサービスインスタンスの作成
- (手順2) Node-REDアプリケーションの設定ファイルの変更
- (手順3) Node-REDアプリケーションのデプロイ
- (手順4) Node-REDアプリケーションとCloudantサービスインスタンスのバインド
- (手順5) Node-REDアプリケーションの起動と稼働確認

## (手順1) Cloudantサービスインスタンスの作成

さきほど作成したStratosコンソールにアクセスします。左側のメニューで「Marketplace」を選択します。MarketplaceはIBM Cloudでいうところのカタログで利用可能なサービスがリストされます。ここではCloudantを作成するので、「Cloudant」のパネルをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/4b9ed8a6-909b-8a31-0da3-2e7d6b336a06.png)

次の画面では右上「+」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/32902001-dfee-9a4c-3731-ec9fa4548109.png)

- 「Organization」に`dev`を設定します。
- 「Space」に`demo`を設定します。
- 「Next」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/77de5b91-85ef-3d52-6fab-dae6f1e3b962.png)

- 次の画面ではサービスのプランを選択します。ここでは`standard`を選択します。
- 「Next」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/ee117a9d-0c14-c8c8-9bcf-b498a8427abb.png)

- 次の画面ではバインドするアプリケーションを選択しますが、まだありませんので初期設定のまま「Next」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/9cac6106-35cd-7138-8c8e-a875f5f8c4f5.png)

Cloudantのリソースに関する設定を行います。

- 「Name」はCFEE内で利用できるサービス・インスタンスの名称を指定します。`Cloudant-dev-demo-nodered`という名称にします。
- 「Tag」と「Service Parameters」は特に設定しません。
- 「Resource Group」にはResource GroupのIDを設定します。IBM Cloudのアカウントにかかる[リソース・グループ](https://cloud.ibm.com/account/resource-groups)のページにアクセスし、ID列の値を取得します。今回は`Default`というリソース・グループを使うので、その値をコピーして貼ります。
- 「Target」はサービスインスタンスをデプロイするリージョンを選択します。ここでは`bluemix-jp-tok`を選択します。
- 「Instance Name」はIBM Cloudからみたときのサービス・インスタンス名を指定します。特に「Name」と区別する必要はないので、同じ `Cloudant-dev-demo-nodered`という名称にします。
- 「Finish」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/72bab287-8961-dda4-7437-7a52f3999abf.png)

リソースグループのIDの取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/67d4ad10-4a86-2fe0-a087-4a0792fa377f.png)

しばらくするとインスタンスが作成されます。Stratosのコンソール上は以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/d6e55618-df4f-2c61-b260-1f5ec0181111.png)

## (手順2) Node-REDアプリケーションの設定ファイルの変更

Node-REDアプリケーションが作成したCloudantサービスインスタンスを参照できるように設定を変更します。
アプリケーションからバインドされたサービスインスタンスの名称を参照できるようにします。具体的には環境変数にNode-REDをカスタマイズする際に使用する変数を設定します。

`NODE_RED_STORAGE_NAME: Cloudant-dev-demo-nodered`の1行を挿入します。

```node-red-starter/manifest.yaml
applications:
- memory: 256M
  env:
    OPTIMIZE_MEMORY: true
    NODE_RED_STORAGE_NAME: Cloudant-dev-demo-nodered
  command: node index.js --settings ./bluemix-settings.js -v

```
## (手順3) Node-REDアプリケーションのデプロイ

Node-REDアプリケーションをプッシュしていきましょう。ただし、サービスとのバインドなど必要な手続きがあるので、プッシュしたのちに起動しない設定(`--no-start`オプションあり)でプッシュします。

```
$ cf push node-red-starter --no-start
<IBMidのE-mailアドレス> としてマニフェストから組織 dev / スペース demo にプッシュしています...
マニフェスト・ファイル /U<ファイルを配置したパス>/node-red-bluemix-starter/manifest.yml を使用しています
アプリ情報を取得しています...
これらの属性でアプリを作成しています...
+ 名前:       node-red-starter
  パス:       /Users/ibm/cfeeapp/node-red-bluemix-starter
+ コマンド:   node index.js --settings ./bluemix-settings.js -v
+ メモリー:   256M
  環境:
+   NODE_RED_STORAGE_NAME
+   OPTIMIZE_MEMORY
  経路:
+   node-red-starter.mycfee-cluster-c82xxx5867b41450588f492846xxx9a8-0000.jp-tok.containers.appdomain.cloud

アプリ node-red-starter を作成しています...
経路をマップしています...
ローカル・ファイルをリモート・キャッシュと比較しています...
Packaging files to upload...
ファイルをアップロードしています...
 39.23 KiB / 39.23 KiB [======================================================================================================================================================================] 100.00% 1s

API がファイルの処理を完了するのを待機しています...

名前:                   node-red-starter
要求された状態:         stopped
経路:                   node-red-starter.mycfee-cluster-c82xxx5867b41450588f492846xxx9a8-0000.jp-tok.containers.appdomain.cloud
最終アップロード日時:   
スタック:               
ビルドパック:           

タイプ:           web
インスタンス:     0/1
メモリー使用量:   256M
開始コマンド:     node index.js --settings ./bluemix-settings.js -v
     状態     開始日時               cpu    メモリー     ディスク     詳細
#0   ダウン   2019-12-               0.0%   0 の中の 0   0 の中の 0   

```

## (手順4) Node-REDアプリケーションとCloudantサービスインスタンスのバインド

アプリケーションとサービスインスタンスをバインドしていきましょう。
まず、Stratosコンソールの「Applications」にアクセスすると「node-red-starter」が追加されていることがわかります。「node-red-starter」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/27ff752b-f259-771a-6451-4406488187b4.png)

アプリケーションの詳細が表示されます。左側の「Services」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/3616ced7-aab4-68e5-0869-085cfbffb4c1.png)

「+」をクリックしてサービスを追加していきます。

<img width="1179" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/22b3eb2d-2e75-f91c-b4ab-037c7508e154.png">

- 「Marketplace Service」をクリックします。

<img width="1179" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/9b22f6aa-0f62-b9c2-f818-9e1fc7b58444.png">

- Serviceのリストから「cloudantNoSQLDB」を選択します。
- 「Next」をクリックします。

<img width="1179" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/2bf36aa1-318c-797f-5a92-4710496f2639.png">

- プランはリストから「Standard」を選択します。
- 「Next」をクリックします。

<img width="1179" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/0432b076-2e53-d312-7bdf-b22714fbadf6.png">

- 「Next」をクリックします。

<img width="1179" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/78fb8704-2b2c-5a74-41c8-e6dd63e0a0fd.png">

- 「Bind to an Existing Service Instance」を選択します。
- Service Instanceとして先ほど作成した `Cloudant-dev-demo-starter`を選択します。
- 「Finish」をクリックします。

<img width="1179" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/83a0b7bd-08fe-e6cd-801f-84ebd4d078aa.png">

バインドできると以下のような画面が表示され、アプリケーションからバインドできたことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/58291552-b419-25ed-7890-f1ff859d1944.png)


## (手順5) Node-REDアプリケーションの起動と稼働確認

それではアプリケーションを起動します。`cf start`コマンドでnode-red-starterアプリケーションを起動します。

```
$ cf start node-red-starter
<IBMidのE-mailアドレス> として組織 dev / スペース demo 内のアプリ node-red-starter を開始しています...

アプリをステージングし、ログをトレースしています...
   Downloading xpages_buildpack_v1_2_2...
   Downloading staticfile_buildpack...
   Downloading sdk-for-nodejs...
   Downloading dotnet-core...
   Downloading liberty-for-java...

(中略)

   Uploading droplet, build artifacts cache...
   Uploading droplet...
   Uploading build artifacts cache...
   Uploaded build artifacts cache (21.7M)
   Uploaded droplet (67.3M)
   Uploading complete
   Cell diego-cell-1 stopping instance 8daxxxxxx94d3-4b0c-8398-91axxxxxxdb4
   Cell diego-cell-1 destroying container for instance 8daxxxxxx94d3-4b0c-8398-91axxxxxxdb4
   Cell diego-cell-1 successfully destroyed container for instance 8daxxxxxx94d3-4b0c-8398-91axxxxxxdb4

アプリが開始するのを待機しています...

名前:                   node-red-starter
要求された状態:         started
経路:                   node-red-starter.mycfee-cluster-c82xxx5867b41450588f492846xxx9a8-0000.jp-tok.containers.appdomain.cloud
最終アップロード日時:   
スタック:               cflinuxfs3
ビルドパック:           sdk-for-nodejs

タイプ:           web
インスタンス:     1/1
メモリー使用量:   256M
開始コマンド:     node index.js --settings ./bluemix-settings.js -v
     状態   開始日時               cpu    メモリー        ディスク      詳細
#0   実行   2019-12-               0.0%   256M の中の 0   1G の中の 0   

```

コマンドの実行結果の下から10行目あたりの「経路」のURLにアクセスします。Node-REDの設定画面が表示され、アプリは起動したことがわかりました。

<img width="1382" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/073bf556-b22a-190b-e9de-8a082bfd85bc.png">

Node-REDの設定を終えたのちにNode-RED Editorにログインして、簡単なフローを作ってみます。
デプロイしたのちにInject操作を行い、debugメッセージが表示されることを確認します。
きちんとメッセージが表示されていますね。これでアプリとしての稼働確認は終了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/a55003b2-a501-2b1f-f53e-bbcdf97ffdef.png)

最後にCloudantにデータが本当にできているのかというところだけ確認しましょう。

Stratosコンソールにアクセスし、「Services」でインスタンスを表示させます。Dashboardの「View」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/a69c176c-b7e9-d647-788b-0b39628d1ea1.png)

画面右上の「Launch Cloudant Dashboard」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/b7df55dd-c466-03cb-860b-94d9036b5709.png)

DatabasesにnoderedstarterというDBができています。

<img width="1381" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/c7a4ac13-cdf7-787b-833e-805354bab10f.png">

さらに文書をみると「noderedstarter/flow」には作成したフローの情報が格納されていて、アプリとバインドしたサービスにも正しくアクセスできていたことがわかります。

<img width="1316" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/faa9e3f6-28f4-a846-702d-eccf29593f98.png">

# おわりに

Kubernetes上で稼働するCloud Foundry環境であるCloud Foundry Enterprise Environment(CFEE)についてプロビジョニングして簡単なアプリケーションを稼働させるところまでを実施してみました。環境をプロビジョニングする部分もアプリケーションをpushする部分もPublicサービスのそれらを同じようにごく簡単な操作で実施できますね。


CFEEはRed Hat OpenShift上での稼働についてもサポートされる予定で来年は稼働させる環境の幅が広がりそうです。また、記事には含めませんでしたが、Cloud Foundry Foundationの[Project Eirini](https://www.cloudfoundry.org/project-eirini/)についてもbeta版の公開が行われていました。EiriniはCloud FoundryアプリケーションをKubernetes環境上でも稼働させる取り組みで、現状はDiegoで行われているスケジュール機能をKubernetesのそれと置き換えることを可能とします。すでにbeta版の提供は終了していますが、来年以降CFEEの環境がCloud Foundryコミュニティの新しい機能をさらに取り込むことが期待されます。