Cloud Foundryを触ってみる、GUIで管理する

#Cloud Foundryに触れてみる

Cloud Foundryの良さはあれこれ調べるより触った方が良いので実際の流れをご紹介。IBM、Swisscom、SAPなど色々とサービスがありますが、有名どころですとVMwareのPivotal web services(*1)がすぐにお試し出来たりします。こちらは$87分のクレジット付き。今回は大人の事情でSUSEの[SUSE Developer community](https://www.explore.suse.dev/)にあるCloud Application Platform Developer Sandboxで試します。同一スペースでのルーティング等に制約はありますがRAM2.5GBまで使えるのでJavaアプリなども試せると思います。

こちらからアカウントを作成してログインします。CLIの場合はCf cli(*2)を導入後、API Endpoint（接続先）を[https://api.cap.explore.suse.dev](https://api.cap.explore.suse.dev)、GUIの場合はお手持ちのブラウザから[https://stratos.cap.explore.suse.dev](https://stratos.cap.explore.suse.dev)に接続ください。まずCLI、次にGUIについて説明したいと思います。

実際に[https://github.com/cloudfoundry-samples](https://github.com/cloudfoundry-samples)にあるサンプルアプリケーションを動かしてみましょう。まずはgitからダウンロードしてDirを移動。

````
git clone
git clone https://github.com/cloudfoundry-samples/cf-sample-app-spring
Cloning into 'cf-sample-app-spring'...
remote: Enumerating objects: 83, done.
remote: Total 83 (delta 0), reused 0 (delta 0), pack-reused 83
Unpacking objects: 100% (83/83), done.

cd cf-sample-app-spring

````

環境により指定のBuildpacksですとエラーで落ちるのでローカルのmanifest.ymlからBuildpacks以下2行を削除ください。削除後は適切なBuildpackが自動的に判断されて取得されます。そしてターミナルやpowershellなどからCF環境にログイン。cfだけたたくとオプション一覧が出ます。

```
> cf l  #cf login

API endpoint> https://api.cap.explore.suse.dev

Email> hisazumi.arimoto

Password>
Authenticating...
OK

Targeted org hisazumi_arimoto

Select a space (or press enter to skip):
1. dev
2. samples
3. test

Space> 1
Targeted space dev

API endpoint:   https://api.cap.explore.suse.dev (API version: 2.144.0)
User:           ##########################
Org:            hisazumi_arimoto
Space:          dev

```

こんな感じでログイン出来ます。あとはcf pushと打つだけ。これでデプロイ完了です。数分の間にコードを識別して必要なBuildpackを落として、ステージング、コンテナ化、インフラのプロビジョニング、ルーティングをやってくれます。興味のある人はログを追っていただきずーーっと下の方へ。

```
![q7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636313/83dad049-983e-1182-174b-271a7923f380.png)

>cf push
Pushing from manifest to org hisazumi_arimoto / space dev as hisazumi.arimoto...
Using manifest file C:\cf-sample-app-spring\manifest.yml
Getting app info...
Creating app with these attributes...
+ name:        cf-demo
  path:        C:\cf-sample-app-spring
+ instances:   1
+ memory:      768M
  routes:
+   cf-demo-turbulent-antelope.cap.explore.suse.dev

Creating app cf-demo...
Mapping routes...
Comparing local files to remote cache...
Packaging files to upload...
Uploading files...
 713.67 KiB / 713.67 KiB [====================================================================================================================================================================================================] 100.00% 3s

Waiting for API to complete processing files...

Staging app and tracing logs...
   Downloading dotnet-core_buildpack...
   Downloading ruby_buildpack...
   Downloading staticfile_buildpack...
   Downloading nodejs_buildpack...
   Downloading nginx_buildpack...
   Downloaded dotnet-core_buildpack
   Downloading go_buildpack...
   Downloaded ruby_buildpack
   Downloading python_buildpack...
   Downloaded python_buildpack
   Downloading hugo_buildpack...
   Downloaded staticfile_buildpack
   Downloading php_buildpack...
   Downloaded nginx_buildpack
   Downloading binary_buildpack...
   Downloaded php_buildpack
   Downloading java_buildpack...
   Downloaded go_buildpack
   Downloaded nodejs_buildpack
   Downloaded binary_buildpack
   Downloaded hugo_buildpack
   Downloaded java_buildpack
   Cell diego-cell-3 creating container for instance ba8e1d79-de8f-4863-ac0f-8a4abb507d83
   Cell diego-cell-3 successfully created container for instance ba8e1d79-de8f-4863-ac0f-8a4abb507d83
   Downloading app package...
   Downloaded app package (1.2M)
   -----> Java Buildpack v4.27.0.1 | git@github.com:SUSE/cf-java-buildpack.git#8e0ddf9
   -----> Downloading Jvmkill Agent 1.16.0_RELEASE from https://java-buildpack.cloudfoundry.org/jvmkill/bionic/x86_64/jvmkill-1.16.0-RELEASE.so (0.2s)
   -----> Downloading Open Jdk JRE 1.8.0_232 from https://java-buildpack.cloudfoundry.org/openjdk/bionic/x86_64/openjdk-jre-1.8.0_232-bionic.tar.gz (2.4s)
          Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (0.8s)
   -----> Downloading Open JDK Like Memory Calculator 3.13.0_RELEASE from https://java-buildpack.cloudfoundry.org/memory-calculator/bionic/x86_64/memory-calculator-3.13.0-RELEASE.tar.gz (0.7s)
          Loaded Classes: 8129, Threads: 250
   -----> Downloading Client Certificate Mapper 1.11.0_RELEASE from https://java-buildpack.cloudfoundry.org/client-certificate-mapper/client-certificate-mapper-1.11.0-RELEASE.jar (0.4s)
   -----> Downloading Container Security Provider 1.16.0_RELEASE from https://java-buildpack.cloudfoundry.org/container-security-provider/container-security-provider-1.16.0-RELEASE.jar (0.1s)
   -----> Downloading Spring Boot CLI 2.2.1_RELEASE from https://java-buildpack.cloudfoundry.org/spring-boot-cli/spring-boot-cli-2.2.1-RELEASE.tar.gz (1.5s)
          Expanding Spring Boot CLI to .java-buildpack/spring_boot_cli (0.1s)
   Exit status 0
   Uploading droplet, build artifacts cache...
   Uploading droplet...
   Uploading build artifacts cache...
   Uploaded droplet (52.6M)
   Uploaded build artifacts cache (51.2M)
   Uploading complete
   Cell diego-cell-3 stopping instance ba8e1d79-de8f-4863-ac0f-8a4abb507d83
   Cell diego-cell-3 destroying container for instance ba8e1d79-de8f-4863-ac0f-8a4abb507d83

Waiting for app to start...

name:              cf-demo
requested state:   started
routes:            cf-demo-turbulent-antelope.cap.explore.suse.dev
last uploaded:     Wed 13 May 15:37:21 JST 2020
stack:             sle15
buildpacks:        client-certificate-mapper=1.11.0_RELEASE container-security-provider=1.16.0_RELEASE java-buildpack=v4.27.0.1-git@github.com:SUSE/cf-java-buildpack.git#8e0ddf9 java-opts java-security
                   jvmkill-agent=1.16.0_RELEASE open-jdk-like-jre=1.8.0_232 ope...

type:            web
instances:       1/1
memory usage:    768M
start command:   JAVA_OPTS="-agentpath:$PWD/.java-buildpack/open_jdk_jre/bin/jvmkill-1.16.0_RELEASE=printHeapHistogram=1 -Djava.io.tmpdir=$TMPDIR -XX:ActiveProcessorCount=$(nproc)
                 -Djava.ext.dirs=$PWD/.java-buildpack/container_security_provider:$PWD/.java-buildpack/open_jdk_jre/lib/ext -Djava.security.properties=$PWD/.java-buildpack/java_security/java.security $JAVA_OPTS" &&
                 CALCULATED_MEMORY=$($PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-3.13.0_RELEASE -totMemory=$MEMORY_LIMIT -loadedClasses=8326 -poolType=metaspace -stackThreads=250 -vmOptions="$JAVA_OPTS") &&
                 echo JVM Memory Configuration: $CALCULATED_MEMORY && JAVA_OPTS="$JAVA_OPTS $CALCULATED_MEMORY" && MALLOC_ARENA_MAX=2 JAVA_OPTS=$JAVA_OPTS SERVER_PORT=$PORT JAVA_HOME=$PWD/.java-buildpack/open_jdk_jre exec
                 $PWD/.java-buildpack/spring_boot_cli/bin/spring run -cp $PWD/.java-buildpack/client_certificate_mapper/client_certificate_mapper-1.11.0_RELEASE.jar app.groovy
     state     since                  cpu    memory           disk           details
#0   running   2020-05-13T06:37:46Z   0.0%   165.2M of 768M   147.1M of 1G

```

実際のアプリにアクセスするにはroutesにあるURLを叩けば、以下の様にアプリケーションがデプロイされたことが確認出来ます。この手軽さと俊敏性がCloud Foundryの価値です。
補足：Cfはオープンソースですのでディストリビューションに限らずアプリの動作、コマンド等は互換性があります。基本的にはEndpointを変更することで他のCF環境でもアプリを同じ様に動かせます。もしお試しになりたい方がいれば、冒頭で紹介したPivotal web serviceでも同じアプリが動作することを確認頂けるかと思います（上位環境や連携サービスにより動作させるために変更修正がある場合もあります）。

![q7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636313/5386ff13-154c-4160-1a22-620437e140c1.png)


次にGUIから今デプロイしたアプリを確認してみます。ブラウザから[https://stratos.cap.explore.suse.dev](https://stratos.cap.explore.suse.dev)にアクセスします。このGUIはStratosというupstreamのプロジェクトでSUSEが中心になって開発しているものです。

![q3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636313/6fc26748-2131-25e0-1f9b-fb7da1688626.png)


作成したクレデンシャルを入力します

![q8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636313/67a4210b-ebfb-fc1b-7202-f5ff9bea0f62.png)

Deployしたアプリケーションの情報を確認出来ます。この画面からスケールさせたり、ルーティングを変更したり、アプリを削除したりといった操作が可能です。またCLIと同様のAPIを利用しているのでどちらからでも操作可能です。

![q5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636313/fe3c6831-dc53-b5f3-f291-42ea6022beea.png)

BuildpackやCloudFoundryの情報なども確認が可能です。

![q6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636313/3043d2f4-a74b-2833-05c4-a4f1a235ae57.png)


Endpointを追加登録することで、他のベンダーが提供するCloud Foundryの操作も同様に可能です。またクラウドサービスプロバイダーの提供やSUSEを含むオンプレのKubernetesもここから管理が可能です(K8s dashboardと連携します）。それ以外にもGrafanaやHELMレポジトリを追加することでダッシュボードによる可視化やアプリケーションをチャートからワンクリックでインストール出来ます。


実際にCloud Foundryに触れてみていかがでしょうか。もう少しCFについて触ってみたい方は[https://www.cloudfoundry.org/trainings/cloud-foundry-beginners-zero-hero/](https://www.cloudfoundry.org/trainings/cloud-foundry-beginners-zero-hero/)や他の方のブログ等もご参考になさって頂けばと思います。次回はこういったCloud Foundryの環境をAzure/AWS上でテンプレートもしくはスクリプトから簡単に用意する方法について書きたいと思います。

Happy coding!

(*1)[https://run.pivotal.io/](https://run.pivotal.io/)
(*2)[https://github.com/cloudfoundry/cli](https://github.com/cloudfoundry/cli)