IBM Cloud Code Engine の無料利用枠を効果的に使う

## はじめに
IBM Cloud には [Code Engine](https://www.ibm.com/jp-ja/cloud/code-engine) というフルマネージド型のサーバーレス・プラットフォームが存在します。
こちらのサービスは従量課金制にて提供されており、毎月割り当てられる無料利用枠を超過すると課金が発生します。
![スクリーンショット 2022-07-28 12.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/aaf55697-129c-faa9-880e-b7105f0343ae.png)
[料金体系ページより](https://www.ibm.com/jp-ja/cloud/code-engine/pricing)

無料利用枠にある`着信要求`項目は`1か月あたり100,000件のHTTP要求`という記載がありイメージしやすかったのですが、他項目の`CPU: 10万vCPU秒/月`と`メモリー: 1か月あたり200,000 GB秒`に関しては、実際のところどれほど無料で利用できるのか具体的にイメージできなかったため少し調査してみました。


## 最小and最大インスタンス数: 1 / vCPU: 0.5個 / メモリ: 1GB 構成の場合
まずは、HTTP要求を受け付ける一般的なWebアプリケーションを上記構成のCode Engineに実際にデプロイして確認してみます。
デプロイするアプリとして Code Engine のサンプルアプリとしてOSS提供されている以下のアプリを採用します。
https://github.com/IBM/CodeEngine/tree/main/hello

Code Engineの`アプリケーションの作成`設定画面に遷移し、ソースコードからビルドする形式を選択、そして`ビルド詳細の指定`として下記のように入力します。
![スクリーンショット 2022-07-28 12.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/988d391d-36f7-84d7-60ef-affc44e7adb8.png)


今回のアプリは`listen ポート`などはデフォルトのままで動作するため、空欄のままでOKです。

あとは`ランタイム設定`にて今回確認したい構成を指定して、
![スクリーンショット 2022-07-28 12.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/148fde5c-c47c-ff0d-9bc8-aa6cad014ec2.png)

最後に右カラムの`作成`ボタンを押下するとデプロイが開始されます。
![スクリーンショット 2022-07-28 12.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/4424afd4-4b64-65a8-fff6-260299362b87.png)

少し待つとデプロイが完了し、右上にある`アプリケーションのテスト`ボタンから作成されたエンドポイントに対してHTTPリクエストを送ることができます。
![スクリーンショット 2022-07-28 12.54.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/87be6d2b-8827-770b-8596-4be2b0910d80.png)

無事にデプロイできていそうです。お手軽で良いですね。
![スクリーンショット 2022-07-28 12.55.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/c8f83424-6873-83dc-d234-ba747ea09aee.png)

今回デプロイしたアプリケーションのOverviewページを見てみると、下記のように表示されています。
![スクリーンショット 2022-07-28 12.57.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/74d45a26-d2e0-43c0-67a3-e37b2c170c12.png)

これはつまり、今回のアプリケーション作成時に設定した通り、最小インスタンス数として指定した1インスタンスが起動中、インスタンスが起動しているのでvCPUを0.5個使用中、メモリを1GB使用中、ということを表しています。
最大インスタンス数も最小と同様に1を指定しているため、このアプリは基本的にはこの状態を維持することになるのかなと思います。

これであればvCPU/メモリの使用量をシンプルに計算できそうです。

e.g. 上記構成における1日の使用量
* vCPU
  - 1(インスタンス) * 0.5(vCPU) * 60(秒) * 60(分) * 24(時間) = 43200(vCPU秒)
* メモリ
  - 1(インスタンス) *　1(GB) * 60(秒) * 60(分) * 24(時間) = 86400(GB秒)

（実際にはアプリケーションのビルド時にもvCPU/メモリは使用されますが、それらはアプリケーション作成時に設定した`ランタイム設定`とは別枠にて計算されます。今回はまずシンプルに概算したいため上記計算には含めていません。ビルド時の価格設定に関しての詳細は[こちら](https://cloud.ibm.com/docs/codeengine?topic=codeengine-pricing#build-pricing)をご確認ください。)

では、Code Engne の無料利用枠はどれほどだったかとふりかえってみると下記の通りでした。

* vCPU
  - 100000(vCPU秒/月)
* メモリ
  - 200000(GB秒/月)

ということで、今回の構成のままアプリを使い続けると、vCPU/メモリ共におおよそ下記の日数にて毎月割り当てられる無料利用枠を使い切ることになりそうです。

* vCPU
  - 100000 / 43200 = 2.31481481(日)
* メモリ
  - 200000 / 86400 = 2.31481481(日)






## 最小インスタンス数: 0 / vCPU: 0.5個 / メモリ: 1GB 構成の場合
もう少し長い期間を無料で利用できるとうれしいため、今度は最小インスタンスを0にしてみます。
最小インスタンス数以外は先程と同じ設定にして、また新たにアプリケーションをデプロイします。
![スクリーンショット 2022-07-28 14.20.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/37a80747-3ff8-8e7e-c1a2-0eba712ace54.png)

前回同様に少し待つとデプロイが完了し、ブラウザからエンドポイントにアクセスすることで、こちらも前回同様に`Hello World`を確認できました。
今回新たにデプロイしたアプリケーションのOverviewページを見てみると、下記の表示となっており、インスタンスは起動した状態です。
![スクリーンショット 2022-07-28 14.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/c3bcc0f4-e941-f131-f24f-62bf0cb881b9.png)

暫く何もしないで放置していると、インスタンス数が0になりました。
合わせてvCPU/メモリも0になり、全くそれらを使用していない、という状態です。
![スクリーンショット 2022-07-28 14.31.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/3cf5707d-36f4-5319-07fe-8023202bf2f4.png)

インスタンスが一つも起動していない状態で、HTTP要求を送ってみます。今回は応答時間も確認したいため、`要求の送信`ボタンを押下します。
![スクリーンショット 2022-07-28 14.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/6672d8de-d2bf-6c58-eed7-1522390b6667.png)

すると、少し待つ必要がありますが、12107ミリ秒後にレスポンスが確認できました。
![スクリーンショット 2022-07-28 14.35.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/79a353d3-741f-afa3-b5ab-9517d0d15aa4.png)

起動インスタンス数も1になりました。
![スクリーンショット 2022-07-28 14.35.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/1554f6cc-4f50-1d70-c930-f5474f4f4781.png)

インスタンスが起動している状態で、`要求の送信`ボタンを押下してみると467ミリ秒後にレスポンスが確認できました。
![スクリーンショット 2022-07-28 14.38.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47437/bee03a1b-7a21-1ddb-6f5f-a741a3d40443.png)

そして、また暫く放置するとアクティブなインスタンス数は0になります。
これで、リクエストがある時間帯のみインスタンスが起動する(=リクエストが無い時間帯はvCPU/メモリを使用しない)、という構成にできました。
インスタンス未起動時に発生したリクエストへの応答は遅くなってしまいますが、稀にしか使わない、初回リクエストへのレスポンスは遅くても良い、というような要件のアプリであれば、vCPU/メモリ使用量をかなり抑えることができ、用途によっては毎月の無料利用枠のみでの運用も現実的かと思います。
（毎月の無料利用枠を超過したとしてもリーズナブルなお値段体系だと思うので、気にしすぎずカジュアルに利用していけると良さそうです)






## おわりに
今回の調査によって、Code Engine の無料利用枠のボリュームがどれほどなのか、どうすると効果的に使えるのか、という点をイメージすることができました。
Code Engine は個人的にお気に入りなサービスとなりそうなので、引き続きいろんな用途で活用していきたいと思います。