---
title: Cloud Foundryハンズオン - 2. 簡単なアプリケーションをデプロイ (PHP編)
tags: ["Cloud Foundry Handson", "Cloud Foundry", "PAS", "CFAR", "Pivotal Application Service", "PHP"]
categories: ["Dev", "PaaS", "CloudFoundry"]
date: 2019-08-19T15:48:48Z
updated: 1970-01-01T00:00:00Z
---

PHPのとても簡単なWebアプリケーションを作成 & デプロイしましょう。

**目次**

<!-- toc -->

### プロジェクトの作成

`hello-cf`フォルダを作成してください。

```
$ mkdir hello-cf
$ cd hello-cf
```

`index.php`を作成して、次の内容を記述してください。

```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](https://hello-tmaki.apps.pivotal.bosh.tokyo)です。

![image](https://user-images.githubusercontent.com/106908/63278854-05ab7c00-c2e3-11e9-8d6c-92915e2b540f.png)

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

Apps Manager(アプリケーションの管理画面)を見てみましょう。
* Pivotal Web Servicesの場合は https://console.run.pivotal.io
* Pivotal Application Serviceの場合は https://apps.((system_domain))

![image](https://user-images.githubusercontent.com/106908/63278966-325f9380-c2e3-11e9-911b-12c117acb69f.png)

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

![image](https://user-images.githubusercontent.com/106908/63279000-3d1a2880-c2e3-11e9-9888-6cd5f5164545.png)

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

![image](https://user-images.githubusercontent.com/106908/63279012-44413680-c2e3-11e9-954c-a798163299e8.png)

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

直近のログは`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](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`で表すと、

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

となります。

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

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