※本記事は長文です。あらかじめご了承ください。
開発者には、「書いて、テストして、デプロイする」という真言があります。さて、本チュートリアルでは、Google Cloud、Microsoft Azure、Heroku、IBM BluemixといったクラウドサーバープラットホームにPHPアプリをデプロイする方法を紹介します。
クラウドサーバーについて
クラウドサーバーとは、クラウドコンピューティング環境で実行する仮想サーバーを指します。アプリケーションをクラウドでホストしデプロイするのはさまざまな利点があります。
- 経済的
- サーバーソフトウェアを必要に応じて自由に変更できる
- クラウドサーバーによる優れたスケーラビリティ
- 安定性とセキュリティを確保できる
数多くの企業がコストと複雑さを減らすために企業のインフラストラクチャーをクラウドに移行しています。クラウドは中小規模のビジネスや企業システムに適した選択肢です。また、私のようにチュートリアルをたくさん書いたり、概念実証(POC: Proof-of-concepts)に取り組んだりしている人にとっても適した選択肢です。
一般的なPHPアプリケーションでは、定番のLAMP(Linux、Apache、Mysql、PHP)スタックが用いられます。
- Linux:ほかのソフトウェアパッケージを実行するためのオペレーティングシステム
- Apache:PHPコードを実行するWebサーバー。Apacheのほかに人気のあるソフトウェアとしては、Nginxがある
- MySQL:データベース。MySQLのほかに人気のあるソフトウェアとしては、PostgreSQLがある。
- PHP:アプリケーション構築のための、サーバーサイドのプログラミング言語
クラウドサーバープラットホームにPHPアプリケーションをデプロイする方法を解説します。
Heroku
Herokuはアプリケーションを先進的な方法でデプロイ、ホストできるクラウドプラットホームです。難しい作業はHerokuがすべて肩代わりしてくれます。では、HerokuでPHPアプリケーションをデプロイ、管理する方法を解説します。
アカウントをheroku.comで作成します。作成後、heroku cliをインストールし、完了したら、シンプルなスターウォーズのPHPアプリケーションをクローンします。
Herokuは、Dynoと呼ばれるスマートコンテナ上でPHPアプリを実行します。Dynoは最新のスタックを備えており、Webサーバー(ApacheまたはNginx)とランタイム(PHPまたはHHVM)を任意に選択できます。
以下の手順で作業します。
- .env.exampleを参考に.envファイルを作る
- Auth0のアカウントを用意する
- Auth0のダッシュボードに移動し、「create a new client」(クライアントの新規作成)ボタンをクリックする
- 新規作成するアプリの名前を入力し、「Regular Web Applications」(標準のWebアプリケーション)を選択する
- 作成したAuth0クライアントアプリの「Settings」で、Allowed Callback URLs(許可されたコールバックURL)にhttp://localhost:8000を追加する
- client id(クライアントID)、client secret(クライアントシークレット)、domain (ドメイン)、callback url(コールバックURL)をコピーし、.envファイルの所定の変数に割り当てる
composer.jsonファイルにアプリケーションが必要とするパッケージの一覧が含まれています。ローカルマシンでcomposer installを実行してパッケージをインストールします。Composerについて詳しく知りたい場合は、この動画が参考になります。
アプリを実行すると以下のように表示されます。
アプリがローカルで動いていることが確認できました。次はデプロイです。アプリのルートディレクトリにProcfileを追加します。
拡張子なしのファイル「Procfile」を新規作成し、以下を追加します。
web: vendor/bin/heroku-php-apache2
Procfileはアプリケーションのルートディレクトリに設置するテキストファイルで、プロセスの種類を定義し、Herokuでアプリを起動する際に実行されるコマンドを明示的に宣言します。
WebサーバーにNginxを使いたい場合は、Procfileの内容を次のようにします。
web: vendor/bin/heroku-php-nginx
Procfileを追加したら、次はGitHubかBitbucketにプロジェクトをアップロードします。この記事のプロジェクトはstarwazappにあります。
dashboard.heroku.com/appsに移動し、アプリを新規作成します。
名前を入力します。
デプロイ方法を選んでください。今回はGitHubを使います。
GitHubは、開発とメンテナンスを円滑に進められます。開発者はGitのワークフローを使って新たな機能を開発できます。
丸で囲った箇所にリポジトリ名を入力し、Searchをクリックします。HerokuがユーザーのGitHubアカウント内にあるリポジトリを検索し表示します。
connectをクリックします。
Herokuをリポジトリに接続します。
下に少しスクロールします。ここが興味深い部分です。Herokuはボタンを押すだけで自動デプロイを有効にできます。また、継続的インテグレーションの手順をパスするまで本番環境へのデプロイを待つオプションも用意されています。実際のアプリではコードベース用にテストスイートがあるはずです。開発したコードをテストスイートで確認し、テストにパスしてからコードを本番環境にプッシュします。
クリックすると自動デプロイが有効になります。今回は継続的インテグレーションサービスを利用しないので、このオプションを有効にする必要はありません。次にmasterブランチをデプロイします。
補足:ほかのブランチを本番環境用のブランチに指定することも可能です。今回はmasterブランチを本番環境用のブランチにします。
Deploy branch(ブランチをデプロイする)をクリックします。Herokuがcomposer.lockファイルを読み込み、必要なパッケージをインストールして、デプロイします。
Viewボタンをクリックしてアプリを確認します。
環境変数をセットしていないため500エラーが出てしまいました。ローカルには.envファイルがありますが、Herokuにはありません。
環境変数をセットする方法が用意されています。ダッシュボードのSettingsに移動し、以下の環境変数をconfig variablesに追加します。
もう1つ。本記事はhttp://starwazapp.herokuapp.comが新たなコールバックURLです。新たなコールバックURLをAuth0のダッシュボードのAllowed Callback URLsに追加してください。
これでアプリは動くはずです。
小さな変更を加える
アプリに小さな変更を加えて、手軽に本番環境にデプロイする方法を解説します。
index.phpを開き、<p>タグの内容をHeard you don't want to migrate to PHP 7? Dare us!からStar Wars - The Awakening!に変更し、masterブランチにコミット、プッシュします。HerokuのダッシュボードにあるActivityタブを見ると、ビルドの通知があるはずです。アプリを再読み込みすれば変更が反映されます。
データベース、キャッシュ、cronジョブ
データベース、キャッシュ、cronジョブの操作について簡単に説明します。HerokuはPHPをClearDBやPostgresと組み合わせて使えます。ClearDBにアプリに追加する方法は以下の通りです。
heroku addons:create cleardb:ignite
このコマンドは新たなClearDBデータベースをセットアップし、アプリがデータベースにアクセスするために使うURLを返します。必要なことは、URLを環境変数としてアプリに追加することと、アプリの設定で次のようにURLをパースすることだけです。
ClearDBはクラウド環境でMySQLを使ったアプリケーションを作るための、強力でフォールトトレラントなDBaaSです。
<?php
$url = parse_url(getenv("CLEARDB_DATABASE_URL"));
$server = $url["host"];
$username = $url["user"];
$password = $url["pass"];
$db = substr($url["path"], 1);
$conn = new mysqli($server, $username, $password, $db);
?>
上記を微調整すればPDOにも使えます。次のようにPostgresをアプリに追加します。
heroku addons:create heroku-postgresql:hobby-dev
PHPアプリと組み合わせて使用可能なほかのデータベースはアドオンのページで確認できます。
Harokuではmemcache、fastly、ironcacheなどのキャッシュ用の各種アドオンを利用できます。HerokuでPHPアプリとmemcacheを組み合わせて使う方法はこちらを確認してください。
最後に、Heroku Schedulerを使えば指定した時間間隔でジョブを実行できます。
Google Cloud
Google Cloudプラットホームは世界中の企業がアプリのデプロイ、ホストに利用している、巨大で信頼性の高いクラウドプラットホームです。すべてのGoogle製品が稼働しているインフラストラクチャーと同じ場所で、自分たちのアプリを実行できるのです。何千から何百万ものユーザーに対応することが求められるアプリケーションのスケーラビリティにおいて、これほどまでに安心できる環境がほかにあるでしょうか?
Google CloudにはPHPアプリをホストするためのさまざまな選択肢が用意されています。プラットホームはApp Engine(フルマネージド)、Compute Engine(スケーラブルなVM)、Container Engine(Kubernetesクラスター)から選べます。
今回はApp Engineを使います。App Engineではインフラストラクチャーが抽象化されています。早速、スターウォーズアプリをGoogle App Engineにデプロイします。
Google App Engineでは「スタンダード環境」か「フレキシブル環境」を選びます。後者はフレキシブルという名が示すとおり、Debian Linuxで動作するすべてのPHPエクステンションをインストールできるほか、設定を変更可能なNginxサーバー、書き込み可能なファイルシステム、最新バージョンのPHPを備えており、さらにcomposer.jsonを使えばスクリプトもデプロイできます。
今回はフレキシブル環境を解説しましょう。プロジェクトを新規作成します。Createをクリックし、プロジェクト名を入力、アプリを提供する地域を選び、課金を有効にしてください。
補足:許可しないかぎり請求されません。
Google SDKをダウンロードして、Google Cloudツールをインストールします。
プロジェクトのルートに以下のapp.yamlファイルを作成します。
.envファイルはGoogle Cloudにプッシュ済みです。環境変数を設定には、次のようにapp.yamlファイルに環境変数を追加する方法もあります。
...
env_variables:
# The values here will override those in ".env". This is useful for
# production-specific configuration. However, feel free to set these
# values in ".env" instead if you prefer.
APP_LOG: errorlog
コンソールでgcloud app deployを実行してアプリケーションをデプロイします。
URLをAuth0のダッシュボードのAllowed Origins(許可された生成元:CORS)とAllowed Callback URLsに追加してください。URLは本記事の場合、https://starwars-166515.appspot.com/です。.envファイルのAUTH0_CALLBACK_URLにもURLを追加します。
gcloud app deployをもう一度実行し、新たなバージョンのアプリをセットアップします。アプリを確認すると動作しているはずです。
データベース、キャッシュ、cronジョブ
Google Cloudは「Cloud SQLインスタンス」というプラットホームを備えています。MySQLインスタンスの編集、接続、作成方法はこちらを確認してください。
Google App EngineではphpMyAdminも利用できます。
Google App Engineには標準のMemcacheとMemcachedのAPIも含まれます。Google CloudのアプリでMemcacheを使う方法はこちらを確認ください。
App Engine Cron Serviceで、定期スケジュールタスクを設定してタスクを指定した時間に動作させたり、一定間隔で動作させたりできます。Google CloudのPHPアプリでcronジョブのスケジュールを設定する方法やタスクキューを使う方法はこちらを確認ください。
Google CloudプラットホームにLaravel、Symfony、WordPressアプリをデプロイするのは比較的簡単です。
IBM BlueMix
IBM Bluemixは、強力で高性能なグローバル・クラウドインフラストラクチャーで簡単に設定、デプロイ、スケーリングができます。スターウォーズアプリをIBM Bluemixにデプロイします。
Bluemixにサインアップします。
補足:Bluemixプラットホームには30日間の無料試用期間があり、クレジットカード情報を送信する前にアプリケーションのデプロイを試せます。
組織(organization)とスペース(space)を作成します。記事ではスペース名をprodとしました。
Cloud Foundry CLIをインストールします。完了したら、ターミナルでログインします。
cf api https://api.ng.bluemix.net/
cf login
アプリのルートディレクトリにmanifest.ymlファイルを作成します。manifest.ymlファイルにはアプリ名、各インスタンスに割り当てるメモリ量、ルーティングなどのアプリの基本的な情報を格納します。manifestファイルを次のようにします。
---
applications:
- name: starwarsapp
memory: 512M
instances: 1
host: starwarsapp
ビルドパックをmanifestファイル内で明示的に指定できます。ただし、Cloud Foundryはアプリのプッシュ時に必要となるビルドパックを自動で検出します。
ビルドパックはアプリケーションで使用するフレームワークやランタイムをサポートします。ビルドパックの基本的な動作は、ユーザーの作成物を検査し、ダウンロードすべき依存オブジェクトとひもづけられたサービスとをやりとりするアプリケーションの設定方法を決定します。
最後に、次のコマンドを実行してアプリをデプロイします。
cf push <yourapp>
<yourapp>は各アプリ名です。
アプリを起動しください。URLは本記事の場合、starwarsapp.mybluemix.netです。500エラーになります。理由は、環境変数を読み込んでいないためです。Bluemixではどのように設定するのでしょうか?
Cloud Foundry CLI、Bluemixユーザーインターフェイスのどちらでも環境変数をセットできます。ここではBluemixユーザーインターフェイスを使います。以下の手順で実施してます。
-
- Bluemixのダッシュボードを開く
-
- アプリをクリックすると、アプリの詳細情報が載った別のページにリダイレクトされる
- 左のパネルにあるRuntimeを選択する
-
- Environment variables(環境変数)をクリックする
-
- 下にスクロールし、Addボタンをクリックして次のように環境変数を追加する
- Saveボタンをクリック。アプリが自動で再起動する
URLをAuth0のダッシュボードのAllowed Origins(CORS)とAllowed Callback URLsに追加してください。本記事の場合はhttps://starwarsapp.mybluemix.net/です。
アプリを確認してださい。動いているはずです。
データベース、キャッシュ、cronジョブ
Cloud Foundryで、さまざまなサービスを作成できます。IBM BluemixはCloudant NoSQLデータベース(BluemixにおけるCouchDBの名称)を利用できます。また、次のようにcfツールを使うとデータベースサービスを作成できます。
cf create-service cloudantNoSQLDB Lite starwarsapp
IBM BluemixはClearDB MySQLサービスも利用できます。次のようにcfツールでClearDB MySQLサービスを作成します。
cf create-service cleardb spark starwarsapp
MongoDB、PostgreSQL、RethinkDBも利用できます。
Cloud Foundryツールを使えばログ、環境変数をはじめ、さまざまなデータをいつでも確認できます。
- cf logs --recent yourapp:アプリのログを表示
- cf env yourapp:アプリに関連する環境変数を表示
- cf marketplace:Bluemixで利用できるすべてのサービスを表示
IBM BluemixならRedis Cloudも利用できます。Redis CloudはBlueMix内で高可用性、高スケーラビリティを実現しながらRedisデータセットをホスト、実行するためのフルマネージド・クラウドサービスです。
IBM BluemixはWorkload Schedulerサービスを提供しています。アプリケーションにワークフローのスケジューリング機能を統合し、cronの機能をはるかに上回るジョブスケジューリングをBluemix内外で使えるようになります。必要に応じて、定期的に実行するワークフロー、特定の時間に実行するワークフロー、イベント発生時(たとえば、ファイルが削除されたりアップロードされたとき)に実行するワークフローをアプリケーション内で簡単に作成できます。Workload Scheduler User InterfaceまたはAPIが利用可能です。
ジョブスケジューリングの方法はこちらで確認できます。
また、LaravelアプリをIBM Bluemixにデプロイする方法はこちらで確認できます。
Microsoft Azure
Microsoft Azureもまた、アプリを簡単にスケーリングできる強力なクラウドプラットホームです。スターウォーズアプリをAzureにデプロイしましょう。
Microsoft Azureでは、以下の方法でデプロイします。
- FTP
- クラウドフォルダーとの同期
- ローカルGit
- GitHubやBitbucketなどのクラウドベースのソース管理サービス
今回は、Gitでデプロイします。
-
- Microsoft Azureのアカウントを作成する
- 左のパネルからNewをクリックする
- Marketplaceをクリックし、続いてSee allをクリックする
- Web + SQLをクリックして作成
- 希望するサブスクリプションの種類を選択する。今回はFree Trial(無料試用版)を選択する。無料試用版では200ドルのAzureクレジットが提供される
- アプリ名を入力し、SQLデータベースを作成。今回のアプリではデータベースは不要だが、Azureでは必ず作成しなければならない
- 作成したアプリの左のパネルにあるApp Servicesをクリックしてアプリを確認する
- アプリをクリックし、Deployment optionsを選択後、GitHubをクリックする
- リポジトリへのアクセスを許可し、プロジェクトとブランチを選ぶ。本記事ではazureブランチを使ってコードをAzureプラットホームにデプロイする
- デプロイ通知を確認する
http://[yoursitename].azurewebsites.netを確認する。本記事では、http://starwarzapp.azurewebsites.netになる。HTTP500エラーになる。環境変数を設定する必要がある
- App Servicesでアプリを選び、Application Settingsをクリックする。右側に環境変数を追加する
URLをAuth0のダッシュボードのAllowed Origins(CORS)とAllowed Callback URLsに追加してください。本記事の場合はhttp://starwarzapp.azurewebsites.net/です。
- デフォルトでは、Azureのデプロイメントはcomposer.jsonファイルやcomposer.lockファイルを使わない。つまり、パッケージはなにもインストールされない。App Servicesに戻り、アプリをクリック後、Development Toolsに移動しExtensionを選択する。Composerエクステンションを選び、利用条件に同意する
- アプリを少し変更し、GitHubにもう一度プッシュする。以下のようにデプロイされる
- 再びアプリを確認する。動作しているはず
データベース、キャッシュ、cronジョブ
Microsoft Azureでは、人気のオープンソースRedis cacheをベースにしたAzure Redis Cacheを利用できます。簡単に作成、使用できます。
- New > Data + Storage > Redis Cacheをクリックする
- キャッシュ名を入力し、地域を選択して作成する
使い方はドキュメントを確認してください。
スケジューリングとタスクの実行は、AzureのSchedulerで以下の機能が利用可能です。
- Azure内外のサービス呼び出し
- 任意のスケジュールでジョブを実行
- Azure Storageキューを使って実行に長い時間がかかるジョブやオンラインジョブを処理
- Azure Service Busキューを起動
Schedulerを使ってジョブを作成、管理する方法はこちらを確認ください。
データベースのセットアップについてはアプリのデプロイ中に少し触れましたが、MySQLデータベースのセットアップ方法を簡単に解説します。
- Azure Portalにログインする
- ダッシュボードの左のパネルにあるNewをクリックする。MarketplaceのData + Storageを選択し、MySQLデータベースを選択する
- 新たなMySQLデータベースを設定する。名前を入力し、サブスクリプション、場所を選択し、そのほかの必要なフィールドを入力し、データベースを作成する
- データベースに接続する
Laravel開発者はAzureを利用すればアプリにMySQLデータベースを簡単に設定できます。
Amazon Web Services
AWS(Amazon Web Services)を利用して画像やmp3ファイル、動画といった各種データを保存する企業は増加傾向にあり、利用者数はクラウドプラットホーム中で最大です。Uber、Spotify、Salesforceなど数多くの組織がホスト、デプロイ、インフラストラクチャー構築にAmazon Web Servicesの機能を最大限活用しています。AWSには開発者向けのプロダクトが数多く用意されています。
スターウォーズアプリをデプロイするためにAmazon Elastic Beanstalkを使います。早速始めましょう。
- AWSアカウントをまだ持っていない場合はサインアップ
- Elastic Beanstalkコンソールに移動
- アプリを新規作成
- create web serverをクリック
- Webサーバー環境を作成
- コードをアップロードする。Elastic Beanstalkではコードべースをzipファイルにしてアップロードする必要がある。手作業でもzipを作成できるが、個人的にはターミナルからzip ../starwarsapp.zip -r * .[^.]*によってzipを作成する方法がおすすめだ
- AWSへアップロードする
- アプリのURLを利用可能か確認する。本記事の場合は以下の通り
- 次のページではデータベースインスタンスの設定が可能。今回のアプリはデータベースは不要なのでスキップする
- 詳細情報を編集する。今回のアプリはデフォルト設定のままで問題ない
- 環境変数を追加する
URLをAuth0のダッシュボードのAllowed Origins(CORS)とAllowed Callback URLsに追加してください。本記事の場合はhttp://starwarzapp.us-west-2.elasticbeanstalk.comです。URLをElastic Beanstalkの環境変数に追加することも忘れずに実施してください。
- 次のようにPermissionを追加する
- 起動する前に内容を確認する
- 起動する
下記項目のデプロイ方法はそれぞれリンク先を確認してください。
- LaravelアプリをElastic Beanstalkにデプロイ
- CakePHPアプリをElastic Beanstalkにデプロイ
- Symfony2アプリをElastic Beanstalkにデプロイ
- WordPressのWebサイトをElastic Beanstalkにデプロイ
- DrupalのWebサイトをElastic Beanstalkにデプロイ
データベース、キャッシュ、cronジョブ
Amazon Relational Database Service(Amazon RDS)のデータベースインスタンスを使ってアプリケーションが収集、加工したデータを保存できます。 データベースは環境内に追加しElastic Beanstalkに管理させることも、外部に作成し管理することもできます。データベースインスタンスは簡単な方法でアプリに追加できます。
キャッシュは、Amazon Web ServicesのElastiCacheを利用できます。ElastiCacheはクラウド環境においてインメモリデータストアやキャッシュを容易にデプロイ、運用、スケーリングできるようにするためのWebサービスです。Amazon ElastiCacheは以下の2種類のオープンソースインメモリエンジンをサポートしています。
- Redis
- Memcached
Amazon ElastiCacheは障害の発生したノードを自動で検出し交換するため、インフラストラクチャーの管理に伴うオーバーヘッドを削減できます。また、データベースが過負荷状態になるリスクを低減でき、Webサイトの速度低下やアプリケーションの読み込み時間増加の防止、システムの耐性を高められます。Amazon ElastiCacheをAmazon CloudWatchと統合すれば、RedisやMemcachedのノードに関する主要なパフォーマンス指標の可視性を強化できます。
AirBnb、Healthguru、PlaceIQ、Tokyo Data Networkといった企業がElastiCacheを利用して、HTMLフラグメントから負荷の高いデータベースクエリ、一時的なセッションデータ、検索結果に渡るさまざまなデータをキャッシュしています。
PHP用にElastiCache Cluster Clientをインストールする方法はこちらを確認してください。
ElastiCacheとElastic Beanstalkを使ってPHPでアクセスカウンターを構築した記事も参考になります。
Elastic Beanstalkではcronジョブをセットアップできます。cronジョブの実行方法はAmazon Web Services(AWS) Elastic Beanstalkを確認ください。
Laravel Forge
Laravel ForgeはTaylor Otwell氏が作成した、アプリケーションを短時間でデプロイし起動できるプラットホームです。難しい作業はLaravel Forgeが代わりに実行します。ForgeはLinode、Digital Ocean、AWSといった各クラウドホスティングプロバイダーにサーバーをセットアップする作業を支援します。当初はLaravelアプリ用に作られましたが、現在では実質的にすべてのPHPアプリケーションをサポートしています。
Laravel Forgeを使えばサーバーのセットアップ以外にも次のことが簡単にできます。
- LetsEncryptと統合し無料のSSL証明書を生成
- ジョブやキューの容易な管理
- サーバーの管理ダッシュボードをチーム内で共有
Matt Stauffer氏がLaravelアプリのForgeへのデプロイに関するすばらしい記事を投稿しています。
James Fairhurst氏によるLaravel Forgeを使ってAWSサーバーをセットアップするための優れたガイドもあります。
PHPの教育プラットホームとしてもっとも人気のあるlaracasts.comには、Forgeを使ってサーバー管理するためのチュートリアル一覧が用意されています。
Envoyer
EnvoyerはEnvoyのSaaSバージョンで、PHPをあっという間にデプロイできるプラットホームです。Envoyerを使えば、Gitlab、Slack、Bitbucketなどさまざまなサービスと統合できます。
Envoyerでは以下の機能を利用できます。
- デプロイを円滑にロールバック
- 複数のサーバーにデプロイ
- cronジョブのモニタリング
- アプリケーションのヘルスチェック
Deployer
DeployerはPHP用のデプロイツールです。以下の機能を利用できます。
- タスクの並列実行
- 自動デプロイ
- ロールバック
- レシピという形でデプロイスクリプトを作成
DeployerはLaravel、Symfony、CakePHP、Yiiframework、Zend、FuelPHP、Drupal、WordPress、Magentoをサポートしています。Deployerを使ったPHPアプリのデプロイに関するすばらしい記事があるので読んでください。
最後に
PHPアプリケーションをデプロイするための選択肢は複数あり、すべてを紹介できません。PHPは企業システムの開発言語として長年進化し続けており、PHPアプリをローカルマシンから本番環境により効率良くデプロイする方法が求められています。このガイドで、PHPアプリを主要なクラウドプロバイダーにデプロイするための基礎はすべて押さえられているはずです。
しかし、PHPアプリケーションのデプロイについて幅広い知識を学びたいという場合は、リンク先のリソースを読むことをおすすめします。
この記事はAuth0のブログで公開されたものを許可を得て再掲載しています。
(原文:The Ultimate Guide to Deploying PHP Apps in the Cloud)
[翻訳:薮田佳佑/編集:Livit]