IBM Cloud CLIを使ってCode Engineでアプリケーションを起動する

タグを追加しました。Node-REDは、JS Foundationの米国およびその他の国における登録商標または商標ですが、QiitaにはNode-REDタグが存在しないため、node-redとNodeREDタグの2つを使っています。
- - -

[IBM Cloud Code Engine](https://cloud.ibm.com/catalog/services/codeengine) ベータ版がリリースされたとのことで、IBM Cloud CLIを使ってアプリケーションをサーバーレス(サーバーを意識させない)で動かします。Code Engineは、Kubernetes、Knative、Istio、Tekton などの上に構築されています。
Code Engineに作成するアプリケーションは、Node-REDです。DockerHubで公開されているNode-REDのイメージを使用します。

2020年9月現在、IBM Cloud Code Engineはベータ版のため無料で使えています。

#作業環境
途中で失敗しても良いように、VirtualBox上に仮想マシンとしてUbuntu Desktop 20.04を導入し下記の作業に使用しています。Ubuntuを使った理由は、Linuxの中で最も使っている人が多いだけで他意はありません。仮想マシンを自分のパソコン上に用意しておくことで何度もやり直しができます。今回はやり直しはほぼありませんが。

#IBM Cloud CLI
IBM Cloud Code Engineを使用するにあたり、ここではWebブラウザ上ではなくすべての処理を文字で行うコマンドラインインタフェース(CLI)を使用するため、「IBM Cloud CLI」をインストールします。Webブラウザ上のユーザインタフェースは時々画面のデザインが変わることがありますが、コマンドラインインタフェース(CLI)では、基本的に変わることがない特徴があります。画面変わったら操作が出来ない人は、CLIが向いています。

## IBM Cloud CLIのインストール
次のコマンドを実行します。

```
$ curl -sL https://ibm.biz/idt-installer | bash
```

画面の指示に従って、y や n (yesとno)を入力し処理を進めます。このインストーラーコマンドを実行することで、IBM Cloud Code Engineで使用するkubectlやDockerなどをまとめてインストールしてくれます。([IBM Cloud CLIのオンラインマニュアル](https://cloud.ibm.com/docs/cli?topic=cli-getting-started))

## IBM Cloudにログイン
次のコマンドを実行し、IBM Cloud CLIを用いて、IBM Cloudにログインします。

```
$ ibmcloud login
```

IBM Cloudでログイン時に使っているメールアドレスを入力します。

```
$ Email> ここにメールアドレスを入力
```

IBM Cloudでログイン時に使っているパスワードを入力します。

```
Password> 
```

パスワードは入力しても見えないようになっています。
リージョンを選択しますと表示されます。リージョンとはいわばデータセンターのことで、普段使っているリージョンを選びます。jp-tokやus-southなどを選ぶことができます。筆者は、us-south を選びました。

```
リージョンを選択します (または Enter キーを押してスキップします):
1. au-syd
2. ......
```
使用統計をIBMに送信しますか？と表示されますので、n を入力してEnterキーを押します。

```
使用統計を IBM に送信しますか? [y/n]> n
```

## リソース・グループを指定
リソース・グループ自体の解説については公式の[オンラインマニュアル](https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_commands_resource&locale=ja)へ。
リソース・グループを指定していない場合は、IBM Cloud Code Engineで、アプリケーションやジョブをまとめる器となる「プロジェクト」を作成することができません。

次のコマンドを実行し、既存のリソース・グループを表示します。

```
$ ibmcloud resource groups
```
結果の例

```
名前      ID                  デフォルト・グループ   状態
default   xxxxxxxxxxxxxxxxx   true                ACTIVE
```
ここでは名前が「default」というリソース・グループをターゲットに指定します。

```
$ ibmcloud target -g default
```

# IBM Cloud Code Engine
Webブラウザ上で操作したい場合は、末尾の参考情報をご覧ください。ここでは、IBM Cloud CLIを用いてアプリケーションの作成を実施します。

## Code Engine CLI プラグインのインストール
IBM Cloud CLIで、IBM Cloud Code Engineを使用するために、Code Engine CLI プラグインをインストールします。

```
$ ibmcloud plugin install code-engine
```
実行後は画面の指示に従って操作します。
プラグインが無事にインストールできたかどうか、次のコマンドを実行して確認します。

```
$ ibmcloud plugin show code-engine
```
結果の例

```
プラグイン名                              code-engine/ce
プラグイン・バージョン                    0.4.2217
プラグイン SDK バージョン                 0.3.0
必要な最小限の IBM Cloud CLI バージョン   1.0.0

コマンド:
 code-engine,ce                    Manage Code Engine components.
 以下省略....
```

## プロジェクト作成
IBM Cloud Code Engineでは、アプリケーションやジョブなどを動かすための器を「プロジェクト」と言い、必ず用意しなければいけません。
次のコマンドを実行します。作成するプロジェクト名は、1stproject としました。プロジェクト名は英数字が使えますので、好みの名称で良いでしょう。

```
$ ibmcloud ce project create --name 1stproject
```
作成済みの既存のプロジェクトは、次のコマンドを実行することで確認できます。

```
$ ibmcloud ce project list
```

## プロジェクトの指定
アプリケーションを作成するにあたり、プロジェクトを指定するため、次のコマンドを実行します。ここでは、1stprojectを指定しています。実際は、1stprojectのところがプロジェクト名を指定する箇所になりますので、各自が作成したプロジェクト名に置き換えてコマンドを実行してください。

```
$ ibmcloud ce project select -n 1stproject
```
結果の例

```
Selecting project '1stproject'...
OK
```

## アプリケーションの作成
DockerHubで公開されているNode-REDのDockerイメージを呼び出して、IBM Cloud Code Engineにアプリケーションとして作成します。
次のコマンドを実行します。

```
$ ibmcloud ce application create --name nodered --image nodered/node-red --cpu 1 --memory 512Mi --min-scale 1
```
結果の例

```
roject '1stproject' and all its contents will be automatically deleted 7 days from now.
Creating application 'nodered'...
Configuration 'nodered' is waiting for a Revision to become ready.
Ingress has not yet been reconciled.
Waiting for load balancer to be ready
Run 'ibmcloud ce application get -n nodered' to check the application status.
OK

https://nodered.xxxxxxxx-xxxx.us-south.codeengine.appdomain.cloud
```
上記のURLにアクセスすることで、作成したアプリケーションにアクセスすることができます。noderedは、ibmcloud ce application create で指定したアプリケーション名で、xxxxxxxx-xxxxはアプリケーションが所属するプロジェクトのIDの一部になりますので、各自で異なります。
なお、2020年9月現在、IBM Cloud Code Engineはベータ版のため、7日間で自動削除する旨が表示されています。

### 実行した、ibmcloud ce application create コマンドの内容
様々なオプションをセットしていますので、ここで使用したコマンドオプションがどのような意味を持つか説明します。

| コマンドオプション | 意味 | 入力例 | 必須 | 備考 |
|:-----------|:------------|:-------------|:-------------|:-------------|
| --name     | アプリケーション名の指定   | nodered　| 〇 | |
| --image    | コンテナ(Docker)イメージの指定   | nodered/node-red　| 〇 | 今回はDockerHubで公開されているイメージを使用。|
| --cpu      | 割り当てるCPUの数を指定   | 1　|  | デフォルトの値は、0.1。 |
| --memory   | 割り当てるメモリの量を指定   | 512Mi　|  | デフォルトの値は、1024Mi。つまり1GB。 |
| --min-scale   | 最小のインスタンス数を指定   | 1　|  | デフォルトの値は、0。デフォルト値の場合、使っていないとインスタンスが自動削除されてしまい、アプリケーション作成時に戻ってしまうので注意。|

コマンドオプションについては、必ず公式の[オンラインマニュアル](https://cloud.ibm.com/docs/codeengine-cli#cli-application-create)を確認してください。

## アプリケーションのステータス確認
どのように構成されたかどうか、アプリケーションの状況を確認するには、次のコマンドを実行します。

```
$ ibmcloud ce application get -n nodered
```
上記のnoderedは、ibmcloud ce application create で指定したアプリケーション名になります。アプリケーション名が異なる場合は、各自が使用したアプリケーション名に置き換えてコマンドを実行してください。

結果の例

```
Getting application 'nodered'...
OK

Name:          nodered
ID:            xxxxxxxx-xxxx-xxxxxxxx-xxxx
Project Name:  1stproject
Project ID:    xxxxxxxx-xxxx-xxxxxxxx-xxxx
Age:           78s
Created:       2020-09-19 15:19:36 +0900 JST
URL:           https://nodered.xxxxxxxx-xxxx.us-south.codeengine.appdomain.cloud
Console URL:   https://cloud.ibm.com/codeengine/project/us-south/xxxxxxxx-xxxx-xxxxxxxx-xxxx/application/nodered/configuration

Image:  nodered/node-red
Resource Allocation:
  CPU:     1
  Memory:  512Mi
  以下省略
```
実行結果として表示されたもののうち、「URL」にアクセスするとアプリケーションが表示され、「Console URL」にアクセスすると、Webブラウザ上で作成したアプリケーションの設定を確認することができます。

「Console URL」にアクセスした例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/b8b9a97b-ee13-3d74-044a-5ec2d87aada4.png)

## アプリケーションの削除
作成したアプリケーションを削除するには、次のコマンドを実行します。noderedは、ibmcloud ce application create で指定したアプリケーション名になります。アプリケーション名が異なる場合は、各自が使用したアプリケーション名に置き換えてコマンドを実行してください。

```
$ ibmcloud ce application delete --name nodered
```
結果の例

```
Project '1stproject' and all its contents will be automatically deleted 7 days from now.
Are you sure you want to delete application nodered? [y/N]> y
Deleting application 'nodered'...
OK
```
アプリケーションを削除して良いか確認を求めてきますので、y を入力しEnterキーで実行します。
なお、2020年9月現在、IBM Cloud Code Engineはベータ版のため、7日間で自動削除する旨が表示されています。

## Webブラウザでアクセス
アプリケーションの作成、またはアプリケーションのステータス確認で表示されたURLにアクセスし、アプリケーションが動いているか確認します。ここではNode-REDを指定していましたので、Node-REDが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/3fc5a7a8-91a2-c4f3-4ddb-63cb18e41f32.png)

## アプリケーションのログを見る
起動したアプリケーションのログを見るには、ibmcloud ce application logs コマンドを使用します。そのために、アプリケーションのインインスタンス名を取得し、取得したインスタンス名に対して、ibmcloud ce application logs コマンドを実行します。

### アプリケーションのインスタンス名の取得
次のコマンドを実行します。アプリケーションのステータス確認で使用したものと同じです。

```
$ ibmcloud ce application get -n nodered
```

上記のnoderedは、ibmcloud ce application create で指定したアプリケーション名になります。アプリケーション名が異なる場合は、各自が使用したアプリケーション名に置き換えてコマンドを実行してください。

結果の例

```
Instances:
  Name                                         Running  Status   Restarts  Age
  nodered-xxxx-1-deployment-xxxxxxxx-xxxxxxx  2/2      Running  0         14h
```
実行結果の一番したに表示される、Instances:のNameに表示されているアプリケーションのインスタンス名が重要です。

### アプリケーションのログを取得
次のコマンドを実行します。取得したアプリケーションのインスタンス名を使用します。

```
$ ibmcloud ce application logs --instance nodered-xxxx-1-deployment-xxxxxxxx-xxxxxxx
```
上記のnodered-xxxx-1-deployment-xxxxxxxx-xxxxxxxは、取得したアプリケーションのインスタンス名になります。各自で置き換えてください。

結果の例

```
Project '1stproject' and all its contents will be automatically deleted 7 days from now.
Logging application instance 'nodered-xxxx-1-deployment-xxxxxxxx-xxxxxxx'...
OK


> node-red-docker@1.1.3 start /usr/src/node-red
> node $NODE_OPTIONS node_modules/node-red/red.js $FLOWS "--userDir" "/data"

19 Sep 11:53:35 - [info]

Welcome to Node-RED
===================

19 Sep 11:53:35 - [info] Node-RED version: v1.1.3
19 Sep 11:53:35 - [info] Node.js  version: v10.22.0
19 Sep 11:53:35 - [info] Linux 4.15.0-112-generic x64 LE
19 Sep 11:53:35 - [info] Loading palette nodes
19 Sep 11:53:36 - [info] Settings file  : /data/settings.js
19 Sep 11:53:36 - [info] Context store  : 'default' [module=memory]
以下省略
```
なお、なお、2020年9月現在、IBM Cloud Code Engineはベータ版のため、7日間で自動削除する旨が表示されています。
IBM Cloud CLIを使うことで、ログを取得することができます。Webブラウザ上では2020年9月現在はログの取得ができません。


#参考記事
Webブラウザ上で操作する場合は、[サーバレスプラットフォームのCode Engine(IBM Cloud)を試してみた](https://qiita.com/motuo/items/b4127ae23ff5dc3ba6a4) がオススメです