サーバレスプラットフォームのCode Engine(IBM Cloud)を試してみた

[IBM Cloud Code Engine](https://www.ibm.com/blogs/solutions/jp-ja/ibm-cloud-code-engine/)のベータ版のリリースがアナウンスされました:tada::tada::tada:
これは、GCPで言うところの`Cloud Run`に似た機能を持っており、コンテナ上で稼働するアプリケーションをサーバレスで稼働させることができます。ベースとなっているのは、

* Kubernetes
* Knative
* Istio
* Tekton

等となっています。特徴的なのは
> Code Engine ではソースコードをビルドパックと呼ばれるランタイム環境と組み合わせてコンテナを作成し、実行することもできるため、コンテナイメージがなくても利用が可能です。

と言うところですね。
ビルドを行うステップを飛ばしてデプロイすることができるので、きっとCI/CD周りの設定が少し楽になるのではないかな、と思います。

とりあえず新しいものは触っておけ、と言うことで[Getting started with IBM Cloud Code Engine (Beta)](https://cloud.ibm.com/docs/codeengine?topic=codeengine-getting-started)を参考に、`Node.js`でHello Worldを出してみます！
必要なのは、ソースコードのみ。**コンテナイメージを使わないデプロイ**を試してみます！

# 事前準備

## IBM Cloud のアカウントを準備する。
**ライトプランは不可**みたいです。ご注意ください。(ちなみに、β版の間は課金は内容です。(用意されているのが無料プランだけでした。))

## Container Registoryのnamespaceを用意する
下記のように好きな名前をつけてnamespaceを作っておきましょう。今回は`test-demo-code-engine`と言うnamespaceを用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/226f10b9-fcd2-c5a1-3d4c-a2ab88fa4bd7.png)

## APIキーを取得する
画面上部の管理→アクセス(IAM)→APIキーをクリックして、APIキーを生成。生成されたキーをコピーして控えておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/296906e2-d1e4-d5c3-7f29-a2c0ba113d01.png)

# Code Engineを準備する
カタログから`Code Engine`を探して開きます。下記の画面がでたら`Run your source code`を選択し、Start Creatingを押しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/cea11b54-aa81-4b83-1e60-5cd4c23014c6.png)

## プロジェクトを作成する
`create`を押すと名称の入力ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/e5268c02-100a-b87b-a810-ec057a7dbeec.png)

現在、サポートされているロケーションはダラスだけのようですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/70c47ebd-b108-86f4-7f44-27f2c27d62bf.png)


プロジェクトを作成すると下記のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/65a2eea5-d741-916d-e200-5ff6a46465c2.png)

## ビルドの詳細を設定する

`Specify build details`を押して設定を進めましょう

### ソースコードリポジトリを設定する
ブランチを設定することができます。重要なのは、`Context directory`です。実際に動かしたいソースコードが入っていディレクトリを指定してください。(デモの場合は、`/hello`となります。※必ず`/`から始まる文字列で指定してください)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/9c206580-d184-9df6-b174-51114be7e413.png)

### DockerFileの場所を指定する
デモをそのまま使う場合には、特に変更する必要はありません。`Context directory`配下のDockerFileを指定しましょう。また、使用するリソースもここで指定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/53809b23-6cb5-0faa-9dcb-8496ea96c7a4.png)

### コンテナレジストリを指定する

コンテナレジストリの参照を設定しましょう。Addを押して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/734c2ccd-22aa-dde7-e8ff-028b7ff1a0fb.png)

Registry nameには準備の時に作成したコンテナレジストリのnamespaceを入れます。レジストリサーバは、コンテナレジストリのURLです。今回はダラスに作っているので、`us.icr.io`となっています。パスワードはAPIキーです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/313586bf-1aaa-880b-5941-44d901703877.png)

`Add`を押したら最後にリポジトリ名を入れましょう。今回は`test-code-engine`としています。tagは必要に応じてつけてください。デフォルトは`latest`です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/f1145b4c-1775-f7f3-01ab-e7428fc99e9d.png)

### デプロイ
ここまで来たら画面右下の`Deploy`を押しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/829fcae9-b3fa-7cfe-b336-bacbe61f35cd.png)


# 動作を確認する
デプロイ後にはこのような`ダッシュボード`的な画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/c7d2cbcc-8a9f-e84f-cb2b-41d095ddeee0.png)

右上の`Application URL`を押すと、該当のアプリケーションを開くことができます。下記のように`Hello World`が出れば成功です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/7825f3cd-77c8-2baa-8c8d-40d7421324a1.png)

ちなみに、デモアプリケーションでは、`World`の部分が環境変数により変更可能となっています。
このように`TARGET`に指定した内容を反映することもできます。(変更を反映するためにはSave and Deployが必要です。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/21a38904-b435-0c08-9022-c2ba0e5924bc.png)

# 触ってみた感想

まだβ版と言うこともあり、機能としては最小限といったところでしょうか。(デプロイして動かすくらいしかできない)
今後は、コンテナイメージなしで動かせる利点を活かして`Pipelines`との統合などに利便性を見出せるかもしれません。もちろん、リクエスト単位での課金なのでバックアップとして持っておくと言う選択肢もありそうです！

# (おまけ)Cloud Run(フルマネージド)との差分(9/18時点)

## 利点
* ソースコードだけでデプロイが可能！Dockerイメージを用意する必要がない
* Docker Hubからもデプロイ可能
* vCPUが0.01〜8まで選べるので選択肢が広い。(Cloud Runは1か2)
* メモリも128MiBから32GiBまで選べる(Cloud Runは4GiBが上限)→ただ、サーバレスでそこまで必要か？と言う気もする

## 足りない点(きっとこれから実装されるはず！)
* リビジョンごとのトラフィックの割合の変更が簡単にできない。リビジョン毎にURLが発行できるわけでもない
* コンテナのログがみられない
* リージョンがダラスしかないのでレイテンシが気になる
* 自動スケールするときの最大数が250(Cloud Runは1,000)
* Cloud Runで言うところの、 `Serverless VPC Access Connector` がない。ローカルIPでDBなどにはアクセスしたい。
* その他いろいろ。。。