IBM Cloud Operator を使ってIBM Cloudのサービス（Database for MongoDB）の接続情報をOpenShiftのSecretsに取り込み、Node.js のアプリから接続してみる

## はじめに

IBM Cloud 上で Node.js と MongoDB を使ったアプリケーションの開発を行う上で、アプリケーションコンテナ基盤として、物理サーバ上に OpenShift のクラスターを構築し、データベースとしては、マネージドデータベースサービスである、IBM Cloud Database for MongoDB を利用する環境を用意しました。
OpenShift 上の Node.js アプリケーションから、データベースに接続する上では、MongoDB（IBM Cloud Database for MongoDB サービス）の接続情報が必要となりますが、このIBMのマネージドDBサービスの接続情報を、OpenShiftのSecretsに取り込む（バインドする）一つの方法として、IBM Cloud Operator というツール（仕組み）が提供されており、それを使った一連の手順を簡単にご紹介いたします。
＃ ちなみに、アプリケーションコンテナ基盤として、IBMの提供するマネージドKubernetesサービスである、「OpenShift on IBM Cloud」や「IBM Kubernetes Service」を使っている場合は、CLI上で、「ibmcloud ks cluster service bind」 コマンドを使うことで、サービスのバインド（K8sのSecretsへの接続情報の取り込み）が可能です。

## 全体ステップ

1. OpenShift上で IBM Cloud Operatorを導入する
1. IBM Cloud Operator を使って、稼働済みのIBM Cloud Database for MongoDB をサービスとして登録する
1. IBM Cloud Operator で、バインドを追加登録する
1. OpenShift 上で、登録されたSecretsを確認する
1. Database for MongoDB にアクセスする Node.js サンプルアプリで、登録されたSecrets情報を使って、実際に接続を試してみる

## ステップ１： IBM Cloud Operatorを導入する

OpenShiftポータルの OperatorHub にて、「ibmcloud」で検索し、「IBM Cloud Operator」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/e9430820-76a2-c697-48dd-20f7edb26278.png)

導入するOperatorの内容を確認し、「Install」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/0ca5f55e-f69b-d058-2924-1b2198334cf1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/bf5aac9a-6751-1744-bf03-08a9f16653e9.png)

デフォルトのまま「Install」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/6ee4ca56-b0d5-d33c-9f8d-1aba757a5dfc.png)

Operatorの導入はすぐに完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/706ac754-8069-0932-8ab4-903c5c5c0690.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/6572537b-58af-66d5-68d0-ccbc186f7b82.png)

## ステップ2: IBM Cloud Operator を使って、稼働済みのIBM Cloud Database for MongoDB をサービスとして登録する

IBM Cloud Operator の利用方法などについては、以下のGitHub上に詳しく記載されています。
https://github.com/IBM/cloud-operators/blob/master/README.md

OpenShiftのポータルの左のメニューで「Installed Operators」から、「IBM Cloud Operators」の詳細画面に移ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/5ec83fc1-724f-af23-9b7c-c6f8ff09b213.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/1edb3809-a5ae-09c8-9344-aca8d9e26d12.png)

Serviceの「Create Instance」を押して、YAML Viewにて、以下のコードを参考にして、自分の環境にあったコードを書き（置き換え）ます。

```
apiVersion: ibmcloud.ibm.com/v1
kind: Service
metadata:
  name: db4mongodb
  namespace: mongodb-sample
spec:
  plan: Alias
  serviceClass: databases-for-mongodb
```
name: <稼働済みのDBサービス名>
namespace:　<アプリケーションを配置しているProject（namespace）名>
plan: Alias（稼働済みのサービスの場合の固定値）
serviceClass: databases-for-mongodb（IBM Cloud Database for MongoDBの場合の値）

---
＃補足： 自分の環境の稼働済みのDBサービス名やserviceClass名を確認したい場合は、CLIから

```
% ibmcloud resource service-instances --long
```
と実行すると確認できます。

---

（ステップ２続き）
YAMLファイルが作成できたら、下の「Create」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/83eff46a-699a-d13c-fd99-f935f70c0510.png)

サービスが作成され、Statusが 「State: Online」になれば、自身の環境のデータベースサービスが認識された状態となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/6fdc69a3-cc00-7458-09fe-2cecf5136d8c.png)

## ステップ3： IBM Cloud Operator で、バインドを追加登録する

ステップ２同様、IBM Cloud Operatorの詳細画面にて、Bindingの「Create Instance」を押して、YAML Viewにて、以下のコードを参考にして、自分の環境にあったコードを書き（置き換え）ます。

```
apiVersion: ibmcloud.ibm.com/v1
kind: Binding
metadata:
  name: binding-mongodb
  namespace: mongodb-sample
spec:
  secretName: binding-db4mongodb
  serviceName: db4mongodb
```
name: <任意のバインディング名>
namespace:　<アプリケーションを配置しているProject（namespace）名>
secretName: \<OpenShift上で利用する任意のSecrets名>
serviceName: <前のステップで定義したサービス名>

YAMLファイルが作成できたら、下の「Create」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/491bfccd-5742-501d-8cdf-05d502940908.png)

バインディングが作成され、Statusが 「State: Online」になれば、バインディングが作成された状態となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/bf270344-41f7-3eb3-a9e7-a4fb6d5a10ee.png)

## ステップ4： OpenShift 上に登録されたSecretsを確認する

OpenShiftのWebコンソールのSecretsにステップ3のYAMLの「secretName:」で定義した名前のSecretができている事を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/8c7cafdd-2f5a-8de8-a383-1cd67044e821.png)
＃表示されない場合は、Projectが正しく選択しているか確認してください。

Secret名を押して、どのような内容がバインドされ（取り込まれ）ているか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/448c8f22-0db8-75e8-7da7-bbf68ac28f23.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/46d2fdc3-60ca-64c4-d861-b786a33497a0.png)
＃以下のSecretsが作成されています。
Key名： connection
Value値: < json形式のDBサービスの接続情報 >

---

ご参考： Database for Mongodb のサービス資格情報にもバインド情報が追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/033765b4-7eb6-abb8-e1c8-47f0941132bf.png)

---

## ステップ5: Database for MongoDB にアクセスする Node.js サンプルアプリで、登録されたSecrets情報を使って、実際に接続を試してみる

今回は、Database for MongoDBのDocs上の以下のチュートリアルを参考にしながら、
https://cloud.ibm.com/docs/databases-for-mongodb?topic=cloud-databases-tutorial-k8s-app
その中で提供されている、以下のソースコードを使ってアプリケーションの稼働確認を行いました。
https://github.com/IBM-Cloud/clouddatabases-helloworld-kubernetes-examples/blob/node/mongodb/server.js

---
ご参考までに、サンプルアプリの稼働確認を行った手順を簡単に記載しておきます。

A-1. GitHub上にあるソースコードのリポジトリにアクセス

https://github.com/IBM-Cloud/clouddatabases-helloworld-kubernetes-examples

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/3d5486e3-5106-2c2a-1faf-2ffb3c22f995.png)

A-2. ソースコードを一部カスタマイズして利用できるように、自身のGitHubレポジトリにForkする
・右上の「Sign in」ボタンにて、自身のGitHubアカウントでログインする
・右上の「Fork」ボタンを押して、サンプルレポジトリを自身のGitHubアカウントのレポジトリとして取り込む（自身のアカウント配下に正しくレポジトリがコピーされている事を確認）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/c6214813-2011-c85e-bab9-081d27d2dea2.png)

A-3. 今回利用するサンプルコードの構成と中身を確認
利用するのは「Node」ブランチの中の「mongodb」フォルダ配下にあるコード群なので、ブランチを「master」から「Node」に切り替えてから、mongodbフォルダを押し、以下のファイルの中をみて、サンプルアプリの構造を理解する
今回利用するソースコード
・Dockerfile
・package.json
・server.js
・publicフォルダ配下のUI系ファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/a880309b-0b1c-78fd-11d8-cfe9852f07d9.png)

A-4. サンプルのソースコードの一部を修正
上記のソースコードで、メインとなる server.js では、「はじめに」の章で少し触れた、CLI上で「ibmcloud ks cluster service bind」 コマンドで生成した、Secrets名が「binding」のjson形式のデータを抜き出すように書かれています。
今回バインディングした（Secretsに取り込んだ）「connection」は、「binding」の1階層下に含まれているjson構造の為、少しだけコードを書き換えます。

右のペンのマークを押して編集モードに変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/82dc064b-2d2f-2b67-9b64-fdc242f6f49a.png)
変更箇所：
49行目 BINDING → CONNECTION
55行目 credentials.connection.mongodb → credentials.mongodb

元コード：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/54303565-42b3-9395-746b-e759e923cfe7.png)
修正後コード：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/3b4c6b2c-7950-eebc-5eee-398fc457586d.png)

コード変更後に「Commit Changes」で変更を確定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/8cfb8b7d-deb8-af45-510a-748c2102ffb6.png)

A-5. mongodb-sample プロジェクトを新規作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/90d195ee-dffc-51e9-6c27-3f926d5ef9cb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/aed343be-2239-28a6-0541-911a9bafb9f4.png)

A-6. OpenShiftのビルダーを使ってGitからアプリケーションをデプロイ
Develperパースペクティブで「+Add」から「From Git」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/751b5abe-1607-b6d0-d23f-ba70b43ec102.png)
「Import from Git」にて、上記で編集を加えた自身のリポジトリ名と、「Git Reference」（ブランチ名）に「node」、「Context Dir」に「/mongodb」と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/1784e8ba-297f-a7fc-5e44-d439efa3c780.png)
「Builder」は「Node.js」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/71a52a66-cbe9-8379-b835-35a937d6a716.png)
「General」では、「Name」に適当な名前を入力し、その下の「Create」ボタンを押す前に、「Deployment」リンクを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/1b915ce8-bcfb-6561-b904-ad3df74720ac.png)
「Add from Config Map or Secret」を押して、「NAME」には「CONNECTION」を入力し、「VALUE」は「binding-db4mongodb」と「connection」を選択し、余計な1行をマイナスボタンで消して、最後に、「Create」ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/156d5602-e5c0-da18-7cfe-dad064c2dddb.png)

A-7. トポロジービューでデプロイメント（Pod）が正常に稼働した事を確認し、「OpenURL」で、サンプルアプリにアクセスする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/5264f0be-4bcb-18df-7084-c2852e796b34.png)

A-8. ブラウザーにて、入力欄に適当なデータを入れて「Add」ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/c2dade64-a278-73bf-aa2c-ef2cf91f46f1.png)
＃この時点で、Database for MongoDBに正常にアクセスできており、MongoDBのテーブルにデータが1行追加されたのがわかる

---
以上、IBM Cloud上にて、OpenShift上のNode.jsから、IBM Cloud Database for MongoDBに接続するアプリケーションを作成する際に、IBM Cloud Operatorを使って、Database for MongoDBの接続情報を、OpenShift上のSecretsに取り込む一連の手順についてご紹介させていただきました。

IBM Cloud Operatorはまだ発展途上のOperatorであり、Database for MongoDBの接続情報のOpenShift上への取り込みも、様々な方法があると思いますが、まだ、IBM CloudやOpenShiftなどを、あまり触ったことの無い方にとって、何かのご参考になれば幸いです。