IBM Cloudの無料枠での遊び方

## 調べることにしたきっかけ
東京郊外に引っ越したくて、おすすめの物件情報を教えてくれるアプリを作ろうと思ったが、金は絶対かけたくない。
IBM Cloudを使ってどこまで無料で実現できるか知りたかったので、軽いアプリを作ったりして確かめてみました。

今回使うコードはこちらを参照ください。
[rikkyrice/tryic](https://github.com/rikkyrice/tryic)

またこの記事は、かなり細かい部分を割愛しているので、わかりにくい部分や聞きたいことがあればご連絡ください。

## 無料枠について

IBM Cloudでは一定の制約のもとであれば自由にお金を掛けずに触ることができるようです。
以下のサイトを参考にし、無料枠でどの程度触れるかを調べてみました。(2023/6月現在)
[IBM Cloud無料利用枠 - 日本 | IBM](https://www.ibm.com/jp-ja/cloud/free)

主なサービスは以下にまとめています。

| サービス | 無料利用枠 | 説明 | 対応するAWSサービス |
|-|-|-|-|
| IBM Db2® on Cloud | 200MB分のデータ・ストレージ | 強力なIBM Db2エンジンで動作するフルマネージドのクラウドSQLデータベース | RDS or Aurora |
| IBM Cloud CodeEngine | 10万vCPU秒／月 | マネージド・サーバーレス・プラットフォーム上でアプリケーション、バッチ・ジョブ、コンテナを実行できる。IBMの現従業員は対象外 | Fargate |
| IBM Cloud Kubernetes Service | 1クラスター／30日間 | ネイティブなKubernetes環境で、高いセキュリティーと可用性を保ちながらアプリケーションを実行できる。性能は低いが一連のKubernetesを用いたアプリケーションのライフサイクルを試せる | EKS |
| IBM Cloud® Container Registry | 5GBのプル・データ転送／月 | フルマネージドの専用レジストリーでDockerコンテナ・イメージを管理できる | ECR |
| IBM Cloud® Continuous Delivery | 500件のデリバリー・パイプライン・ジョブ | クラウドでGit、課題管理、CI/CDパイプライン、Eclipse Orion Web IDEを活用してDevOpsのベスト・プラクティスを実践できる | Code Pipeline |
| IBM Cloud® Object Storage | 25GB／月 | 非構造化データ向けに柔軟かつコスト効率の高いストレージが提供される。非アクティブの場合サービスが削除される | S3 |
| IBM Cloud® Functions | 500万件の実行／月 | 受け取ったイベントに応答して、定義された機能をスケーラブルに実行できる | Lambda |
| IBM Cloudant | 1GB分のデータ・ストレージ | Web、モバイル、IoT、およびサーバーレス・アプリケーション向けにスケーラブルなJSONドキュメント・データベースを提供が提供される | DynamoDB |
| IBM Cloud MQ | 1万件/月 | マルチクラウド環境において、インフラストラクチャー全体を管理しながら、卓越したスピードと信頼性、セキュリティーによるメッセージングを実現できる | SQS |
| IBM Cloud® Schematics | 無料 | Terraformをサービスとして活用し、環境全体でIBM Cloudのリソースのプロビジョニングと管理を自動化できる | Cloud Formation |
| IBM Watson® Assistant | 1万API呼び出し／月 | アプリケーションに自然言語インターフェースを追加し、ユーザーとの対話を自動化できる | Lex |
| IBM Watson® Text to Speech | 1万文字／月 | テキストから自然な話し方の音声を合成できる | Polly |

他にもAI系のサービスなど多くのサービスで無料枠がありますので、ぜひご確認ください。

## プロモーションについて

IBM Cloudでは料金がかかるサービスについてプロモーションコードを入力することでクレジットを獲得し、疑似的に無料で使えるようにできる仕組みがあるようです。  
しかし、クレジットがなくなると課金が発生するため、注意が必要となります。  
また、IBMの現従業員は対象外となります。  
プロモーションが適用できるサービスは以下があリます。(2023/6月現在)

| サービス | 無料利用枠 | 説明 | 対応するAWSサービス |
|-|-|-|-|
| IBM Cloud VPC | 1000米ドル | IBM Cloud Virtual Server for VPC, IBM Cloud Block Storage for VPCなど、IaaSサービスに適用できるプロモーション | VPC, EC2, EBS, AMI |
| IBM Cloud Object Storage | 1500米ドル | 25GB／月無料に加えて、90日間有効な1500米ドルが利用できるプロモーション | S3 |
| IBM Cloud Databases | 600米ドル | IBM Cloud Databases for MongoDB, Redis, PostgreSQL, Elasticsearchで90日間利用できるプロモーション | RDS, ElastiCache |
| IBM Cloudant | 600米ドル | 1GB分のデータ・ストレージに加えて、90日間有効なプロモーション | DynamoDB |

## 準備

IBM Cloudのアカウントを作るだけです。  
メールアドレスはなんでも大丈夫で、作った瞬間から無料枠を利用可能となります。  
ただし、クレジットカードの登録が必要であり、これがなかなか承認されず悲しい。。。(住所とかが海外の入力方式でそこが承認されにくいのかも)

## 利用方法

### Db2

遊び目的で使うようなテーブルデータだったら料金は気にせず利用できると思います。

1. ibm cloudにログインする
   1. 普通にマネジメントコンソールにログイン
2. db2サービスを作る
   1. カタログから`Db2`を探して作成する(ダラスとかじゃないと無料で作成できないです)
3. Go to UIでEditorを開く
4. SQLを流す
5. サービス資格情報を作成する

```sql
create table meibo (
  id varchar(10) not null, 
  name varchar(30) not null, 
  intro varchar(300) not null,

  primary key (id)
);
insert into meibo values 
  ('r457kb68yw', 'マイケル', '趣味はランニングです。25歳の男です。'), 
  ('hg97xzp060', 'ケビン', '36歳2児のパパです。金融関係の仕事をしています。'),
  ('6vi36q0xp5', 'ジェシカ', '19歳の女子大生です。情報工学部に所属しています。');
```

### IBM Cloud CodeEngine + Db2

これも呼び出したCPUの利用時間によって課金されますが、学習目的ぐらいでは課金されるまでの利用は気にしなくて良いと思います。

簡単な名簿アプリを作ってDb2と繋げて確認できるAPIを作ったので、それをデプロイして疎通確認してみます。

1. アプリケーションをコンテナ化してパブリックレジストリに格納する(IBM Container RegistryでももちろんOK)
   1. [このリポジトリ](https://github.com/rikkyrice/tryic)をクローンする
   2. Db2で作成した`サービス資格情報`からホスト名、ポート、データベース名、ユーザー名、パスワードをコピーして`db/settings.js`に貼り付ける
   3. `docker build -t tryic .`でコンテナイメージを作る
   4. DockerHubの自分のリポジトリにタグをつけてプッシュする(もしくはibmcloud crコマンドでICRにプッシュでも良いです。詳しくは[こちら](https://cloud.ibm.com/docs/Registry?topic=Registry-registry_setup_cli_namespace)をご確認ください)
2. CodeEngineのプロジェクトを作る
   1. カタログからCodeEngineを探す
   2. プロジェクトを新規作成する(東京でも良いです)
3. アプリケーションの作成を行い、イメージ参照に格納したイメージ名を入力する(パブリックならこれでOK、ICRなどプライベートならプルシークレットが必要)
   1. 作成したプロジェクト名をクリックし、アプリケーションの作成を押す
   2. イメージ参照にDockerHubにプッシュしたイメージ名をセットする(ICRに格納した人は`イメージの構成`を押し、作ったリージョンの名前空間とコンテナイメージを入力して完了を押す)
   3. リスニングポートは8080
4. 作成する

これで、`https://ドメイン名/meibo`でアクセスできます。  
ドメイン名は`ドメイン・マッピング`の`パブリック`で確認できます。

別途ロギングサービスを作成して紐づけることで、コンテナ内のログを出力することができます。(無料枠ではかなり使いにくい)  
またCI/CD環境の構築も可能です。  
コンテナイメージに更新があった場合は自動デプロイを制御することができます。

### IBM Cloud Kubernetes Service + Db2 + Continuous Delivery

30日間の完全なフリーのクラスターを作ってkubernetesの操作を行うことが可能です。  
secretを作ったりtemplateを作ったり永続ボリュームを作ったりすることもできるので、かなり汎用的なkubernetesの操作を実践的に学ぶことができます。

またCD/CIも無料で使えるので便利です。  
しかしドメインマッピングができないので`IPアドレス+ポート`でアクセスする必要がある点は注意が必要です。

1. GitHubにリポジトリを作成する
   1. サンプルアプリを自分のGitHubリポジトリにプッシュする
2. フリークラスターを作成する
   1. IBM Cloudのカタログから`Kubernetes`を探す
   2. フリークラスターを作成する(適当なリージョンに作成されます)
3. KubernetesクラスターはIBM Cloud Container Registryからコンテナイメージをプルしてくるので、ICRで名前空間を作成しておく
   1. カタログからContainer Registryを探す
   2. 東京リージョンに名前空間を作る(これによりICRに格納するためのコンテナイメージは、prefixに`jp.icr.io/名前空間`をつける必要があります)
4. DevOpsからツールチェーンを作成する
   1. クラスタビューからDevOpsをタップし、`ツールチェーンの作成`を押す
   2. `Kubernetesアプリの開発`をタップ
   3. リージョンは`東京`、ソース・プロバイダーは`GitHub`で、自分のGitHubアカウントを認証する
   4. リポジトリー・タイプは`既存`として、自分のGitHubリポジトリーを選択する
   5. Delivery PipelineのIBM Cloud APIキーを新規作成する
   6. Container Registryリージョンは`東京`を選択し、クラスター名前空間は`default`とする
   7. 最後にツールチェーン名を`tryic-tc`などに変更する
5. パイプラインの各ステージの構成を変更する
   1. `ci-pipeline`をタップする
   2. `CONTAINERIZE`ステージの`ステージの構成`を押し、`Build container image`ジョブの`ビルド・スクリプト`の以下を修正する
      1. `source <(curl -sSL "${COMMONS_HOSTED_REGION}/scripts/build_image_buildkit.sh")` -> `source ./scripts/build_image_buildkit.sh`
   3. `DEPLOY`ステージの`ステージの構成`をおし、`Deploy to Kubernetes`ジョブの`デプロイ・スクリプト`の以下を修正する
      1. `source <(curl -sSL "${COMMONS_HOSTED_REGION}/scripts/check_and_deploy_kubectl.sh")` -> `source ./scripts/check_and_deploy_kubectl.sh`
   4. デプロイをし直すため、`BUILD`ステージの再生ボタンをタップする
6. デプロイが完了したらDeploy to KubernetesのログにアクセスURLが載っている
   1. `DEPLOY`ステージの`ログ及び履歴の表示`を押す
   2. 一番下までスクロールすると`http://{パブリックIPアドレス}:{ポート}`形式でアクセスURLが載っているのでタップ

これで疎通ができます。  

ローカルにCLIをインストールするとKubernetesの操作がCLIでできるようになりますので、ぜひお試しください。  
IBM Cloud Shellを使ってブラウザでの操作も可能です。

### IBM Cloud Object Storage + IBM Cloud Functions + Cloudant

IBM CloudのオブジェクトストレージであるICOSに静的WEBサイトをアップロードし、IBM Cloud FunctionsをWEBアクションとして呼び出すことで簡単なアプリケーションを作成することができます。  
`html+js`のファイルを`index.html`という名前でアップロードすることで閲覧できるようになります。

また、CloudantというNoSQLのデータベースと繋いでデータの閲覧を制御してみようと思います。

1. Cloudantリソースを作成する
   1. カタログから`Cloudant`を探す
   2. Liteプランでリソースを作成する(Liteプランは一つしか作成できません)
2. データベースを作成、ドキュメントを作る(json)
   1. `Launch Dashboard`をタップ
   2. `Create Database`をタップし、`meibo`という名前をつける
   3. `Create Document`をタップし、`icos/data.json`の各要素を一つずつ作成する(ブラウザでの操作ではBulkオペレーションができないので、jsonをそのまま貼り付けても全要素が作成されません)
3. サービスの資格情報を作成して、API KeyとURLをメモしておく
   1. `サービス資格情報`をタップし、`新規資格情報`を作成する
   2. 資格情報のうち、`apikey`と`url`をメモする
4. IBM Cloud Functionsに名前空間の設定をし、アクションを作成する
   1. カタログから`Cloud Functions`を探す
   2. `名前空間の設定`から名前空間を作成する
   3. `アクション`から`作成`を押し、`アクション`を選択する
   4. `ランタイム`は`node16`として作成
   5. `icos/cf.js`をコピーし貼り付ける
   6. `CLOUDANT_URL`に先ほどコピーした`url`を貼り付ける
   7. `CLOUDANT_APIKEY`に先ほどコピーした`apikey`を貼り付ける
   8. 保存する
5. Webアクションを有効にしてパブリックURLをメモしておく
   1. `エンドポイント`タブから`Webアクションとして有効化`を押して保存する
   2. `パブリックURL`をコピーする
6. index.htmlでAPIリクエストを送っているjavascriptのURLを書き換える
   1. `icos/index.html`の62行目のURLを`パブリックURL`に書き換える
7. ICOSリソースを作成し、バケット作成から静的Webサイトのホスティングを選択し、index.htmlをアップロードする
   1. カタログから`Cloud Object Storage`を探す
   2. `Lite`プランを選択して作成する
   3. `バケットの作成`をタップし、`静的Webサイトのホスティング`をタップする
   4. `パブリックアクセスの有効化`を`オン`にして、`次へ`を押す
   5. `icos/index.html`をアップロードする
   6. バケットを作成すると、`静的Webサイト・ホスティング`にエンドポイントが切られているのでアクセスする

これで疎通できます。

そのほか色んな関数をデプロイして、`html+js`で呼び出すことで簡単にアプリを構築できます。

### LINE Messaging API + IBM Cloud Functions + Cloudant

HTMLを書かなくても、`LINE Messaging API`と繋ぐことで、リッチなデータ管理アプリケーションを瞬時に構築することができます。

作り方は簡単で、`LINE Messaging API`のアクションに`Cloud Functions`のパブリックURLを指定するだけです。  
ユーザーからのチャットをルーティングし、必要なデータを`Cloudant`からクエリしてきて、返すだけでデータの管理ができます。

私は、suumoから物件情報をスクレイピングしてCloudantに条件に合致したデータを保存する関数を、バッチとしてデプロイし、  
LINE Botに`おすすめ物件を見せて`と送ることで楽々確認できるアプリを作ったりしています。

全て無料でできるので、ぜひ試してみてください！

## 参考

[IBM Cloud無料利用枠 - 日本 | IBM](https://www.ibm.com/jp-ja/cloud/free)