Cloud Foundryハンズオン - 2. 簡単なアプリケーションをデプロイ (PHP編)
PHPのとても簡単なWebアプリケーションを作成 & デプロイしましょう。
目次
プロジェクトの作成
hello-cfフォルダを作成してください。
$ mkdir hello-cf
$ cd hello-cf
index.phpを作成して、次の内容を記述してください。
<?php
echo "Hello World!";
アプリケーションをCloud FoundryにPush
作成したアプリケーションをCloud FoundryにPushしましょう。
cfコマンドを使ってCloud Foundryにアプリケーションをデプロイできます。
cf push hello-<your name> -m 32m
<your name>は自分の名前などを置換して、一意にしてください。以下では<your name>をtmakiとします。適宜自分の名前に読み替えてください。
-mで使用するメモリ量を指定します。Pivotal Web ServicesやPivotal Application Serviceではデフォルトで1GBが使用されますが、今回のPHPアプリではそんなに必要ないのでここでは32MBを指定しています。
$ cf push hello-tmaki -m 32m
admin としてアプリ hello-tmaki を組織 demo / スペース develop にプッシュしています...
アプリ情報を取得しています...
これらの属性でアプリを作成しています...
+ 名前: hello-tmaki
パス: /private/tmp/hello-php
+ メモリー: 32M
経路:
+ hello-tmaki.apps.pivotal.bosh.tokyo
アプリ hello-tmaki を作成しています...
経路をマップしています...
ローカル・ファイルをリモート・キャッシュと比較しています...
Packaging files to upload...
ファイルをアップロードしています...
183 B / 183 B [====================================================================================================================================================================] 100.00% 1s
API がファイルの処理を完了するのを待機しています...
アプリをステージングし、ログをトレースしています...
Downloading binary_buildpack...
Downloading nodejs_buildpack...
Downloading go_buildpack...
Downloading r_buildpack...
Downloading python_buildpack...
Downloaded nodejs_buildpack
Downloaded binary_buildpack
Downloading dotnet_core_buildpack...
Downloaded go_buildpack
Downloading java_buildpack_offline...
Downloading php_buildpack...
Downloaded r_buildpack
Downloading staticfile_buildpack...
Downloaded python_buildpack
Downloading nginx_buildpack...
Downloaded dotnet_core_buildpack
Downloading ruby_buildpack...
Downloaded java_buildpack_offline
Downloaded php_buildpack
Downloaded nginx_buildpack
Downloaded staticfile_buildpack
Downloaded ruby_buildpack
Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b creating container for instance 5e0bc8a7-fb62-437e-8429-aa03625202b3
Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b successfully created container for instance 5e0bc8a7-fb62-437e-8429-aa03625202b3
Downloading app package...
Downloaded app package (183B)
-------> Buildpack version 4.3.78
Installing HTTPD
HTTPD 2.4.39
Downloaded [file://///tmp/buildpacks/5f54b312ec01f8a4ec3362b069613415/dependencies/https___buildpacks.cloudfoundry.org_dependencies_httpd_httpd-2.4.39-linux-x64-cflinuxfs3-a6ad42b8.tgz] to [/tmp]
Installing PHP
PHP 7.2.19
Downloaded [file://///tmp/buildpacks/5f54b312ec01f8a4ec3362b069613415/dependencies/https___buildpacks.cloudfoundry.org_dependencies_php_php7-7.2.19-linux-x64-cflinuxfs3-d7995d10.tgz] to [/tmp]
Finished: [2019-08-19 15:37:41.308003]
Exit status 0
Uploading droplet, build artifacts cache...
Uploading build artifacts cache...
Uploading droplet...
Uploaded build artifacts cache (219B)
Uploaded droplet (80.6M)
Uploading complete
Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b stopping instance 5e0bc8a7-fb62-437e-8429-aa03625202b3
Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b destroying container for instance 5e0bc8a7-fb62-437e-8429-aa03625202b3
アプリが開始するのを待機しています...
Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b successfully destroyed container for instance 5e0bc8a7-fb62-437e-8429-aa03625202b3
名前: hello-tmaki
要求された状態: started
経路: hello-tmaki.apps.pivotal.bosh.tokyo
最終アップロード日時: Tue 20 Aug 00:38:01 JST 2019
スタック: cflinuxfs3
ビルドパック: php 4.3.78
タイプ: web
インスタンス: 1/1
メモリー使用量: 32M
開始コマンド: $HOME/.bp/bin/start
状態 開始日時 cpu メモリー ディスク 詳細
#0 実行 2019-08-19T15:38:16Z 0.0% 32M の中の 0 1G の中の 0
これでデプロイに成功しました。
cf appsでデプロイされているアプリケーションの一覧を取得できます。
$ cf apps
admin として組織 demo / スペース develop 内のアプリを取得しています...
OK
名前 要求された状態 インスタンス メモリー ディスク URL
hello-tmaki started 1/1 32M 1G hello-tmaki.apps.pivotal.bosh.tokyo
urlsの列に出力されている値がアプリケーションのURLです。この場合はhttps://hello-tmaki.apps.pivotal.bosh.tokyoです。

Cloud Foundry上にデプロイされたアプリケーションにもアクセスできました。
Apps Manager(アプリケーションの管理画面)を見てみましょう。
- Pivotal Web Servicesの場合は https://console.run.pivotal.io
- Pivotal Application Serviceの場合は https://apps.((system_domain))

「Space development」をクリックしてください。developmentというスペースにデプロイされているアプリケーションの一覧を確認できます。hello-<your name>が表示されています。(スクリーンショットの画像は古いです)

hello-<your name>をクリックしてください。

アプリケーションの情報が確認できます。
直近のログはcf logs <App> --recentで確認できます。
$ cf logs hello-tmaki --recent
admin として組織 demo / スペース develop 内のアプリ hello-tmaki のログを取得しています...
2019-08-20T00:37:24.22+0900 [API/0] OUT Created app with guid 5872887a-23e8-48de-b773-7c45b03da0ce
2019-08-20T00:37:24.95+0900 [API/0] OUT Uploading bits for app with guid 5872887a-23e8-48de-b773-7c45b03da0ce
2019-08-20T00:37:32.37+0900 [API/0] OUT Creating build for app with guid 5872887a-23e8-48de-b773-7c45b03da0ce
2019-08-20T00:37:32.51+0900 [API/0] OUT Updated app with guid 5872887a-23e8-48de-b773-7c45b03da0ce ({"state"=>"STARTED"})
2019-08-20T00:37:32.53+0900 [STG/0] OUT Downloading binary_buildpack...
2019-08-20T00:37:32.53+0900 [STG/0] OUT Downloading nodejs_buildpack...
2019-08-20T00:37:32.53+0900 [STG/0] OUT Downloading go_buildpack...
2019-08-20T00:37:32.53+0900 [STG/0] OUT Downloading r_buildpack...
2019-08-20T00:37:32.53+0900 [STG/0] OUT Downloading python_buildpack...
2019-08-20T00:37:32.54+0900 [STG/0] OUT Downloaded nodejs_buildpack
2019-08-20T00:37:32.54+0900 [STG/0] OUT Downloaded binary_buildpack
2019-08-20T00:37:32.54+0900 [STG/0] OUT Downloading dotnet_core_buildpack...
2019-08-20T00:37:32.54+0900 [STG/0] OUT Downloaded go_buildpack
2019-08-20T00:37:32.54+0900 [STG/0] OUT Downloading java_buildpack_offline...
2019-08-20T00:37:32.54+0900 [STG/0] OUT Downloading php_buildpack...
2019-08-20T00:37:32.54+0900 [STG/0] OUT Downloaded r_buildpack
2019-08-20T00:37:32.54+0900 [STG/0] OUT Downloading staticfile_buildpack...
2019-08-20T00:37:32.55+0900 [STG/0] OUT Downloaded python_buildpack
2019-08-20T00:37:32.55+0900 [STG/0] OUT Downloading nginx_buildpack...
2019-08-20T00:37:32.55+0900 [STG/0] OUT Downloaded dotnet_core_buildpack
2019-08-20T00:37:32.55+0900 [STG/0] OUT Downloading ruby_buildpack...
2019-08-20T00:37:32.55+0900 [STG/0] OUT Downloaded java_buildpack_offline
2019-08-20T00:37:32.55+0900 [STG/0] OUT Downloaded php_buildpack
2019-08-20T00:37:32.55+0900 [STG/0] OUT Downloaded nginx_buildpack
2019-08-20T00:37:32.56+0900 [STG/0] OUT Downloaded staticfile_buildpack
2019-08-20T00:37:32.56+0900 [STG/0] OUT Downloaded ruby_buildpack
2019-08-20T00:37:32.56+0900 [STG/0] OUT Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b creating container for instance 5e0bc8a7-fb62-437e-8429-aa03625202b3
2019-08-20T00:37:33.16+0900 [STG/0] OUT Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b successfully created container for instance 5e0bc8a7-fb62-437e-8429-aa03625202b3
2019-08-20T00:37:34.33+0900 [STG/0] OUT Downloading app package...
2019-08-20T00:37:34.36+0900 [STG/0] OUT Downloaded app package (183B)
2019-08-20T00:37:35.86+0900 [STG/0] OUT -------> Buildpack version 4.3.78
2019-08-20T00:37:36.83+0900 [STG/0] OUT Installing HTTPD
2019-08-20T00:37:36.83+0900 [STG/0] OUT HTTPD 2.4.39
2019-08-20T00:37:37.05+0900 [STG/0] OUT Downloaded [file://///tmp/buildpacks/5f54b312ec01f8a4ec3362b069613415/dependencies/https___buildpacks.cloudfoundry.org_dependencies_httpd_httpd-2.4.39-linux-x64-cflinuxfs3-a6ad42b8.tgz] to [/tmp]
2019-08-20T00:37:37.44+0900 [STG/0] OUT Installing PHP
2019-08-20T00:37:37.44+0900 [STG/0] OUT PHP 7.2.19
2019-08-20T00:37:38.00+0900 [STG/0] OUT Downloaded [file://///tmp/buildpacks/5f54b312ec01f8a4ec3362b069613415/dependencies/https___buildpacks.cloudfoundry.org_dependencies_php_php7-7.2.19-linux-x64-cflinuxfs3-d7995d10.tgz] to [/tmp]
2019-08-20T00:37:41.30+0900 [STG/0] OUT Finished: [2019-08-19 15:37:41.308003]
2019-08-20T00:37:59.68+0900 [STG/0] OUT Exit status 0
2019-08-20T00:37:59.68+0900 [STG/0] OUT Uploading droplet, build artifacts cache...
2019-08-20T00:37:59.68+0900 [STG/0] OUT Uploading build artifacts cache...
2019-08-20T00:37:59.68+0900 [STG/0] OUT Uploading droplet...
2019-08-20T00:37:59.79+0900 [STG/0] OUT Uploaded build artifacts cache (219B)
2019-08-20T00:38:01.18+0900 [API/0] OUT Creating droplet for app with guid 5872887a-23e8-48de-b773-7c45b03da0ce
2019-08-20T00:38:06.40+0900 [STG/0] OUT Uploaded droplet (80.6M)
2019-08-20T00:38:06.42+0900 [STG/0] OUT Uploading complete
2019-08-20T00:38:06.68+0900 [STG/0] OUT Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b stopping instance 5e0bc8a7-fb62-437e-8429-aa03625202b3
2019-08-20T00:38:06.68+0900 [STG/0] OUT Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b destroying container for instance 5e0bc8a7-fb62-437e-8429-aa03625202b3
2019-08-20T00:38:06.93+0900 [CELL/0] OUT Cell 9e8357a5-eded-44da-94a7-26ab24e2e5f7 creating container for instance eb4aa782-9244-43ca-5ab3-3f83
2019-08-20T00:38:07.08+0900 [STG/0] OUT Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b successfully destroyed container for instance 5e0bc8a7-fb62-437e-8429-aa03625202b3
2019-08-20T00:38:07.55+0900 [CELL/0] OUT Cell 9e8357a5-eded-44da-94a7-26ab24e2e5f7 successfully created container for instance eb4aa782-9244-43ca-5ab3-3f83
2019-08-20T00:38:07.95+0900 [CELL/0] OUT Downloading droplet...
2019-08-20T00:38:12.16+0900 [CELL/0] OUT Downloaded droplet (80.6M)
2019-08-20T00:38:12.47+0900 [CELL/0] OUT Starting health monitoring of container
2019-08-20T00:38:13.46+0900 [APP/PROC/WEB/0] OUT 15:38:13 httpd | [Mon Aug 19 15:38:13.464491 2019] [mpm_event:notice] [pid 116:tid 139890584164224] AH00489: Apache/2.4.39 (Unix) configured -- resuming normal operations
2019-08-20T00:38:13.46+0900 [APP/PROC/WEB/0] OUT 15:38:13 httpd | [Mon Aug 19 15:38:13.464658 2019] [mpm_event:info] [pid 116:tid 139890584164224] AH00490: Server built: Apr 2 2019 01:10:22
2019-08-20T00:38:13.46+0900 [APP/PROC/WEB/0] OUT 15:38:13 httpd | [Mon Aug 19 15:38:13.464672 2019] [core:notice] [pid 116:tid 139890584164224] AH00094: Command line: '/app/httpd/bin/httpd -f /home/vcap/app/httpd/conf/httpd.conf -D FOREGROUND'
2019-08-20T00:38:13.50+0900 [APP/PROC/WEB/0] OUT 15:38:13 php-fpm | [19-Aug-2019 15:38:13] NOTICE: fpm is running, pid 118
2019-08-20T00:38:13.50+0900 [APP/PROC/WEB/0] OUT 15:38:13 php-fpm | [19-Aug-2019 15:38:13] NOTICE: ready to handle connections
2019-08-20T00:38:15.46+0900 [CELL/0] OUT Container became healthy
2019-08-20T00:39:27.19+0900 [RTR/0] OUT hello-tmaki.apps.pivotal.bosh.tokyo - [2019-08-19T15:39:27.183+0000] "GET / HTTP/1.1" 200 0 32 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" "100.64.48.3:8704" "192.168.2.28:61026" x_forwarded_for:"100.64.48.3" x_forwarded_proto:"https" vcap_request_id:"9bcaf487-0764-4d51-67d0-ef742c61920f" response_time:0.008308117 app_id:"5872887a-23e8-48de-b773-7c45b03da0ce" app_index:"0" x_b3_traceid:"bcefe489ae490320" x_b3_spanid:"bcefe489ae490320" x_b3_parentspanid:"-" b3:"bcefe489ae490320-bcefe489ae490320"
またcf logs <App>で今後流れるログを確認することができます(tail -f相当)。
アプリケーションの削除
cf deleteでアプリケーションを削除できます。
$ cf delete hello-tmaki
アプリ hello-tmaki を削除しますか?> y
admin として組織 demo / スペース develop 内のアプリ hello-tmaki を削除しています...
OK
Note
cf deleteに-rオプションをつけると、ルーティング情報も合わせて削除されます。-fオプションをつけると、確認を聞かれません。
--random-routeを使う
このセクションはスキップして良いです。
先ほどはアプリケーション名に-<your name>をつけ一意にしました。helloだと重複する可能性が高いためです。実はアプリケーション名自体はスペース内で一意であればよく、一意にすべきはホスト名(xxxx.cfapps.ioのxxxxの部分)です。これは-nまたは--hostnameで指定できます。
一意なホスト名にするには--random-routeを追加すれば良いです。
$ cf push hello -m 32m --random-route
cf appsを確認すると、ホスト名がhello-sleepy-warthogになっていることがわかります。
$ cf apps
admin として組織 demo / スペース develop 内のアプリを取得しています...
OK
名前 要求された状態 インスタンス メモリー ディスク URL
hello started 1/1 32M 1G hello-sleepy-warthog.apps.pivotal.bosh.tokyo
この場合、https://hello-sleepy-warthog.apps.pivotal.bosh.tokyoにアクセスできます。
Buildpackを指定する
cf pushでアプリケーションをアップロードした後、ステージングとよばれるフェーズでランタイム(JREやサーバーなど)を追加し実行可能なDropletという形式(コンテナイメージ)を作成します。Dropletを作るためのBuildpackとよばれる仕組みが使われます。
アップロードしたファイル群(アーティファクト)から自動で適用すべきBuildpackが判断され、Cloud Foundryに他言語対応はここで行われています。
利用可能なBuildpack一覧はcf buildpacksで取得できます。
$ cf buildpacks
ビルドパックを取得しています...
buildpack 位置 有効 ロック済み ファイル名 stack
staticfile_buildpack 1 true false staticfile_buildpack-cached-cflinuxfs3-v1.4.43.zip cflinuxfs3
java_buildpack_offline 2 true false java-buildpack-offline-cflinuxfs3-v4.20.zip cflinuxfs3
ruby_buildpack 3 true false ruby_buildpack-cached-cflinuxfs3-v1.7.42.zip cflinuxfs3
nginx_buildpack 4 true false nginx_buildpack-cached-cflinuxfs3-v1.0.15.zip cflinuxfs3
nodejs_buildpack 5 true false nodejs_buildpack-cached-cflinuxfs3-v1.6.52.zip cflinuxfs3
go_buildpack 6 true false go_buildpack-cached-cflinuxfs3-v1.8.42.zip cflinuxfs3
r_buildpack 7 true false r_buildpack-cached-cflinuxfs3-v1.0.11.zip cflinuxfs3
python_buildpack 8 true false python_buildpack-cached-cflinuxfs3-v1.6.36.zip cflinuxfs3
php_buildpack 9 true false php_buildpack-cached-cflinuxfs3-v4.3.78.zip cflinuxfs3
dotnet_core_buildpack 10 true false dotnet-core_buildpack-cached-cflinuxfs3-v2.2.12.zip cflinuxfs3
binary_buildpack 11 true false binary_buildpack-cached-cflinuxfs3-v1.0.33.zip cflinuxfs3
binary_buildpack 12 true false binary_buildpack-cached-windows2012R2-v1.0.33.zip windows2012R2
binary_buildpack 13 true false binary_buildpack-cached-windows2016-v1.0.33.zip windows2016
binary_buildpack 14 true false binary_buildpack-cached-windows-v1.0.33.zip windows
デフォルトでは、cf pushでアーティファクトをアップロードした後、利用可能なBuildpackを全てダウンロードし、優先順(position順)にチェックし、対象のBuildpackを特定しDroplet(実行可能な形式)を作成します。
今回の場合は、php_buildpackが検知され、PHP用のDropletが作成されます。
Buildpackは-bで明示的に指定できます。明示することで自動検出のための時間を短縮できます。
$ cf push hello-tmaki -m 32m -b php_buildpack
admin としてアプリ hello-tmaki を組織 demo / スペース develop にプッシュしています...
アプリ情報を取得しています...
これらの属性でアプリを作成しています...
+ 名前: hello-tmaki
パス: /private/tmp/hello-php
ビルドパック:
+ php_buildpack
+ メモリー: 32M
経路:
+ hello-tmaki.apps.pivotal.bosh.tokyo
アプリ hello-tmaki を作成しています...
経路をマップしています...
ローカル・ファイルをリモート・キャッシュと比較しています...
Packaging files to upload...
ファイルをアップロードしています...
183 B / 183 B [====================================================================================================================================================================] 100.00% 1s
API がファイルの処理を完了するのを待機しています...
アプリをステージングし、ログをトレースしています...
Downloading php_buildpack...
Downloaded php_buildpack
Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b creating container for instance d0310f27-1586-497b-a0cb-eef76a473add
Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b successfully created container for instance d0310f27-1586-497b-a0cb-eef76a473add
Downloading app package...
Downloaded app package (183B)
-------> Buildpack version 4.3.78
Installing HTTPD
HTTPD 2.4.39
Downloaded [file://///tmp/buildpacks/5f54b312ec01f8a4ec3362b069613415/dependencies/https___buildpacks.cloudfoundry.org_dependencies_httpd_httpd-2.4.39-linux-x64-cflinuxfs3-a6ad42b8.tgz] to [/tmp]
Installing PHP
PHP 7.2.19
Downloaded [file://///tmp/buildpacks/5f54b312ec01f8a4ec3362b069613415/dependencies/https___buildpacks.cloudfoundry.org_dependencies_php_php7-7.2.19-linux-x64-cflinuxfs3-d7995d10.tgz] to [/tmp]
Finished: [2019-08-19 15:46:29.527347]
Exit status 0
Uploading droplet, build artifacts cache...
Uploading droplet...
Uploading build artifacts cache...
Uploaded build artifacts cache (217B)
Uploaded droplet (80.6M)
Uploading complete
Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b stopping instance d0310f27-1586-497b-a0cb-eef76a473add
Cell 0aeb36f2-f081-4c64-8334-2627d2d82d4b destroying container for instance d0310f27-1586-497b-a0cb-eef76a473add
アプリが開始するのを待機しています...
名前: hello-tmaki
要求された状態: started
経路: hello-tmaki.apps.pivotal.bosh.tokyo
最終アップロード日時: Tue 20 Aug 00:46:49 JST 2019
スタック: cflinuxfs3
ビルドパック: php_buildpack
タイプ: web
インスタンス: 1/1
メモリー使用量: 32M
開始コマンド: $HOME/.bp/bin/start
状態 開始日時 cpu メモリー ディスク 詳細
#0 実行 2019-08-19T15:47:03Z 0.0% 32M の中の 11.9M 1G の中の 241.4M
Manifestファイルを作成
ここまでcfコマンドで指定してきたオプションはmanifest.ymlというyamlファイルに定義できます。
cf push hello -m 32m -b php_buildpackをmanifest.ymlで表すと、
applications:
- name: hello
memory: 32m
buildpacks:
- php_buildpack
となります。
このManifestファイルがあれば実行コマンドはcf pushだけで良いです。
$ cf push
Using manifest file /Users/makit/cfws/php/manifest.yml
(以下、略)