#Cloud Foundryに触れてみる
Cloud Foundryの良さはあれこれ調べるより触った方が良いので実際の流れをご紹介。IBM、Swisscom、SAPなど色々とサービスがありますが、有名どころですとVMwareのPivotal web services(*1)がすぐにお試し出来たりします。こちらは$87分のクレジット付き。今回は大人の事情でSUSEのSUSE Developer communityにあるCloud Application Platform Developer Sandboxで試します。同一スペースでのルーティング等に制約はありますがRAM2.5GBまで使えるのでJavaアプリなども試せると思います。
こちらからアカウントを作成してログインします。CLIの場合はCf cli(*2)を導入後、API Endpoint(接続先)をhttps://api.cap.explore.suse.dev、GUIの場合はお手持ちのブラウザからhttps://stratos.cap.explore.suse.devに接続ください。まずCLI、次にGUIについて説明したいと思います。
実際に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でも同じアプリが動作することを確認頂けるかと思います(上位環境や連携サービスにより動作させるために変更修正がある場合もあります)。
次にGUIから今デプロイしたアプリを確認してみます。ブラウザからhttps://stratos.cap.explore.suse.devにアクセスします。このGUIはStratosというupstreamのプロジェクトでSUSEが中心になって開発しているものです。
作成したクレデンシャルを入力します
Deployしたアプリケーションの情報を確認出来ます。この画面からスケールさせたり、ルーティングを変更したり、アプリを削除したりといった操作が可能です。またCLIと同様のAPIを利用しているのでどちらからでも操作可能です。
BuildpackやCloudFoundryの情報なども確認が可能です。
Endpointを追加登録することで、他のベンダーが提供するCloud Foundryの操作も同様に可能です。またクラウドサービスプロバイダーの提供やSUSEを含むオンプレのKubernetesもここから管理が可能です(K8s dashboardと連携します)。それ以外にもGrafanaやHELMレポジトリを追加することでダッシュボードによる可視化やアプリケーションをチャートからワンクリックでインストール出来ます。
実際にCloud Foundryに触れてみていかがでしょうか。もう少しCFについて触ってみたい方はhttps://www.cloudfoundry.org/trainings/cloud-foundry-beginners-zero-hero/や他の方のブログ等もご参考になさって頂けばと思います。次回はこういったCloud Foundryの環境をAzure/AWS上でテンプレートもしくはスクリプトから簡単に用意する方法について書きたいと思います。
Happy coding!
(*1)https://run.pivotal.io/
(*2)https://github.com/cloudfoundry/cli