IBM Cloud Foundryが使えなくなったのでIBM Cloud Code Engineにデプロイするまでメモ


IBM Cloudで元々CloudFoundryを利用してNode.jsアプリケーションをデプロイしてました。

少し前からアラートはありましたが、2023年5月31日で完全に使えなくなった模様で6/1になった途端に動かしていたアプリケーションが止まってしまいました。

> ![スクリーンショット 2023-06-09 3.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/7f1f50bd-7aa2-3d3e-1f20-c3a753efd036.png "スクリーンショット 2023-06-09 3.48.25.png")
> https://cloud.ibm.com/docs/cloud-foundry-public?topic=cloud-foundry-public-ha-dr&locale=ja#:~:text=IBM%C2%AE%20Cloud%20Foundry%20%E3%81%8C,%E6%97%A5%E3%81%AB%E8%A1%8C%E3%82%8F%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

変わりを調べるとIBM CloudのCode Engineというサービスにデプロイするのが良さそうな雰囲気だったので、調べて試してみました。


ということで試していきます。

## IBM Cloudコマンドのインストール

まずはCLIツールのインストールが必要です。

IBM Cloudを色々なプロジェクトで使うというよりも特定のプロジェクトで利用することがあるので、ローカルPCに環境を作るよりも特定のプロジェクトに紐づいたGitHub Codespaces環境にインストールしていきます。

https://cloud.ibm.com/docs/cli?topic=cli-getting-started

GitHub Codespacesの環境はLinuxになるので以下で完了です。

```bash
curl -fsSL https://clis.cloud.ibm.com/install/linux | sh
```

バージョンの確認

```bash
$ ibmcloud -v
ibmcloud version 2.16.0+492aff3-2023-04-06T16:13:44+00:00
```

最初だけですが比較的簡単にインストールできました。

## --ssoオプションでログイン

CLIにログインします。
`--sso`オプションでワンタイムパスコードを使いました。

他のやり方でも良いと思いますが、これが最初に成功したのでこちらでメモしておきます。

```
$ ibmcloud login --sso

API endpoint: https://cloud.ibm.com

Get a one-time code from https://identity-1.ap-north.iam.cloud.ibm.com/identity/passcode to proceed.
Open the URL in the default browser? [Y/n] > y
The browser cannot be launched. Copy the URL and paste it into your browser window to get the one-time code.
One-time code > 
```

とこんな感じでコードを入力するプロンプトがでます。

GitHub Codespaces環境なのでデフォルトブラウザなどはなく、`The browser cannot be launched`と表示されますね。

IBM Cloudのコンソールにログインして、ユーザー設定の`CLIとAPIにログイン`を押します。

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/69066078-4182-13f8-2180-6fe27a74adc9.png" width="250px">

以下のようなワンタイムパスコードが表示されるのでターミナルに貼り付けてログインします。
 
> ![スクリーンショット 2023-06-06 3.08.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/41c152bc-932b-ad5f-16e5-c69825e80acb.png "スクリーンショット 2023-06-06 3.08.03.png")

問題なければ以下のような表示になりログインできます。

```
Authenticating...
OK

Targeted account sugawara nobisuke's Account
```

次に

```
Select a region (or press enter to skip):
1. au-syd
2. in-che
3. jp-osa
4. jp-tok
5. kr-seo
6. eu-de
7. eu-gb
8. ca-tor
9. us-south
10. us-east
11. br-sao
Enter a number> 
```

と出ますがとりあえず何も選択せずにエンターキーでスキップします。

## Code Engineのプラグインをインストールする

https://cloud.ibm.com/codeengine/cli

こちらのページにある通りに進めます。

以下でプラグインのインストールです。

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

インストールが問題なくできたか確認

```
$ ibmcloud plugin list
Listing installed plug-ins...

Plugin Name       Version   Status   Private endpoints supported
code-engine[ce]   1.43.5             true
```

1.43.5のバージョンがインストールされた模様です。

```
$ ibmcloud ce help
```

を実行すると以下のような出力になります。ceがCode Engineの略称みたいですね。

```
NAME:
  code-engine, ce - Manage Code Engine components
```

## Webコンソールからプロジェクトの作成

CLIから全てやっても良いと思うのですが、イマイチイメージが掴みにくかったのでプロジェクト作成はWebから進めてみました。

Code Engineのサイトから作成を押して進みます。

> https://cloud.ibm.com/codeengine/projects
> ![スクリーンショット 2023-06-09 3.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/99e6076f-22ab-99c9-4908-189edd0e5cde.png "スクリーンショット 2023-06-09 3.57.45.png")

ロケーションを選び、名前を付けて作成します。リソースグループはdefaultのままで大丈夫です。

> ![スクリーンショット 2023-06-09 3.58.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/ef6281e7-1779-ca50-a38f-3ee9ea57ae61.png "スクリーンショット 2023-06-09 3.58.27.png")

作成に数秒かかり、少し待つと以下のような表示になります。

> ![スクリーンショット 2023-06-09 3.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/41be3f8d-4154-a31e-4554-cb7c965b3ef8.png "スクリーンショット 2023-06-09 3.59.28.png")

一旦これでプロジェクトを作ることが出来ました。

実際のアプリケーションはプロジェクトの中に紐づく単位となります。


- プロジェクト
	- アプリケーション（Webアプリなど）
	- ジョブ（定期実行タスクなど）

という構成になっている模様です。

## CLIでアプリケーション作成前準備

ここからCode Engineでアプリケーション作成前の準備になります。

https://cloud.ibm.com/docs/codeengine?topic=codeengine-install-cli

- リージョン指定
- リソースグループ指定
- プロジェクト指定

の3つの設定になります。

### 1. リージョン指定

リージョンを指定する必要がある模様です。

先ほどスキップしましたが、Code Engineでテストアプリケーションなどを作成してみます。

東京リージョンでプロジェクト作成した場合`jp-tok`というIDがロケーションに表示されてると思います。

> ![スクリーンショット 2023-06-06 3.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/190b5e7d-99a2-f5c7-2624-3721027462f9.png "スクリーンショット 2023-06-06 3.11.15.png")

```bash
$ ibmcloud target -r jp-tok
```

特にエラーが出なければOKです。

```
Switched to region jp-tok


                   
API endpoint:      https://cloud.ibm.com
Region:            jp-tok
User:              xxxxxxx@gmail.com
.
.
.
略
```

といった出力になります。

### 2. リソースグループの指定

リソースグループも指定する必要がある模様です。

以下でリソースグループを調べます。

```bash
$ ibmcloud resource groups
```

以下のようにリソースグループが表示されます。

```bash
Name      ID                                 Default Group   State
default   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   true            ACTIVE
```

defaultしかない場合は以下のように設定できます。ID指定でも大丈夫そうでした。

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

### 3. プロジェクトの指定

登録されているプロジェクトの一覧を表示してみます。

```
$ ibmcloud ce project list
```

僕の場合mybotというプロジェクトを作ってたのでこのような表示になりました。

```
Name            ID                                    Status  Enabled  Selected  Tags  Region   Resource Group  Age  
mybot     xxxxxxxxxxxxxxxx  active  true     false           jp-tok   default         161m  
```

プロジェクトの選択をします。`mybot`という名前だったので以下のような指定にしました。

```
$ ibmcloud ce project select --name mybot
```

## アプリケーションの作成とデプロイ

n0bisukeBotという名前でアプリケーションの作成を行います。

（ここまでの名前付けだとmybotプロジェクト内にn0bisukeBotというアプリを作成します。)

デプロイ方法はいくつかありましたが、 **ローカルのソースコードを直接デプロイ**する方法を試してみます。

> 参考: https://cloud.ibm.com/docs/codeengine?topic=codeengine-app-local-source-code

```
$ ibmcloud ce application create --name n0bisukeBot --build-source .
```

特にエラーもなくデプロイできました。。 だいたいエラーでたりする印象ですが一発でいけました。

## デプロイ後の操作など

### アプリケーションの更新

アプリケーションの更新をする際には`ibmcloud ce application create`ではなく`update`を使えば良いみたいです。

```
$ ibmcloud ce application update --name n0bisukeBot --build-source .
```

簡単ですね。

### 環境変数の登録

CLIから環境変数の登録ができます。トークンなどを入れておけます。

```bash
$ ibmcloud ce application update --name n0bisukeBot  --env TOKEN=xxxxxx
```

## お金をケチりたいのでミニマム構成にしてみる。

Code Engineはデフォルトで作成すると4GBくらいのメモリになり、ちょっとオーバースペックになります。

最小構成ではメモリ0.25GB、0.125 vCPUの指定ができますが、CLI経由じゃないとこの組み合わせは選べないかもしれません。createで作成する際に以下のようにオプションを指定して作成することでミニマム構成にできます。

> 参考: https://cloud.ibm.com/docs/codeengine?topic=codeengine-mem-cpu-combo

```bash
$ ibmcloud ce application create --name n0bisukeBot  --build-source . --max-scale=1 --memory=0.25G --cpu=0.125 --min-scale=1
```

また、`--min-scale`を0にすることで、アクセスが無い時にはスリープ状態になって全くお金が掛からない状態にもできました。僕が試したときには2分~3分くらいでスリープ状態(インスタンス0)になっていました。

逆に起動させっぱなしにしたい場合は`--min-scale`を1にしておけば、常時1つのインスタンスが立ち上がっていてスリープが無い状態も作れそうでした。

Code Engineの無料枠の計算がイマイチよくわかってませんが、以下の記事でもあるように特定の時間だけ立ち上げておいて夜間はスリープ状態にするような仕様のアプリケーションにしておけば月毎の無料枠内でも収まるかもしれません

> 参考: https://qiita.com/shikato/items/456c643d57e2d14f022f

## 所感とまとめ

意外と簡単にデプロイまですることができました。

どこでそんなに使ったか不明ですが半日くらい動かしてみて331円かかっていました。途中のテストデプロイ時などにメモリなどをリッチなインスタンスを作ってしまって一気に無料枠を超えてしまったのかな... とか予想しています。

無料枠で結構使えるような気はしていますが、少しでも金額かかるのが気になる人にはあまりおすすめできないかもしれません。

> ![スクリーンショット 2023-06-09 4.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/45682126-c924-618c-5f0f-e308201cbedf.png "スクリーンショット 2023-06-09 4.13.09.png")

## 2023/7/14に追記: 結果0円だった

割とすぐ止めたのもありますが、結果無料枠内だったから0になったのかわからないですが、7月に入ってから6月分を確認したら0円でした。0円でどこまでいけるのかな。。。

> ![スクリーンショット 2023-07-14 0.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/78ce97e5-3f1a-90a4-d4c7-0cd9a5971d16.png "スクリーンショット 2023-07-14 0.10.17.png")

誰かの参考になれば幸いです。