IBM Cloud Code Engineでサンプルアプリケーションをデプロイしてみる

# はじめに

仕事柄IBMが提供するクラウドサービスである[IBM Cloud](https://www.ibm.com/jp-ja/cloud)を扱うことが多いのですが、そこそこ最近発表されたサーバーレス・プラットフォームである[IBM Cloud Code Engine](https://www.ibm.com/jp-ja/cloud/code-engine)を試してみたので、自分の備忘録も兼ねて記していきたいと思います。なお、リンクや画面キャプチャ等は執筆している2021年12月末時点のものですので、今後変わる可能性があります。

# IBM Cloud Code Engineとは
まずIBM Cloud Code Engineとは何かという点ですが、トップページには以下のようにあります。
> フルマネージド型のコンテナ・ランタイムでコンテナ、アプリケーション・コード、バッチ・ジョブを実行します。

ですので、何かコードを書いてコンテナ化するか、アプリケーションをビルドするかしてデプロイし実行できる環境のようです。[料金体系](https://www.ibm.com/jp-ja/cloud/code-engine/pricing)を見るとこんな感じです。

| 料金体系プラン | CPU | メモリー | 着信要求 |
|:-:|:-:|:-:|:-:|
|無料|10万vCPU秒/月   |1か月あたり200,000 GB秒 | 1か月あたり100,000件のHTTP要求|
| 無料を超えた場合| vCPU秒あたり0.000032米ドル |1GB秒あたり0.0000033米ドル  |HTTP要求100万あたり0.5米ドル    |

20万GB秒ってのがぱっと見多いのか少ないのかわかりにくいので変換してみると、1か月の秒数は60x60x24x30=2592000秒なので、200000/2592000=0.0771(GB)ということになります。つまり約77MBを超えるアプリケーションを**常時**動かしていると無料枠を超えます。こう考えるとかなり少ないですが、常時というところがポイントになりますかね。その辺も確認するためまずは試してみましょう。


# サンプルアプリケーションのデプロイ
まずはIBM Cloudのアカウントが必要ですので、まだ作ってない方はトップページのボタンからアカウントを作成してください。ログインしてCode Engineのページを開きます。↓のように検索するなどしてページに辿り着いてください。
![スクリーンショット 2021-12-23 13.44.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632713/af1b53f9-fe20-3915-b410-fc1a8cdd2dff.png)
Code Engineのページにはサンプルがすぐに試せるようになっていますので、早速開始してみます。まずは（簡単そうな）コンテナー・イメージの実行の方を試してみます。
![スクリーンショット 2021-12-23 13.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632713/f911cba6-b9b9-c3c9-94e6-a28a2eceb460.png)
「何を作成しますか？」はアプリケーション（選択済み）、名前は何か適当につけます。プロジェクトを選択します。（まだプロジェクトが作られてない場合はこの画面から作れます。ですが私はこの画面から作ったら失敗したので、Code Engineの「プロジェクト」タブから作成したら作れました。）実行するコードの選択では「コンテナー・イメージ」を選択し、イメージにはサンプルの`docker.io/ibmcom/codeengine`をそのまま指定します。レジストリー・アクセスはパブリックなのでそのまま何も指定せず、エンドポイントもデフォルトのパブリックのままにしておきます。その他の設定はそのままで「作成」をクリックします。画面が遷移してしばらくして「準備完了」となったらもうデプロイ済みです。

![スクリーンショット 2021-12-23 14.10.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632713/e19e3c7c-5833-0f2f-a05c-2eb45a020240.png)
画面右上の「アプリケーションのテスト」からアプリケーションのURLに飛ぶと、デプロイしたばかりのサンプルアプリケーションにアクセスできます。

![スクリーンショット 2021-12-23 16.02.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632713/e3f84657-8a07-2dfa-3517-dc2dc6c2390f.png)

（余談ですが、このサンプルアプリケーションの"Hello World from:"の下にあるやつ、てっきり文字化けか何かしてるのかと思ったら、"CODE ENGINE"のアスキーアートだったんですね :sweat_smile:)

# スケーリングの確認
まずデプロイしたアプリケーションが使われないとどうなるかという点ですが、デフォルトでの設定はこのようになっています。
![スクリーンショット 2021-12-23 14.33.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632713/fb74fdc7-a1c7-eade-a89b-d409021a945e.png)

インスタンスの最小数が0なので使わないと0になる（スケールダウンする）はずですね。確認してみましょう。

アプリケーションにアクセスすると初回はそこそこ時間がかかります。この時にインスタンスが1つ起動しているはずです。一度インスタンスが起動したらその後はリロードしてもすぐ表示されるようになります。そのまま数分放置してみます。先ほどのアプリケーションの「概要」タブを選択してみるとこのようにインスタンス数が表示されますが、起動してしばらくするとインスタンス数が0に戻っていることがわかります。これなら使ってないアプリケーションがリソースを使うことはなさそうですね。
![スクリーンショット 2021-12-23 15.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632713/d1d7101d-5b55-ea1a-4f62-e2dce0a514f1.png)
次はスケールアップの方も試してみます。サンプルアプリケーションが軽いのでそのままだとリロード連打しようがスケールしてくれなさそうなので、並行性設定を落としてみます。「構成」のタブから「編集して新規リビジョンを作成」をクリックし、「ランタイム」のタブで「ターゲットの並行性」を`100`から`1`に変えてみます。念の為、インスタンスの最大数も3にしておきます。そして新しいリビジョンがデプロイされたら、もう一度アプリケーションにアクセスしてすぐにリロードしてみます。すると今度はちゃんとインスタンス数が2まで増えているのがわかります。もちろんこのインスタンスもアクセスがなければ一定時間経過後に停止されます。
![スクリーンショット 2021-12-23 15.10.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632713/6cc1788d-49d3-b0ab-3403-79307df44333.png)

なお、最小構成は0.125vCPU/0.25GB(memory)のようです。この場合いくらぐらいかかるのか計算してみると、まずvCPUの方は、(0.125x60x60x24x30 - 10万(無料分))x0.000032 = 7.168ドル、メモリーの方は(0.25x60x60x24x30 - 20万(無料分))x0.0000033 = 1.4784ドルとなります。なので最小構成で動かし続けた場合、1ヶ月で8.6464ドル程度かかりそうです。

# Code Engine CLIでの作業
ここまでは全てIBM CloudのUI（コンソール）を使って作業しましたが、同様のことはCLI（コマンドラインツール）を使っても可能です。[ガイド](https://cloud.ibm.com/docs/codeengine?topic=codeengine-install-cli)に従ってCode Engine CLIを導入します。

まずはIBM Cloudにログインします。

```shell
$ ibmcloud login
```

必要に応じてリソースグループの設定等も行います。次にプラグインの導入です。

```shell
$ ibmcloud plugin install code-engine
```

これでCode Engine用のコマンドを実行することができるようになりました。引数なしで実行するとヘルプが表示されます。

```shell
$ ibmcloud code-engine
名前:
  code-engine, ce - Code Engine のコンポーネントを管理します

使用法:
  ibmcloud ce command [arguments...] [options...]

コマンド:
  application, app    アプリケーションを管理します。
  build, bd, b        ソース・コードからイメージを生成するための構成を管理します。
  buildrun, br        ビルドからイメージを生成します。
  configmap, cm       configmap を管理します。
  job                 タスクを構成するためにジョブを管理します。
  jobrun, jr          ジョブのインスタンスを管理します。
  project, proj       Code Engine のプロジェクトを管理します。
  reclamation, recl   Code Engine のプロジェクトの再利用を管理します。
  registry            イメージ・レジストリーのアクセス・シークレットを管理します。
  repo                Git リポジトリーのアクセス・シークレットを管理します。
  revision, rev       アプリケーション・リビジョンを管理します。
  secret              一般シークレットを管理します。
  subscription, sub   イベント・サブスクリプションを管理します。
  version, v          'code-engine' のコマンド・ライン・インターフェース・バージョンを表示します。

コマンドの詳細については、'ibmcloud ce help command' を入力してください。
```

ヘルプにあるように短縮形は `ibmcloud ce` です。先ほどのアプリケーションも確認できます。確認するにはまずプロジェクトを指定します。

```shell
$ ibmcloud ce project select -n fterui-test
プロジェクト 'fterui-test' を選択中...
OK
```

プロジェクトを指定したらアプリケーションをリストします。（以下出力を一部加工してます。）

```shell
$ ibmcloud ce application list
アプリケーションをすべてリスト中...
OK

名前                       状況      URL                                                                              最新                             経過時間  条件      理由  
codeengine-application-57  準備完了  https://codeengine-application-57.***  codeengine-application-57-00004  78m       3 OK / 3
```

では早速アプリケーションを作成してみます。イメージは先ほどUIから作ったアプリケーションと同じサンプルアプリケーションのイメージを指定します。

```shell
% ibmcloud ce application create --name fterui-test-cli --image docker.io/ibmcom/codeengine
アプリケーション 'fterui-test-cli' を作成中...
ルートは最新の必要な指定を反映するためにまだ機能しています。
構成 'fterui-test-cli' は、リビジョンが準備完了になるのを待機しています。
入口はまだ調整されていません。
ロード・バランサーが準備完了になるのを待機しています。
アプリケーション状況を確認するには、'ibmcloud ce application get -n fterui-test-cli' を実行してください。
OK

https://fterui-test-cli.***
```
一番下に表示されたURLにアクセスするとアプリケーションにアクセスすることができます。確認すると正常にデプロイされていることがわかります。

```shell
% ibmcloud ce application list                                                             
アプリケーションをすべてリスト中...
OK

名前                       状況      URL                                                                              最新                             経過時間  条件      理由  
codeengine-application-57  準備完了  https://codeengine-application-57.***  codeengine-application-57-00004  93m       3 OK / 3    
fterui-test-cli            準備完了  https://fterui-test-cli.***            fterui-test-cli-00001            12m       3 OK / 3
```

もちろんUIからも確認できます。
![スクリーンショット 2021-12-23 15.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632713/eb8a2264-0d64-d722-9ca6-46bfd5fbef6d.png)


# まとめ
IBM Cloud Code Engineを使うと、イメージを用意しておけば比較的簡単にアプリケーションをデプロイできることがわかりました。次はサンプルアプリケーションではなく、実際にアプリケーションを作成してデプロイしてみたいと思います。