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です。

image

Cloud Foundry上にデプロイされたアプリケーションにもアクセスできました。

Apps Manager(アプリケーションの管理画面)を見てみましょう。

image

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

image

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

image

アプリケーションの情報が確認できます。

直近のログは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.ioxxxxの部分)です。これは-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_buildpackmanifest.ymlで表すと、

applications:
- name: hello
  memory: 32m
  buildpacks: 
  - php_buildpack

となります。

このManifestファイルがあれば実行コマンドはcf pushだけで良いです。

$ cf push
Using manifest file /Users/makit/cfws/php/manifest.yml
(以下、略)