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

#前提
先日書いた「[IBM Cloud CLIを使ってCode Engineでアプリケーションを起動する](https://qiita.com/kolinz/items/666862ebea19da187310)」では、PCにインストールするIBM Cloud CLIを使用しました。ここでは、IBM Cloud Shellを使って、IBM Cloud Code Engineでコンテナを起動してみます。
IBM Cloud CLIからIBM Cloudにログインする操作が無いこと、IBM Cloud Shellのロケーションとして「us-south」を指定する必要があることが大きな違いです。

#IBM Cloud Shell
## IBM Cloud Shellとは？
Webブラウザ上で、bashシェルを実行できる環境です。IBM Cloud上で利用することができます。公式のオンラインマニュアル「[IBM Cloud Shellに関するFAQ](https://cloud.ibm.com/docs/cloud-shell?topic=cloud-shell-faqs&locale=ja)」によれば、シェルの実行環境は、Ubuntu Linuxとあります。

2020年10月現在、IBM Cloud Shellで使われているUbuntuのバージョンは、18.04.5 LTS (Bionic Beaver)となっています。
確認方法は、IBM Cloud Shellで次のコマンドを実行してみてください。

```
$ cat /etc/os-release
```

## IBM Cloud Shellのアクセス方法
ChromeなどのWebブラウザでIBM Cloudにログイン後、画面右上の「IBM Cloud シェル」のアイコンをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/530ff07b-766d-978c-ede1-05ae1ab30b9a.png)

## ロケーション変更
2020年10月現在、ここで使用する「IBM Cloud Code Engine」は、IBM Cloudのロケーションとして「ダラス」のみになっていますので、IBM Cloud Shellのロケーションを「us-south」に変更します。

IBM Cloud Shellの画面上部で「変更」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/7a270146-d878-7ea1-f5dd-025d6d71f88d.png)

「Cloud Shellロケーションを変更します」と表示されるので、ロケーションを「ダラス(us-south)」に変更し、「続行」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/b777f206-1672-803d-d6b5-f1263e191b71.png)

IBM Cloud Shellの画面上部で、ロケーションが「ダラス」に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/efeaa21e-80c3-41e1-c62c-2c80b8b71ad4.png)

## Code Engine pluginの有無を確認
IBM Cloud Shellで、Code-Engine用のコマンドを呼び出せるか確認します。

```
$ ibmcloud plugin show code-engine
```

下図のように表示されればOKです。IBM Cloud Shellで、2020年10月現在ベータ版のIBM Cloud Code Engineを使用できることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/15b51dd8-6c17-8c2b-fb00-91dd0794e5af.png)

# IBM Cloud Code Engineでサーバーレスでコンテナを使う
## リソース・グループを指定
リソース・グループ自体の解説については公式の[オンラインマニュアル](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では、アプリケーションやジョブなどを動かすための器を「プロジェクト」と言い、必ず用意しなければいけません。
次のコマンドを実行します。作成するプロジェクト名は、2ndproject としました。プロジェクト名は英数字が使えますので、好みの名称で良いでしょう。

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

```
$ ibmcloud ce project list
```

実行結果の例

```
Name        ID                                    Status  Tags  Location  Resource Group  Time to deletion  
2ndproject  ab70ec5f-3fb4-4272-88c6-78dc63024173  active        us-south  default         7 days from now
```

2020年10月現在、IBM Cloud Code Engineはベータ版のため、7日後に自動削除する旨が表示されます。

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

```
$ ibmcloud ce project select -n 2ndproject
```
実行結果の例

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

```
$ ibmcloud ce application create --name nodered --image nodered/node-red --cpu 1 --memory 512Mi
```

ここでは、Node-REDのコンテナに、1CPUと512MBのメモリを割り当てています。
実行結果の例

```
Project '2ndproject' and all its contents will be automatically deleted 7 days from now.
Creating application 'nodered'...
The Configuration is still working to reflect the latest desired specification.
The Route is still working to reflect the latest desired specification.
Configuration 'nodered' is waiting for a Revision to become ready.
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.ab70ec5f-3fb4.us-south.codeengine.appdomain.cloud
```
上記のURLにアクセスすることで、作成したアプリケーションにアクセスすることができます。noderedは、ibmcloud ce application create で指定したアプリケーション名で、ab70ec5f-3fb4はアプリケーションが所属するプロジェクトのIDの一部になりますので、各自で異なります。
なお、2020年10月現在、IBM Cloud Code Engineはベータ版のため、7日間で自動削除する旨が表示されています。

##アプリケーションのステータス確認

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

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

実行結果の例

```
Name:          nodered  
ID:            ed33006e-da81-4030-b7d6-98d7265da9ab  
Project Name:  2ndproject  
Project ID:    ab70ec5f-3fb4-4272-88c6-78dc63024173  
Age:           5m9s  
Created:       2020-10-06 13:12:37 +0000 UTC  
URL:           https://nodered.ab70ec5f-3fb4.us-south.codeengine.appdomain.cloud  
Console URL:   https://cloud.ibm.com/codeengine/project/us-south/ab70ec5f-3fb4-4272-88c6-78dc63024173/application/nodered/configuration  

Image:  nodered/node-red  
Resource Allocation:  
  CPU:     1  
  Memory:  512Mi  

Revisions:  
  nodered-arbhb-1:  
    Age:                5m8s  
    Traffic:            100%  
    Image:              nodered/node-red (pinned to 7903d6)  
    Running Instances:  0  

Runtime:  
  Concurrency:         10  
  Concurrency Target:  10  
  Maximum Scale:       10  
  Minimum Scale:       0  
  Timeout:             300  

Conditions:  
  Type                 OK    Age    Reason  
  ConfigurationsReady  true  4m39s    
  Ready                true  4m32s    
  RoutesReady          true  4m32s  
```

実行結果として表示されたもののうち、「URL」にアクセスするとアプリケーションが表示され、「Console URL」にアクセスすると、Webブラウザ上で作成したアプリケーションの設定を確認することができます。

「Console URL」にアクセスした例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/ae605c15-99e4-1e8c-7eb8-1173d2bb4e90.png)

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

この通り、Node-REDは初期状態です。

### 実用的な使い方
サーバーレスとしてコンテナを起動できますので、何もアクセスがなければインスタンス(起動中のコンテナ)が自動で削除されますし、アクセスが増えればインスタンスが増えます。上記のようにNode-REDを起動しても、インスタンスが自動で増減するため、IBM Cloud Code Engine上でNode-REDを起動し、フローを設定しても、すぐに初期状態に戻ってしまいます。

従って、手元のPCなどでNode-REDで動かしたいフローを作りこんでおき、コンテナイメージ作成、作成したコンテナイメージを、IBM Cloud Code Engineで動かすことが実用的な使い方と言えます。

##その他
コンテナで起動しているアプリケーションのログを見るなどは、IBM Cloud CLIの場合と同じように操作し、確認することができます。