JavaマイクロサービスアプリケーションをIBMのサーバーレスにデプロイする

こんにちは。職業「戸倉彩」です。
今回は、IBMのパブリッククラウドのサービスの一つとして提供されている **IBM Cloud Code Engine** を使用して、サーバーレスプラットフォーム上にJavaマイクロサービスアプリケーションを構築する方法をご紹介します。

# IBM Cloud Code Engineとは
IBMが、IBM Cloud上で提供しているフルマネージドのサーバーレスプラットフォームで、アプリケーションをKubernetesベースのインフラストラクチャー上にデプロイし、管理することができるサービスです。Code Engineが、インフラストラクチャーの処理を行ってくれるので、Kubernetesや、Kubernetes環境で簡単にサーバーレスを実現できるKnativeなどについて知識がなくても問題ありません。ユーザーが、アプリケーションをホスティングするための環境構築ではなく、アプリケーションのコードを書くことにとことん集中できるように設計されています。

IBM Cloud Code Engineで採用しているオープンソース・テクノロジーは下記の通りです。　

  * [Knative](https://knative.dev/)
  * [Kubernetes](https://knative.dev/)
  * [Istio](https://istio.io/)
  * [Tekton](https://tekton.dev/)
 
Code Engineのアーキテクチャについてより詳しく学びたい場合には、[「Code Engine のアーキテクチャーとワークロードの分離について」](https://cloud.ibm.com/docs/codeengine?topic=codeengine-architecture&locale=ja)サイトをご覧ください。

# IBM Cloud Code Engineを利用するために必要なもの
#### 1. Webブラウザ
IBM Cloudの管理用のダッシュボードにアクセスするために必要となります。公式サイト[「IBM Cloudの前提条件」](https://cloud.ibm.com/docs/overview?topic=overview-prereqs-platform&locale=ja)では、Chrome、Firefox、Edge、Safariの最新バージョンもしくは1つ前のバージョンの使用を前提条件としています。

#### 2. IBM Cloud 従量課金アカウント (またはサブスクリプション契約)
IBM Cloudアカウントをお持ちでない方は、[IBM Cloudカウント作成サイト](https://cloud.ibm.com/registration)からアカウント作成を行った後、クレジットカード登録を行って従量課金アカウントにアップグレードを行ってください。  
>3分程度の解説動画によるアカウント取得方法も公開されています。下記リンクからご参照ください。
>・ [IBM Cloud のライトアカウントを作成しよう](https://youtu.be/Krn1jQ4iy_s)  
>・ [従量課金アカウントへのアップグレード](https://youtu.be/uFCSvAKapr0)



# サンプルアプリケーションをセットアップする
ここからは、GitHub上で公開されている **「IDおよびアクセス管理（IAM）フレームワークで保護された記事を表示するサンプルアプリケーション」** をIBM Cloud Code Engineの上に構築するまでの流れをご紹介します。
## **構成イメージ**
* JavaScriptとVue.jsのコードをブラウザに提供するフロントエンドのWebアプリケーション(Web-app)があります
* ブラウザで実行されているWebアプリのコードは、Web-apiマイクロサービスのREST APIを呼び出します
* 一方、Web-apiマイクロサービスは、Articles(記事)マイクロサービスのREST APIを呼び出します
* Keycloakは、このマイクロサービスベースのアプリケーションのIAMに使用されています  

#### 使われているテクノロジー
  * [Microservices architecture](https://en.wikipedia.org/wiki/Microservices)
  * [Keycloak](https://www.keycloak.org)
  * [Jakarta EE](https://jakarta.ee/)
  * [MicroProfile](https://microprofile.io/)
  * [Quarkus](https://quarkus.io/ingress)
  * [Vue.js](https://vuejs.org/)
  * [NGINX](https://www.nginx.com/)
  * [git 2.24.1以降](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
  * [yarn 1.22.4以降](https://yarnpkg.com)
  * [Node.js v14.6.0以降](https://nodejs.org/en/)
  * [Apache Maven 3.6.3](https://maven.apache.org/ref/3.6.3/maven-embedder/cli.html)

<img src="https://developer.ibm.com/developer/default/tutorials/deploy-a-java-microservices-application-to-ibm-cloud-code-engine/images/architecture.png" width="600">

## 1. Code Engineプロジェクトを作成する
1. [**「IBM Cloudにログイン」**](https://cloud.ibm.com/codeengine/projects)にアクセスし、 **IBMid** (アカウント作成時に登録したメールアドレス)と **パスワード** を入力してログインする  
<img src="https://bl6pap004files.storage.live.com/y4mUb7BwsC_2Ljo9zcqiLZHUod2_Fb4TzAnKrhLi7kylfCEtMFOK0QKjDYqcu2i_VP6-dlvZHnu2yPCEkNbgj9Wp91dIjVcyDQvhEWtwpXDRu5gMuHhupSmcYF7dDsUEY_F44byzfV0o2SGwVkwZSq9SvEoQPWJu2l_NDM8k1zfv8mHnkZHpobYYweTxVEPOPRa?width=1330&height=782&cropmode=none" width="600">  
2. **「IBM Cloud Code Engine」** の **「プロジェクト」** ページが表示されたら **[作成]** ボタンをクリックして、プロジェクトを作成する  
<img src="https://bl6pap004files.storage.live.com/y4mRpPtx2e6qlF1zfGa_wy9SiDJrwLE9RtpI635Z5S9n-pE3zLxEAnZc8bNUA_xdtyl0npK4zyO_EQ6uEq8SZLM10bSQ9baK0BhM_-MCnY6tr0MOVhE6_-njPESpvamFJvlvP6JhGjT4Xtru6Lr4RrQzusCUIceQwwtoAcXef9qk5nBAtJkNQZcZIi4-U6HqJ0R?width=1324&height=730&cropmode=none" width="600">
3. **「プロジェクトの作成」** ページで必要項目を入力し、**[作成]** ボタンをクリックする
 * ロケーション: ダラス(us-south)
 * 名前: ユニークなプロジェクト名 ※サンプルでは`cloud-native-starter-demo` とつけました
 * リソース・グループ: Default
<img src="https://bl6pap004files.storage.live.com/y4mAMQmPL-OsVanKaYfr47sffOxIPmrl3ex1D5q3PM3DwYO7w1oc1o4JB12C6rdS6YCpln10-uCrXuIBx9uF-Z2chkaoBgDUuz4SbCboj_8q_j-WSf-PJFxIQ1PDYT-9BgGZyCdenQY63oE2IwMpxKu0uO4SkXgnuVf0dvVfeLGwb8eNAhkS0-P9ceovRrw_vf1?width=1224&height=902&cropmode=none" width="600">
4. **「プロジェクト」**ページに作成したプロジェクト名が表示され、**[状態]** が **アクティブ** になっていれば成功です  
<img src="https://bl6pap004files.storage.live.com/y4mEeJFek9NHVdkuFtDQ5w3BG1LpCVrzLgHMRfybHlbvtEiR10kHEw4XXfbYqa_-QDHjcFSRSon64UoltQ5Zo-Ip2B1PKxPHUaKAS3b5KzyDEY79zhbq2CI5zvA-7H9Yrb5vGodmEmo1HNruVJqL2k0BTy4BjMhVXQF2z0mH81TEUl8iiwcTWaOpAqywDpSV1iI?width=1784&height=508&cropmode=none" width="600">

## 2. IBM Cloud Shellを操作してみる
**IBM Cloud Shell** は、IBM Cloudで提供されているワンクリックで使用できるブラウザーベースのシェル環境です。

1. IBM Cloud画面右上の **IBM Cloudシェル** アイコンをクリックする
<img src="https://bl6pap004files.storage.live.com/y4m-S0HcaGEPRbaPUy-zcbHxq4oBJT6DFOPMiVGy8v6zWG5T4_WyI3Is19A-oDYn0HbYpXgp_2FOV5r8D-l3Bu8BxDp2dOE4YYwWN2_rMo-1-JTNfTQxPIEdYJJJaqTj7eGHl5VyKU3K_KApgH-FTRF60njDoQu183Rt47lYTmySsR0GfRcltpvSZ9AyEHrNeIM?width=704&height=308&cropmode=none" width="400">
> MEMO: IBM Cloudシェルのセッションは、1時間操作がない場合に自動終了します

2. **「IBM Cloud Shell」** 画面が開き、**xxx@cloudshell:~$** が表示されていることを確認する
<img src="https://bl6pap004files.storage.live.com/y4m_LyL06ifSf7JTx9Hipa4snpkYJVnhqTBycNZiCiggy09zGUZoRFORkNlZdzMM999evMFgu0S83QJd2eFbMUI8cN-coIBmvpdoRXsZmo-bjoAw6DjFqSl6xdkp6JXNCNSf9l3iQZ2gJOIyq8YZY0SdsOx2Q4kh8jhgkdvNAm96LUZ9srruSgr40zB4_H60Hpn?width=1628&height=468&cropmode=none" width="600">
3. ロケーションを **[ダラス(us-south)]** に変更する
<img src="https://bl6pap004files.storage.live.com/y4mMdeGLNtIpcqgpenS5jKKJTp9dTpMjL-r4U4Qd-ZpTpXmB99lsI_smYuNbolHT1OoNy3ljCzLJhxk3BPpW9EV1Zvohj2O7Zf2by9gIhTWM0uXnstZDFOA-S-g-gIcL2JN1O8zIkzOLAJS0Dtq5cbPqgRQqjzTAGO-shxuoN3gJx25PEYBuoo2lhfQ8v8AODoT?width=1444&height=764&cropmode=none" width="600">

## 3. サンプルアプリケーションをデプロイする
1.下記のコマンドを実行して、GitHub上のプロジェクトをクローンする

```sh
git clone https://github.com/thomassuedbroecker/ce-cns.git
cd ce-cns
ROOT_FOLDER=$(pwd)
```
2.環境変数を設定するコマンドを実行する
> この時、`cloud-native-starter-demo` の部分は、3番の手順でご自身が作成したプロジェクト名と置き換えてコマンド実行してください

```sh
export MYPROJECT=cloud-native-starter-demo
```

3.下記のコマンドを実行してbashスクリプトを実行する

```sh
ibmcloud target -g Default
cd $ROOT_FOLDER/CE
bash ce-deploy-apps.sh
```

4.bashスクリプトの実行結果の最後の4行に、`Web-App` のリンクが含まれていることを確認する 

## 4. ブラウザでサンプルアプリケーションを開く
1. ブラウザで上記のWeb-Appリンクにアクセスし、`user: alice`と`password: alice` でログインする  
<img src="https://bl6pap004files.storage.live.com/y4mFBINltpT1PVRIHZMIy6qHeNeitMqufoHbTI1Di3CkeWKtKkY3EvjibRJFW_avA2-q2TwUrm42rm1tH9NOMyNY17DW5NWjl7aIsuOZWNU1AYDzVGGwbH1DfnP7oe_uFPZwRZR3k8ywZNYZLUGYkivxBoIDjP2-7AvlUIiElImtGgPgUX3bX9aV_BW-N4MOVpg?width=1007&height=594&cropmode=none" width="600">
2. ログイン直後は、今回はIBM Cloud Code Engineがアプリケーションにアクセスがあったタイミングで0からスケールを行う設定になっているため、起動に時間を要して **「timeout」** になる可能性があります  
<img src="https://bl6pap004files.storage.live.com/y4mK4NH_kDuxB9zJzIF9xRnKDKED3ht_yHjM6c4eLNmICnmLVcyTXdKFY_S96J3u5CYOigX9FrBF-4q5zijmwVl3CtUsDfVbIuosxq0zHCN-xcME6CAniGUFnoKgSCUh_TKIo6EJjmVlVSSTTQWwvjHBPOJKoGj3vYV6oyYVatiq9-HVZJ7rFY2qzgYWq7jwLCS?width=1712&height=632&cropmode=none" width="600">
3. しばらくしてブラウザをリロードするとページが表示され、 **Articles**(記事) が表示されば成功です　　
<img src="https://bl6pap004files.storage.live.com/y4m0LGto7GXtgj69sWd3OK55Q33ufD89zh8U6hoCqvFxuZRjRYZdJ6S11FAeG7u9tR--WapgtPRI6A-VBmPITvFhsbXOBESCMqLANWyQQUb5TRftuOQ1LzjLn_qZF99eR1O8YgCz92UVvsyILtOzvied2D7HnDapSHRacqENm3hZSRAbfOmtpX9U4zUH7q49RRS?width=1488&height=724&cropmode=none" width="600">

操作手順は以上となります。

### おまけ
裏側のコンテナ周りがどうなっているのか知りたい場合には、IBM Cloud Shellでコマンド実行した際の出力結果や、Kubernetesのコマンド(kubectl)でいろいろ確認してみると理解することができます。ただし、マネージドサービスであるためすべての情報を取得できるわけではありません。

podの一覧を表示するコマンド

```sh
kubectl get pod
```

Serviceの一覧を表示するコマンド

```sh 
kubectl get svc
```
表示サンプル
<img src="https://bl6pap004files.storage.live.com/y4mQLO7zMtrV3Ve9gcYlJR1zSjC5qfr_JylHG7UynfjYqaximRfNNsbQNZ2TC2AObkaQLa-aw9maKgPo-jzuf22yQOheE-GJwL7UNuf6lIdsAJq2zzPknfUsmIY_PDGOiz3Vw04l4J7WLVk6ZGXprsxuQyTLSy3DSd2jm0WB8yqNRX8qKxucuRZU_bpwGv4jlJY?width=1684&height=356&cropmode=none" width="600">

# 参考情報
* [IBM Cloud Code Engine 公式サイト](https://www.ibm.com/jp-ja/cloud/code-engine)
* [IBM Cloud Code Engineお役立ち情報 - IBM Cloud News](https://www.ibm.com/blogs/solutions/jp-ja/ibm-cloud-code-engine-useful-information/)
* [IBM Cloud Code Engine - IBM Cloud 資料](https://cloud.ibm.com/docs/codeengine?topic=codeengine-getting-started)
* [Workshop: Deploy a Java microservices application to IBM Cloud Code Engine - IBM Developer](https://developer.ibm.com/tutorials/deploy-a-java-microservices-application-to-ibm-cloud-code-engine/)

今回は以上となります。

Have a nice Code Engine day♪
※Twitterで最新情報配信中 [@ayatokura](https://twitter.com/ayatokura)