[チュートリアル] Node.jsのWebアプリ公開からCloudant NoSQL DB接続まで (IBM Cloud Foundry)

皆さん、こんにちは。戸倉彩です。

今回はIBM Cloud上で提供されているCloud Foundryサービスを利用してNode.jsのWebアプリケーションを構築する手順について紹介します。

# はじめに
このチュートリアルでは、次のアカウントおよびツールを利用します。必要に応じて入手してください。
・ **IBM Cloud アカウント**: まだお持ちでない方は、過去に投稿した[「「IBM Cloudをはじめました」無料ではじめられるライト・アカウント登録方法」](https://qiita.com/ayatokura/items/42d4bc728112c733c80d)をご覧ください。
・ **[IBM Cloud CLI](https://cloud.ibm.com/docs/cli/reference/ibmcloud?topic=cloud-cli-install-ibmcloud-cli&locale=ja)**: IBM Cloudをコマンドで操作するためのコマンド・ライン・インターフェース(CLI)です。
・ **[Git](https://git-scm.com/downloads)**: GitHubリポジトリーからクローンする際に利用します。
・ **[Node.js](https://nodejs.org/en/)**: 今日現在、最新バージョン12.7.0が提供されていますが、安定バージョン10.16.1 LTSを利用されることをお勧めします。

# Step 1: サンプルアプリケーションのクローン
下記のコマンドを実行してNode.jsのHello WorldサンプルアプリケーションをGitHubのリポジトリからクローンします。

```
git clone https://github.com/IBM-Cloud/get-started-node
```

# Step 2: アプリケーションをローカル実行
１. コマンドラインで、ディレクトリをダウンロードしたサンプルアプリケーションがある場所に変更します。

```
cd get-started-node
```

２. アプリケーションをローカルで実行するため、次のコマンドを実行してpackage.jsonファイルにリストされている依存関係をインストールします。   

```
npm install
```
３. 次のコマンドでアプリケーションを実行してください。

```
npm start
```
４. Webブラウザで http://localhost:3000 にアクセスします。
５. 「ようこそ」画面が表示されたら名前を入力します。
６. 「こんにちは <入力した名前>」と表示されたらOKです。
７. コマンドラインで[Control]+[C]を同時に押し、アプリケーションの実行を止めます。

# Step 3: デプロイのためのアプリの準備
IBM Cloudにデプロイするには、**manifest.yml** ファイルをセットアップします。 manifest.yml には、名前、各インスタンスに割り当てるメモリ容量、ルートなど、アプリに関する基本的な情報が含まれています。 **get-started-node**ディレクトリに、次のサンプルのmanifest.ymlファイルが存在することを確認してください。

```
applications:
- name: GetStartedNode
  random-route: true
  memory: 128M
```

# Step 4: IBM Cloudへのアプリケーションのデプロイ
１. コマンドラインからIBM Cloudにログインします。

```
ibmcloud login
```

企業アカウントなどでシングルサインオンを採用している場合は、次のコマンドでログインしてください。

```
ibmcloud login --sso
```

２. Cloud Foundryの組織とスペースをターゲットにします。

```
ibmcloud target --cf
```

組織やスペースが設定されていない場合は、「[組織とスペースの追加](https://cloud.ibm.com/docs/account?topic=account-orgsspacesusers&locale=ja)」サイトを参照してください。

３. get-started-nodeディレクトリー内から、アプリをIBM Cloudにプッシュします。

```
ibmcloud cf push
```

アプリケーションのデプロイには数分かかることがあります。デプロイが完了すると、アプリが実行されているというメッセージが表示されます。 pushコマンドの出力に表示されているURLでアプリを表示するか、次のコマンドを実行してアプリの展開ステータスとURLの両方を表示します。

```
ibmcloud cf apps
```

また、「[IBM Cloud リソース・リスト](https://cloud.ibm.com/resources)」サイトにアクセスしてアプリを表示することもできます。

４. 生成されたURL、例えば **(getstartednode-xxx).mybluemix.net** にブラウザでアクセスしてアプリケーションがIBM Cloud上にデプロイしたことを確認してください。

# Step 5: データベースの追加
次に、このアプリケーションに **IBM Cloudant NoSQLデータベース** を追加して、ローカルでもIBM Cloud上でも実行できるようにアプリケーションをセットアップします。
１. ブラウザで、[IBM Cloudにログイン](https://cloud.ibm.com/login)してダッシュボードを表示します。**[リソースの作成]** ボタンを選択します。
２. **[カタログ]** から **「Cloudant」** を検索して、サービスを選択します。
３. **[Available authentication methods**(利用可能な認証方法)**]**で、**[Use both legacy credentials and IAM** (従来の認証情報とIAMの両方を使用する)**]** を選択します。他のフィールドはデフォルト設定のままにすることができます。 [作成]ボタンをクリックしてサービスを作成します。作成には数分を要する場合があります。
４.　ナビゲーションで **[接続]** に移動し、**[接続の作成]**ボタン をクリックします。アプリケーションを選択して **[接続]** をクリックします。
５. デフォルト値を使用して、**[Connect＆restage app]** をクリックしてデータベースをアプリケーションに接続します。プロンプトが表示されたら、**[アプリの接続および再ステージ]** をクリックします。

# Step 6: データベースの使用
このデータベースを指すようにローカルコードを更新します。アプリケーションが使用するサービスの資格情報を格納する**JSONファイル** を作成します。このファイルは、アプリケーションがローカルで実行されている場合にのみ使用されます。 
**IBM Cloud** で実行している場合、資格情報は **VCAP_SERVICES** 環境変数から読み取られます。

１. **get-started-node** ディレクトリに、次の内容の**vcap-local.json**というファイルを作成します。

```
{
 "services": {
   "cloudantNoSQLDB": [
     {
       "credentials": {
         "url":"CLOUDANT_DATABASE_URL"
       },
       "label": "cloudantNoSQLDB"
     }
   ]
 }
}
```

２. IBM Cloudリソース・リストからご自身のアプリケーションをクリックして詳細を表示します。アプリの詳細ページで、サイドバーの **[接続]** をクリックします。 IBM Cloudantメニュー・アイコンの横の **(…)** をクリックして、**[資格情報の表示]** を選択します。
３. CLOUDANT_DATABASE_URLをコピーして、**vcap-local.json**ファイルの**url**フィールドにURLだけをコピーして貼り付けてファイルを保存します。
４. アプリケーションをローカルで実行します。

```
npm start
```

５. ローカル上で実行したご自身のアプリを **http://localhost:3000** にアクセスして、名前を入力して[Enter]キーを押します。
<img src="https://fp61ig.by.files.1drv.com/y4mVmyr214EWlCPJFP1If7qcqK7HfXGEsAbzbAoLajTVUVTsxjyMVFNcnxbfW7B9_iQMV3yPJ7XLS2ok8zSIf24b0LYxDljTU4dbtO-cw4X8QM_RI81kzc4WHt_kOLCMMT6GBlbxcE68_XgsvJpXGHkhZxiTZhm-JeezF2lmRlYnQ4KQ-qRGjSAMX6TC3-QQbmf_dSJdLAAji-afx3B8tPm7Q?width=456&height=366&cropmode=none" width="500">

６. アプリに入力した名前はすべてデータベースに追加されます。
<img src="https://fp60ig.by.files.1drv.com/y4mFFwE-IsF8Ds0QTUHB70qKWLOOF1owZYxkYq5hvUqizsY9kOAW9xd9JQdbqGsa0y11R35s7Efn5TP4mnuNVMCaqE39AGnCkmrJopkyOGSk4Lx03KkP6r0IZpS-bfO59_7Cih2VpTC_yPJrr_KQepqTll1QugMZ69-hrxLCmwbDHHFMwq7KoHBzPz0pdOWPJTv3VaCjySmLXgiSCOa8a_X1g?width=542&height=434&cropmode=none" width="500">

以上です。
IBM Cloud Foundryでは、Node.jsの他にもJava、ASP.NET Core、Swift、Go、PHP、Python、Rubyに対応していますので、いろいろチェックしてみてください。

# 参考文献
* [IBM Cloud - Getting started tutorial (SDK for Node.js)](https://cloud.ibm.com/docs/runtimes/nodejs?topic=Nodejs-getting-started&locale=en)