IBM Cloud を遊んでみました

IBM Cloud について、遊んで見ました、簡単にメモ。
Java のサンプルを Deploy しました、こちらで確認できる。
https://getstartedjava-shiny-bear-sc.mybluemix.net/GetStartedJava/

#### まずは、無料登録
https://cloud.ibm.com/registration

#### IBM Cloud CLI を設定
https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli&locale=ja

自分は CentOS なので、こちらを使用

```bash
$ curl -fsSL https://clis.cloud.ibm.com/install/linux | sh
```
Windows の場合は、こちらからダウンロード
https://github.com/IBM-Cloud/ibm-cloud-cli-release/releases

続いてibmcloud を更新

```bash
$ ibmcloud update
更新を確認しています...
更新は不要です。 CLI は既に最新です。
$ ibmcloud -v
ibmcloud version 1.4.0+4705d79-2021-02-24T21:18:06+00:00
```

#### Cloud Foundry サンプル・アプリの作成
今回は Java を使用するので、こちら
https://cloud.ibm.com/catalog/starters/cloud-foundry?runtime=liberty-for-java
無料プランですと、メモリは最大 256M を選べる！最大にしましょう！

画面はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638581/db29bf59-1ff7-43a8-c733-b6521199e2f2.png)
ただ、ロケーションの選択はアジアの選択肢がないのは残念
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638581/b895a0f4-a528-a34f-9129-ab464a84deca.png)

できたら、「Cloud Foundry の組織」画面に表示されます：
https://cloud.ibm.com/account/cloud-foundry

#### war ファイルを作成

サンプル java プロジェクトを clone し、maven でビルド

```bash
$ git clone https://github.com/IBM-Cloud/get-started-java
$ cd get-started-java
$ mvn clean install
..........................................................................
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.767 s
[INFO] Finished at: 2021-03-29T13:37:10Z
[INFO] ------------------------------------------------------------------------
$ mvn install liberty:run-server
```
ローカルで確認したい場合はこちら（ポート：9080）
http://localhost:9080/GetStartedJava

#### Deploy to IBM Cloud

```bash
$ ibmcloud login
API endpoint: https://cloud.ibm.com
Region: jp-tok

Email> アカウントのメールアドレス

Password> アカウントのパスワード
Authenticating...
OK

Targeted account XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                      
API endpoint:      https://cloud.ibm.com   
Region:            jp-tok   
User:              XXXXXXXXXXXXXXXXXXXXXX
Account:           XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Resource group:    No resource group targeted, use 'ibmcloud target -g RESOURCE_GROUP'   
CF API endpoint:      
Org:                  
Space:                
```

Target a Cloud Foundry org and space:

```bash
$ ibmcloud target -r us-south        # ロケーションを us-south に変える
$ ibmcloud target --cf
```

push application to IBM Cloud.

```bash
$ ibmcloud cf push
Invoking 'cf push'...
...............................................
Waiting for app to start...

name:              GetStartedJava
requested state:   started
routes:            getstartedjava-shiny-bear-sc.mybluemix.net
last uploaded:     Mon 29 Mar 13:42:06 UTC 2021
stack:             cflinuxfs3
buildpacks:        Liberty for Java(TM) (WAR, liberty-21.0.0_3, buildpack-v3.55-20210311-1642, ibmjdk-1.8.0_sr6fp26-20210216, env)

type:            web
instances:       1/1
memory usage:    256M
start command:   .liberty/initial_startup.rb
     state     since                  cpu     memory           disk           details
#0   running   2021-03-29T13:42:55Z   62.3%   100.1M of 256M   322.7M of 1G   
```

app の一覧と URL を確認

```bash
$ ibmcloud cf apps
Invoking 'cf apps'...

Getting apps in org xxxxxxxxxxxxx@xxxxxxxxxxxx / space dev as xxxxxxxxxxx@xxxxxxxxxx...
OK

name             requested state   instances   memory   disk   urls
GetStartedJava   started           1/1         256M     1G     getstartedjava-shiny-bear-sc.mybluemix.net
```

上記表示された URL + /GetStartedJava/ をアクセスできる
https://getstartedjava-shiny-bear-sc.mybluemix.net/GetStartedJava/

Java のバージョンを 11 にする

```bash
ibmcloud cf set-env GetStartedJava JBP_CONFIG_IBMJDK "version: 11.+"
ibmcloud cf restage GetStartedJava
ibmcloud cf push
```

以下の jsp で確認した結果：

```jsp:env.jsp
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<body>
Server Version: <%= application.getServerInfo() %><br>
Servlet Version: <%= application.getMajorVersion() %>.<%= application.getMinorVersion() %><br>
JSP Version: <%= JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion() %><br>
<br>
java.runtime.name: <%= System.getProperty("java.runtime.name") %><br>
java.runtime.version: <%= System.getProperty("java.runtime.version") %><br>
java.vm.name: <%= System.getProperty("java.vm.name") %><br>
java.vm.vendor: <%= System.getProperty("java.vm.vendor") %><br>
java.vm.version: <%= System.getProperty("java.vm.version") %><br>
</body>
</html>
```

```text
Server Version: IBM WebSphere Liberty/21.0.0.6
Servlet Version: 3.1
JSP Version: 2.1

java.runtime.name: OpenJDK Runtime Environment
java.runtime.version: 11.0.11+9
java.vm.name: Eclipse OpenJ9 VM
java.vm.vendor: Eclipse OpenJ9
java.vm.version: openj9-0.26.0
```

#### やってみた感じ

１．無料プランはいまいち、ローケーションをアメリカにしたせいか、結構遅いです。
東京の自宅サーバーから ping (138 ms)

```bash
$ ping getstartedjava-shiny-bear-sc.mybluemix.net
PING getstartedjava-shiny-bear-sc.mybluemix.net (169.47.124.22) 56(84) bytes of data.
64 bytes from 16.7c.2fa9.ip4.static.sl-reverse.com (169.47.124.22): icmp_seq=1 ttl=182 time=139 ms
64 bytes from 16.7c.2fa9.ip4.static.sl-reverse.com (169.47.124.22): icmp_seq=2 ttl=182 time=138 ms
64 bytes from 16.7c.2fa9.ip4.static.sl-reverse.com (169.47.124.22): icmp_seq=3 ttl=182 time=138 ms
64 bytes from 16.7c.2fa9.ip4.static.sl-reverse.com (169.47.124.22): icmp_seq=4 ttl=182 time=139 ms
64 bytes from 16.7c.2fa9.ip4.static.sl-reverse.com (169.47.124.22): icmp_seq=5 ttl=182 time=138 ms
64 bytes from 16.7c.2fa9.ip4.static.sl-reverse.com (169.47.124.22): icmp_seq=6 ttl=182 time=138 ms
64 bytes from 16.7c.2fa9.ip4.static.sl-reverse.com (169.47.124.22): icmp_seq=7 ttl=182 time=139 ms
64 bytes from 16.7c.2fa9.ip4.static.sl-reverse.com (169.47.124.22): icmp_seq=8 ttl=182 time=138 ms
64 bytes from 16.7c.2fa9.ip4.static.sl-reverse.com (169.47.124.22): icmp_seq=9 ttl=182 time=138 ms
```

さくらレンタルサーバーから ping (138 ms)

```bash
$ ping getstartedjava-shiny-bear-sc.mybluemix.net
PING getstartedjava-shiny-bear-sc.mybluemix.net (169.47.124.22): 56 data bytes
64 bytes from 169.47.124.22: icmp_seq=0 ttl=180 time=138.681 ms
64 bytes from 169.47.124.22: icmp_seq=1 ttl=180 time=138.851 ms
64 bytes from 169.47.124.22: icmp_seq=2 ttl=180 time=138.742 ms
64 bytes from 169.47.124.22: icmp_seq=3 ttl=180 time=138.511 ms
64 bytes from 169.47.124.22: icmp_seq=4 ttl=180 time=138.678 ms
64 bytes from 169.47.124.22: icmp_seq=5 ttl=180 time=139.004 ms
64 bytes from 169.47.124.22: icmp_seq=6 ttl=180 time=138.708 ms
64 bytes from 169.47.124.22: icmp_seq=7 ttl=180 time=138.943 ms
64 bytes from 169.47.124.22: icmp_seq=8 ttl=180 time=138.766 ms
64 bytes from 169.47.124.22: icmp_seq=9 ttl=180 time=138.785 ms
```

２．IBM の shell 環境（ibmcloud）結構独自なので、慣れが必要です。

#### 追記１
Tomcat にも気になるから、やってみました。
無料枠だとメモリは上限 256M しか使えないため、Tomcat サーバー起動できません。
以下のエラーが出る：

```bash
2021-03-30T03:41:55.59+0000 [APP/PROC/WEB/0] ERR Cannot calculate JVM memory configuration: There is insufficient memory remaining for heap. Memory available for allocation 256M is less than allocated memory 590168K (-XX:ReservedCodeCacheSize=240M, -XX:MaxDirectMemorySize=10M, -XX:MaxMetaspaceSize=78168K, -Xss1M * 250 threads)
```
どうやら、デフォルトでメモリーを一杯設定してしまったみたい。
スケールのやり方もあったが、無料枠では使えない。（そもそも最大 256M しか使えない）

```bash
ibmcloud cf scale koryo -m 1G
```

こちらの記事を参考し、
https://stackoverflow.com/questions/56658354/jvm-insufficient-memory-issue
manifest.yml を修正したらうまく行った。(Java の環境変数を指定する)
ちなみに、Tomcat のバージョンは 9.0.44

```bash
$ cat manifest.yml 
---
applications:
 - name: koryo 
   random-route: true
   path: target/GetStartedTomcat.war
   memory: 256M 
   instances: 1
   buildpack: java_buildpack
   env:
           JAVA_OPTS: '-Xmx256M'
```

#### 追記２
https://cloud.ibm.com/docs/cloud-foundry-public?topic=cloud-foundry-public-deployingapps
以下のコマンドで war だけを更新。（jenkins を入れてみました）

```bash
# war だけを更新する
ibmcloud cf push GetStartedJava -p jenkins.war
# log を見る
ibmcloud cf logs GetStartedJava
```

#### 参考になった記事：
無料で使えるIBM Cloudサービスの調べ方
https://qiita.com/ayatokura/items/fb7606bf7c052ad7e75b

IBM CloudでCloud Foundryアプリケーションをデプロイをする
https://qiita.com/hayatochiri222/items/49d7161683c79b4b3aaa

ibm cloudにdeployしていたappが動かなくなっていたので対応した
https://qiita.com/syui/items/0010d81c6375f5f771e7

Getting started with Liberty for Java
https://cloud.ibm.com/docs/cloud-foundry-public?topic=cloud-foundry-public-getting-started-liberty&locale=ja

ロケーションについて
https://cloud.ibm.com/docs/containers?topic=containers-regions-and-zones&locale=ja

IBM Cloud CLI のインストール
https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli&locale=ja

汎用 IBM Cloud CLI (ibmcloud) コマンド
https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_cli&locale=ja

IBM Cloud Shellを触ってみた
https://qiita.com/testnin2/items/17d10a304fa581889226

その他
https://qiita.com/yamachan360/items/1563cd3ea6271afe46ab
https://qiita.com/ayatokura/items/289600873af05d0034a9

以上。