チュートリアル: Azure App Service で PHP (Laravel) と MySQL フレキシブル サーバーのアプリをビルドする
適用対象: Azure Database for MySQL - フレキシブル サーバー
Azure App Service は、Linux オペレーティング システムを使用する、高度にスケーラブルな自己適用型の Web ホスティング サービスを提供します。 このチュートリアルでは、MySQL データベース (Azure Database for MySQL - フレキシブル サーバーを使います) に接続された Azure App Service で、セキュリティで保護された PHP アプリを作成する方法について説明します。 このチュートリアルを終了すると、Azure App Service on Linux で実行される Laravel アプリが完成します。
このチュートリアルでは、以下の内容を学習します。
- 既定でセキュリティ保護された PHP と MySQL のアプリを Azure で作成する
- アプリ設定を使って、MySQL への接続シークレットを構成する
- GitHub Actions を使ってアプリケーションのコードをデプロイする
- アプリを更新して再デプロイする
- データベースの移行を安全に実行する
- Azure から診断ログをストリーミングする
- Azure Portal でアプリを管理する
前提条件
- Azure サブスクリプション Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。 Azure 無料アカウントがあれば、Azure Database for MySQL - フレキシブル サーバーを 12 か月間無料でお試しいただけます。 詳細な情報については、「フレキシブル サーバーを無料で試す」を参照してください。
サンプル アプリケーション
このチュートリアルに従うには、リポジトリからサンプル アプリケーションをクローンまたはダウンロードします。
git clone https://github.com/Azure-Samples/laravel-tasks.git
アプリケーションをローカルで実行したい場合は、次のようにします。
.env で、ローカルの MySQL データベースの設定を使ってデータベース設定 (
DB_DATABASE
、DB_USERNAME
、DB_PASSWORD
など) を構成します。 このサンプルを実行するには、ローカルの MySQL サーバーが必要です。リポジトリのルートから、次のコマンドで Laravel を起動します。
composer install php artisan migrate php artisan key:generate php artisan serve
1 - App Service と MySQL リソースの作成
この手順では、Azure リソースを作成します。 このチュートリアルで使う手順では、既定でセキュリティ保護された App Service と Azure Database for MySQL - フレキシブル サーバーの構成が作成されます。 作成手順では、次のように指定します。
- 名前: Web アプリの名前。 Web アプリの DNS 名の一部として
https://<app-name>.azurewebsites.net
の形式で使われる名前です。 - アプリのランタイム。 ここで、アプリに使う PHP のバージョンを選びます。
- アプリのリソース グループ。 リソース グループを使うと、アプリケーションに必要なすべての Azure リソースを (論理コンテナーに) グループ化できます。
Azure portal にサインインし、以下の手順に従って Azure App Service リソースを作成します。
手順 | Screenshot |
---|---|
Azure portal で次の操作を行います。
|
![]() |
[Web アプリとデータベースの作成] ページで、次のようにフォームに入力します。
|
![]() |
デプロイは数分で完了し、次のリソースが作成されます。
|
![]() |
2 - データベース接続の設定
作成ウィザードによってデータベースへの接続文字列が生成されましたが、まだコードに使用できる形式ではありません。 この手順では、アプリに必要な形式でアプリ設定を作成します。
手順 | Screenshot |
---|---|
App Service ページの左側メニューで、[構成] を選びます。 | ![]() |
[構成] ページの [アプリケーション設定] タブで、DB_DATABASE 設定を作成します。
|
![]() |
[アプリケーション設定] タブに戻ります。
|
![]() |
アプリ設定の作成と同じ手順に従って、次の追加アプリ設定を作成します。
|
![]() |
3 - サンプル コードのデプロイ
この手順では、GitHub Actions を使って GitHub のデプロイを構成します。 これは、App Service にデプロイする多くの方法の 1 つにすぎませんが、デプロイ プロセスで継続的インテグレーションを実現する優れた方法でもあります。 既定では、GitHub リポジトリに git push
があるたびにビルドとデプロイのアクションが起動されます。 Visual Studio Code を使ってブラウザーで直接コードベースに変更を加え、GitHub Actions で自動的にデプロイできるようにします。
4 - データベース スキーマの生成
作成ウィザードでは、MySQL データベース サーバーをプライベート エンドポイントの背後に配置し、仮想ネットワークからのみアクセスできるようにします。 App Service アプリは既に仮想ネットワークと統合されているため、データベースでデータベース移行を実行するには、App Service コンテナー内から直接実行するのが最も簡単な方法です。
手順 | Screenshot |
---|---|
App Service ページで次を行います。
https://<app-name>.scm.azurewebsites.net/webssh/host に移動することもできます。 |
![]() |
SSH ターミナルで次を行います。
|
![]() |
5 - サイト ルートの変更
Laravel アプリケーションのライフサイクルは、代わりに /public ディレクトリで開始されます。 App Service の既定の PHP 8.0 コンテナーでは、アプリケーションのルート ディレクトリで起動する Nginx が使われます。 サイト ルートを変更するには、PHP 8.0 コンテナー内 (/etc/nginx/sites-available/default) の Nginx 構成ファイルを変更する必要があります。 便宜上、サンプル リポジトリには default というカスタム構成ファイルが含まれています。 前述のとおり、アプリの再起動後に変更内容が失われるため、SSH シェルを使ってこのファイルを置き換える必要はありません。
6 - アプリの参照
手順 | Screenshot |
---|---|
App Service ページで次を行います。
|
![]() |
リストにいくつかのタスクを追加します。Azure App Service でデータ主導型の PHP アプリが実行されています。 | ![]() |
7 - 診断ログのストリーミング
手順 | Screenshot |
---|---|
App Service ページで次を行います。
|
![]() |
左側のメニューから [ログ ストリーム] をクリックします。プラットフォーム ログとコンテナー内のログを含む、アプリのログが表示されます。 | ![]() |
リソースをクリーンアップする
完了したら、リソース グループを削除することで、Azure サブスクリプションからすべてのリソースを削除できます。
手順 | Screenshot |
---|---|
Azure portal の上部にある検索バーで次を行います。
|
![]() |
[リソース グループ] ページで、 |
![]() |
|
![]() |
よく寄せられる質問
- この設定にはいくらかかりますか。
- 仮想ネットワークの背後にセキュリティ保護されている MySQL データベースに他のツールで接続するにはどうすればよいですか。
- GitHub Actions でのローカル アプリの開発はどのように行いますか。
- GitHub Actions のデプロイが遅いのはなぜですか。
この設定にはいくらかかりますか。
作成リソースの価格は次のとおりです。
- App Service プランは Premium V2 レベルで作成され、スケールアップまたはスケールダウンできます。 「App Service の価格」をご覧ください。
- MySQL フレキシブル サーバーは B1ms レベルで作成され、スケールアップまたはスケールダウンできます。 Azure 無料アカウントでは、B1ms レベルは 12 か月間、月間の上限まで無料です。 「Azure Database for MySQL の価格」をご確認ください。
- 仮想ネットワークでは、ピアリングなどの追加機能を構成しない限り、料金は発生しません。 「Azure Virtual Network の価格」を参照してください。
- プライベート DNS ゾーンでは、少額の料金が発生します。 「Azure DNS の価格」を参照してください。
仮想ネットワークの背後にセキュリティ保護されている MySQL データベースに他のツールで接続するにはどうすればよいですか。
- コマンドライン ツールからの基本的なアクセスには、アプリの SSH ターミナルから
mysql
を実行できます。 - MySQL Workbench のようなデスクトップ ツールから接続するには、マシンが仮想ネットワーク内にある必要があります。 たとえば、サブネットの 1 つに接続されている Azure VM、または Azure 仮想ネットワークとサイト間 VPN で接続されているオンプレミス ネットワーク内のマシンが該当します。
- また、仮想ネットワークに Azure Cloud Shell を統合することもできます。
GitHub Actions でのローカル アプリの開発はどのように行いますか。
App Service から自動生成されたワークフロー ファイルを例にとると、git push
ごとに新しいビルドとデプロイの実行が起動されます。 GitHub リポジトリのローカル クローンから、必要な更新を行い、それを GitHub にプッシュします。 次に例を示します。
git add .
git commit -m "<some-message>"
git push origin main
GitHub Actions のデプロイが遅いのはなぜですか。
App Service から自動生成されるワークフロー ファイルは、ビルドしてからデプロイする、2 つのジョブの実行を定義しています。 各ジョブは独自のクリーンな環境で実行されるため、ワークフロー ファイルでは deploy
ジョブが build
ジョブからのファイルに確実にアクセスできるようにします。
build
ジョブの終了時に、ファイルを成果物としてアップロードします。deploy
ジョブの開始時に、成果物をダウンロードします。
2 つのジョブのプロセスでかかる時間のほとんどは、成果物のアップロードとダウンロードに費やされます。 必要であれば、2 つのジョブを 1 つにまとめて、アップロードとダウンロードの手順を不要にすることで、ワークフロー ファイルを簡略化することができます。
まとめ
このチュートリアルでは、次の作業を行う方法を学びました。
- 既定でセキュリティ保護された PHP と MySQL のアプリを Azure で作成する
- アプリ設定を使って、MySQL への接続シークレットを構成する
- GitHub Actions を使ってアプリケーションのコードをデプロイする
- アプリを更新して再デプロイする
- データベースの移行を安全に実行する
- Azure から診断ログをストリーミングする
- Azure Portal でアプリを管理する