【脱heroku】IBM Cloudでチャットボットを動かす【タダ乗り】

# TL;DR
IBM Cloudのフリープランでチャットボットを動かす方法を書きます。
もちろん、CIツールを使ってGitHubにプッシュされたら自動的にデプロイされるようにします。
無課金herokuで疲弊している方はIBM Cloudを使うと幸せになれるかもしれません。
移行の所要時間は特に問題が起きなければ一時間程度でできるかと思います。

# IBM Cloudのいいところ
* フリーのLiteアカウントの登録にクレジットカードが不要 (他のクラウドサービスだとほとんどの場合クレジットカードが必要です。)
* 稼働時間制限がない (herokuみたいに、毎日止まったりしません。)
* CI/CDツール完備

Liteアカウントとは

>
Q. IBM Cloudライト・アカウントとは何ですか？
A. IBM Cloudを、クレジットカード不要で、期間無制限でWatson含めた多数のAPIとサービスが無料で使えるアカウントです。 
評価利用だけでなく、本番環境でもご利用いただけます。IBM Cloudをクレジットカードを登録せず、無料でずっとお使いいただけるアカウントの種類となります。まずは無料でお使いいただき、必要に応じて有料アカウントへの移行をご検討ください。詳細はこちらをご覧ください。
>

https://www.ibm.com/jp-ja/cloud/info/cloud-jp-faq より

IBM Cloud有能過ぎます。

# IBM Cloudのよくないところ
Liteプランには以下のような制限もあります。

* Cloud Foundryのメモリは上限256MB
* ライト・プランごとにインスタンスは1つ
* アプリの自動停止
* サービスの自動削除  

https://www.ibm.com/jp-ja/cloud/pricing より  
アプリの自動停止とサービスの自動削除がどういう条件で発動するのか、調べても出てこないのが懸念点です。
私は「最悪削除されてもインスタンスもっかい立ち上げればいいや」というつもりなのでさして問題視していません。

# 手順
作業の大まかな流れはこんな感じです。
1. アカウントの登録
2. Cloud Foundryでインスタンスを作成
3. 環境変数の設定
4. ToolchainでCI/CDを設定
5. manifest.ymlの作成

順に説明していきます。

## 1. アカウントの登録
ここから登録します。
Liteアカウントの場合クレジットカードは不要です。
https://cloud.ibm.com/registration

## 2. Cloud Foundryでインスタンスを作成
以下のアドレスからIBM Cloudのメインの管理画面にアクセスし、右上の[Create resource]ボタンを押します。
https://cloud.ibm.com/
![2019-11-04-202606_1203x771_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/bf23b19e-33fc-baf0-66c5-3fda45db1c58.png)
Liteプランで利用できるリソースの一覧が表示されるのでCloud Foundryを選択します。

必要な項目を入力してインスタンスを立ち上げます。
runtimeはHubot製のチャットボットを動かすのでnode.jsを選択します。
![2019-11-04-204208_792x696_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/4a26f59d-c762-7ae8-8d50-79ad2fecd53e.png)



## 3. 環境変数の設定
インスタンスの管理画面左側の[Runtime]を選択すると中央に[Environment Variables]というボタンが表示されるので、それをクリックすると環境変数を設定できます。
![2019-11-04-212423_1281x639_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/2c1ddb62-1f3f-d360-0997-95ab7e4c0433.png)


## 4. ToolchainでCI/CDを設定
この工程はCircleCI等で代用可能ですが、折角なのでIBM Cloudのサービスを使っていきます。

先程と同様に、リソースの一覧を表示しToolchainを選択します。
いくつかテンプレートが選択できますが、今回は一番下のBuild your own toolchainを選択します。
![2019-11-04-205101_1266x925_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/4fa26524-ecc1-629f-009e-053968b6ff60.png)
※Toolchainを作成するときに先程作成したCloud FoundryとRegionを合わせてください。
![2019-11-04-205712_1280x498_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/b4602cd1-dfa2-a365-7a6c-0e44ea69d901.png)
Toolchainを作成すると以下のような画面が表示されるので、[Add a Tool]ボタンをクリックしてツールを追加していきます。
![2019-11-04-210331_1281x650_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/53b85fff-df45-7af3-b5b2-d931dc5e3d51.png)
まずは、GitHubリポジトリと連携します。
Add Tool Integrationの画面からGitHubを選択します。
![2019-11-04-210719_1279x604_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/b8f523df-52c8-3cff-da53-6e72caf97d76.png)
Repository typeではExistingを選択します。
Repository URLで既存のGitHubリポジトリが選択できるようになります。
![2019-11-04-210919_1280x602_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/6f76954b-b82d-71b6-3c9d-bf59dc132a4d.png)

次に、Delivery Pipelineを作成します。
![2019-11-04-211612_1277x746_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/a038efaf-695a-d333-ca3c-b464313769aa.png)
作成したDelivery Pipelineを選択して、設定していきます。
![2019-11-04-212959_1280x563_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/b984d811-56e1-048d-7f76-689e51cbc236.png)
[Add Stage]を選択し、各項目を入力していきます。
Stage triggerでWhen a commit is pushedを選択すると、リポジトリにPushされたときに発動させることができます。
![2019-11-04-213425_749x874_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/6070d916-1fae-15a9-cec6-d494ea05005e.png)
JobsのタブでADD JOBからDeployを追加します。
API keyを生成してAPI keyの項目に入力します。
![2019-11-04-214351_559x901_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/328fa1ef-1cdf-59df-1644-dd2dbe6c6ec6.png)
API keyは[Manage]->[Access(IAM)]->[IBM Cloud API keys]->[Create an IBM Cloud API key]から作成できます。
![2019-11-04-213940_1276x727_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/cc492eb5-08e8-911b-7e1d-1cef9a6532da.png)
Deploy Scriptは以下の内容を入力します。

```sh
#!/bin/bash
cf push "<インスタンスに付けた名前>"
```

最後に一番下のSaveをクリックします。

## 5. manifest.ymlの作成
manifest.ymlは先程Delivery PipelineのDeploy Scriptに設定した`cf push`の動作を制御するスクリプトです。今回はデプロイ後、インスタンス上で実行するコマンドラインだけ設定します。herokuで言う所のProcfileと同じ役割になります。
以下のフィアルをリポジトリのルートにおいておけばOKです。

```manifest.yml
applications:
-  command: <実行したいコマンド>
```

Hubot製Slackチャットボットの場合こんな感じになります。

```manifest.yml
applications:
-  command: bin/hubot -a slack -n slackbot
```

## お疲れ様でした。
作業完了です。
最後に、manifest.ymlを追加してリポジトリにPushすると、インスタンスにデプロイされます。
ちなみに、うちの子はこんな感じです。
![kato.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/c00a2558-e8b2-42d2-2971-25dea06b1d85.jpeg)
加藤恵とかGitリポジトリの管理とかラーメン画像の定期配信などをやらせてます。

# 最後に
クラウドサービス御三家の影から虎視眈々とシェアを狙うIBM Cloudを応援しています。
今後もIBM Cloudの色々なサービスを使ってみたいと思います。