チュートリアル: PHP、MySQL、Redis アプリを Azure App Service にデプロイする

このチュートリアルでは、MySQL データベース (Azure Database for MySQL フレキシブル サーバーを使います) に接続された Azure App Service で、セキュリティで保護された PHP アプリを作成する方法について説明します。 また、アプリケーションでキャッシュ コードを有効にする Azure Cache for Redis もデプロイします。 Azure App Service は、高いスケーラビリティを備え、パッチを自己適用する Web ホスティング サービスであり、アプリを Windows または Linux に簡単にデプロイできます。 このチュートリアルを終了すると、Azure App Service on Linux で実行される Laravel アプリが完成します。

Screenshot of the Azure app example titled Task List showing new tasks added.

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

サンプル アプリケーション

このチュートリアルに従うには、リポジトリからサンプルの Laravel アプリケーションをクローンまたはダウンロードします。

git clone https://github.com/Azure-Samples/laravel-tasks.git

アプリケーションをローカルで実行したい場合は、次のようにします。

  • .env で、ローカルの MySQL データベースの設定を使ってデータベース設定 (DB_DATABASEDB_USERNAMEDB_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 リソースを作成します。

手順 1: Azure portal 内で次を実行します。

  1. Azure portal の上部にある検索バーに「Web app database」と入力します。
  2. [Marketplace] の見出しの下にある [Web アプリとデータベース] というラベルの付いた項目を選びます。 作成ウィザードに直接移動することもできます。

A screenshot showing how to use the search box in the top tool bar to find the Web App + Database creation wizard.

手順 2:[Web アプリとデータベースの作成] ページ内で、このフォームに次のように入力します。

  1. [リソース グループ][新規作成] を選び、名前として msdocs-laravel-mysql-tutorial を使います。
  2. リージョン → 任意の近くの Azure リージョン。
  3. [名前]msdocs-laravel-mysql-XYZ。ここで XYZ は任意のランダムな 3 文字です。 この名前は Azure 全体で一意である必要があります。
  4. [ランタイム スタック]PHP 8.2
  5. Add Azure Cache for Redis? (Azure Cache for Redis を追加しますか?)はい
  6. ホスティング プラン → Basic 準備ができたら、後で運用価格レベルにスケールアップできます。
  7. MySQL - フレキシブル サーバーは、既定でデータベース エンジンとして選ばれています。 Azure Database for MySQL は、Azure 上のサービスとしてフル マネージドな MySQL データベースで、最新のコミュニティ エディションと互換性があります。
  8. [Review + create](レビュー + 作成) を選択します。
  9. 検証が完了した後、 [作成] を選択します。

A screenshot showing how to configure a new app and database in the Web App + Database wizard.

手順 3: このデプロイは完了するまでに数分かかります。 デプロイが完了したら、[リソースに移動] ボタンを選択します。 App Service アプリに直接移動しますが、次のリソースが作成されます。

  • リソース グループ → 作成されたすべてのリソースのコンテナーです。
  • App Service プラン → App Service のコンピューティング リソースを定義します。 Basic レベルの Linux プランが作成されます。
  • App Service → アプリを表し、App Service プランで実行されます。
  • 仮想ネットワーク → App Service アプリと統合され、バックエンドのネットワーク トラフィックを分離します。
  • プライベート エンドポイント → 仮想ネットワーク内のデータベース サーバーと Redis キャッシュのアクセス エンドポイント。
  • ネットワーク インターフェイス → プライベート エンドポイントごとに 1 つのプライベート IP アドレスを表します。
  • Azure Database for MySQL フレキシブル サーバー → プライベート エンドポイントの背後からのみアクセスできます。 サーバー上にデータベースとユーザーが作成されます。
  • Azure Cache for Redis → プライベート エンドポイントの背後からのみアクセスできます。
  • プライベート DNS ゾーン → 仮想ネットワーク内のデータベース サーバーと Redis キャッシュの DNS 解決を有効にします。

A screenshot showing the deployment process completed.

2 - データベース接続の設定

手順 1: [App Service] ページの左側メニューで、[構成] を選択します。

A screenshot showing how to open the configuration page in App Service.

手順 2:

  1. AZURE_MYSQL_ で始まるアプリ設定を見つけます。 それらは、作成ウィザードによって新しい MySQL データベースから生成されました。
  2. また、AZURE_REDIS_ で始まるアプリ設定を見つけます。 それらは、作成ウィザードによって新しい Redis キャッシュから生成されました。 アプリケーションを設定するには、この名前が必要になります。
  3. 必要に応じて、各設定の右側にある [編集] ボタンを選択し、その値を表示またはコピーできます。 後で、これらの設定を使用するようにアプリケーション コードを変更します。

A screenshot showing how to create an app setting.

手順 3: [構成] ページの [アプリケーション設定] タブで、CACHE_DRIVER 設定を作成します。

  1. [新しいアプリケーション設定] を選択します。
  2. [名前] フィールドに「CACHE_DRIVER」と入力します。
  3. [値] フィールドに、「redis」と入力します。
  4. [OK] を選択します。 CACHE_DRIVER は Laravel アプリケーション コードで既に使用されています。 この設定は、Laravel のキャッシュとして Redis を使用するように指示します。

A screenshot showing how to see the autogenerated connection string.

手順 4:手順 3 の同じ手順を使用して、次のアプリ設定を作成します。

  • MYSQL_ATTR_SSL_CA: /home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem を値として使用します。 このアプリ設定は、MySQL サーバーにアクセスするために必要な TLS/SSL 証明書のパスを指すものです。 便宜上、サンプル リポジトリに含まれています。
  • LOG_CHANNEL: 値として stderr を使用します。 この設定は、ログを stderr にパイプするよう Laravel に指示します。これにより、App Service のログで stderr を使用できるようになります。
  • APP_DEBUG: true を値として使います。 これは、デバッグ モード ページを有効にする Laravel デバッグ変数です。
  • APP_KEY: base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= を値として使います。 これは Laravel の暗号化変数です。
  1. 上部のメニュー バーで [保存] を選択します。
  2. メッセージが表示されたら、[Continue](続行) を選択します。

A screenshot showing how to save settings in the configuration page.

重要

ここで使われている APP_KEY の値は便宜的なものです。 運用環境のシナリオでは、コマンドラインで php artisan key:generate --show を使って、デプロイ用に特別に生成する必要があります。

3 - サンプル コードのデプロイ

この手順では、GitHub Actions を使って GitHub のデプロイを構成します。 これは、App Service にデプロイする多くの方法の 1 つにすぎませんが、デプロイ プロセスで継続的インテグレーションを実現する優れた方法でもあります。 既定では、GitHub リポジトリに git push があるたびにビルドとデプロイのアクションが起動されます。 Visual Studio Code を使ってブラウザーで直接コードベースに変更を加え、GitHub Actions で自動的にデプロイできるようにします。

手順 1: 新しいブラウザー ウィンドウ内で次を実行します。

  1. GitHub アカウントにサインインします。
  2. https://github.com/Azure-Samples/laravel-tasks に移動します。
  3. [Fork] を選択します。
  4. [Create fork] (フォークの作成) を選択します。

A screenshot showing how to create a fork of the sample GitHub repository.

手順 2: GitHub のページで、. キーを押して、ブラウザーで Visual Studio Code を開きます。

A screenshot showing how to open the Visual Studio Code browser experience in GitHub.

手順 3: ブラウザーの Visual Studio Code で、config/database.php をエクスプローラーで開きます。 mysql セクションを探し、次の変更を行います。

  1. DB_HOSTAZURE_MYSQL_HOST で置き換え
  2. DB_DATABASEAZURE_MYSQL_DBNAME で置き換え
  3. DB_USERNAMEAZURE_MYSQL_USERNAME で置き換え
  4. DB_PASSWORDAZURE_MYSQL_PASSWORD で置き換え
  5. DB_PORTAZURE_MYSQL_PORT で置き換え これらの AZURE_MYSQL_ 設定は、作成ウィザードによって自動的に作成されていることに注意してください。

A screenshot showing Visual Studio Code in the browser and an opened file with modified MySQL variables.

手順 4:config/database.php で、Redis cache セクションまでスクロールし、次の変更を行います。

  1. REDIS_HOSTAZURE_REDIS_HOSTに置き換えます。
  2. REDIS_PASSWORDAZURE_REDIS_PASSWORD で置き換え
  3. REDIS_PORTAZURE_REDIS_PORT で置き換え
  4. REDIS_CACHE_DBAZURE_REDIS_DATABASE で置き換え
  5. 同じセクションで、'scheme' => 'tls', を含む行を追加します。 この構成は、暗号化を使用して Redis に接続するよう Laravel に指示します。 これらの AZURE_REDIS_ 設定は、作成ウィザードによって自動的に作成されていることに注意してください。

A screenshot showing Visual Studio Code in the browser and an opened file with modified Redis variables.

手順 5:

  1. [ソース管理] 拡張機能を選びます。
  2. テキスト ボックスに、Configure DB & Redis variables のようなコミット メッセージを入力します。
  3. [コミットしてプッシュ] を選択します。

A screenshot showing the changes being committed and pushed to GitHub.

手順 6: [App Service] ページに戻り、左側のメニューから [デプロイ センター] を選びます。

A screenshot showing how to open the deployment center in App Service.

手順 7: デプロイ センターのページで次を行います。

  1. [ソース] で、[GitHub] を選びます。 既定では、ビルド プロバイダーとして GitHub Actions が選ばれます。
  2. GitHub アカウントにサインインし、プロンプトに従って Azure を承認します。
  3. [組織] で、自分のアカウントを選びます。
  4. [リポジトリ] で、[laravel-task] を選びます。
  5. [ブランチ][main] を選びます。
  6. 上部のメニューから、[保存] を選択します。 App Service は、選んだ GitHub リポジトリの .github/workflows ディレクトリに、ワークフロー ファイルをコミットします。

A screenshot showing how to configure CI/CD using GitHub Actions.

手順 8: デプロイ センターのページで次を行います。

  1. [ログ] を選択します。 デプロイの実行は既に開始されています。
  2. デプロイの実行のログ項目で、[ビルドまたはデプロイ ログ] を選びます。

A screenshot showing how to open deployment logs in the deployment center.

手順 9: GitHub リポジトリにアクセスし、GitHub アクションが実行されていることを確認します。 ワークフロー ファイルでは、ビルドとデプロイという 2 つの異なるステージを定義します。 GitHub が実行されて、[完了] の状態が表示されるまで待ちます。 約 15 分ほどかかります。

A screenshot showing a GitHub run in progress.

4 - データベース スキーマの生成

作成ウィザードでは、MySQL データベース サーバーをプライベート エンドポイントの背後に配置し、仮想ネットワークからのみアクセスできるようにします。 App Service アプリは既に仮想ネットワークと統合されているため、データベースでデータベース移行を実行するには、App Service コンテナー内から直接実行するのが最も簡単な方法です。

手順 1: [App Service] ページに戻り、左側のメニュー内で [SSH] を選びます。

A screenshot showing how to open the SSH shell for your app from the Azure portal.

手順 2: SSH ターミナル内で次を実行します。

  1. cd /home/site/wwwroot を実行します。 デプロイされたすべてのファイルがここにあります。
  2. php artisan migrate --force を実行する。 それに成功すると、App Service は MySQL データベースに正常に接続した状態になります。 /home 内のファイルへの変更のみが、アプリの再起動後も保持されます。 /home の外部の変更は永続化されません。

A screenshot showing the commands to run in the SSH shell and their output.

5 - サイト ルートの変更

Laravel アプリケーションのライフサイクルは、代わりに /public ディレクトリで開始されます。 App Service の既定の PHP コンテナーでは、アプリケーションのルート ディレクトリで起動する Nginx が使われます。 サイト ルートを変更するには、PHP コンテナー内 (/etc/nginx/sites-available/default) の Nginx 構成ファイルを変更する必要があります。 便宜上、サンプル リポジトリには default というカスタム構成ファイルが含まれています。 前述のとおり、変更は /home の外部で行われ、アプリの再起動後に変更内容が失われるため、SSH シェルを使ってこのファイルを置き換える必要はありません。

手順 1:

  1. 左側のメニューから、[構成] を選択します。
  2. [全般設定] タブを選択します。

A screenshot showing how to open the general settings tab in the configuration page of App Service.

手順 2: [全般設定] タブで次を行います。

  1. [スタートアップ コマンド] ボックスに、cp /home/site/wwwroot/default /etc/nginx/sites-available/default > service nginx reload というコマンドを入力します。
  2. [保存] を選択します。 このコマンドは、PHP コンテナー内の Nginx 構成ファイルを置き換え、Nginx を再起動させます。 この構成により、コンテナーの起動時に毎回同じ変更が行われるようになります。

A screenshot showing how to configure a startup command in App Service.

6 - アプリの参照

手順 1: [App Service] ページ内で、次を実行します。

  1. 左側のメニューから [概要] を選びます。
  2. アプリの URL を選びます。 直接、https://<app-name>.azurewebsites.net に移動することもできます。

A screenshot showing how to launch an App Service from the Azure portal.

手順 2: この一覧にいくつかのタスクを追加します。 セキュリティで保護されたデータ主導型の PHP アプリが Azure App Service で実行されています。

A screenshot of the Laravel app running in App Service.

ヒント

サンプル アプリケーションでは、キャッシュ アサイド パターンが実装されています。 データを変更した後にページを再読み込みすると、データベースではなくキャッシュからデータが読み込まれるため、Web ページの応答時間が大幅に短縮されます。

7 - 診断ログのストリーミング

Azure App Service は、アプリケーションの問題を診断するために、コンソールに記録されたすべてのメッセージをキャプチャします。 サンプル アプリは、この機能を示すために、各エンドポイントにコンソール ログ メッセージを出力します。 既定では、Laravel のログ機能 (例: Log::info()) はローカル ファイルに出力されます。 以前の LOG_CHANNEL アプリ設定は、App Service ログ ストリームからログ エントリにアクセスできるようにします。

手順 1: [App Service] ページ内で、次を実行します。

  1. 左側のメニューから、[App Service ログ] を選びます。
  2. [アプリケーション ログ記録][ファイル システム] を選びます。

A screenshot showing how to enable native logs in App Service in the Azure portal.

手順 2:左側のメニューから [ログ ストリーム] を選択します。 プラットフォーム ログとコンテナー内のログを含む、アプリのログが表示されます。

A screenshot showing how to view the log stream in the Azure portal.

リソースをクリーンアップする

完了したら、リソース グループを削除することで、Azure サブスクリプションからすべてのリソースを削除できます。

手順 1: Azure portal の上部にある検索バーで次を行います。

  1. リソース グループ名を入力します。
  2. リソース グループを選択します。

A screenshot showing how to search for and navigate to a resource group in the Azure portal.

手順 2: [リソース グループ] ページ内で、[リソース グループの削除] を選びます。

A screenshot showing the location of the Delete Resource Group button in the Azure portal.

ステップ 3:

  1. リソース グループの名前を入力して、削除を確定します。
  2. [削除] を選択します。

A screenshot of the confirmation dialog for deleting a resource group in the Azure portal. :

よく寄せられる質問

この設定にはいくらかかりますか。

作成リソースの価格は次のとおりです。

  • App Service プランは Basic レベルで作成され、スケールアップまたはスケールダウンできます。 「App Service の価格」をご覧ください。
  • MySQL フレキシブル サーバーは B1ms レベルで作成され、スケールアップまたはスケールダウンできます。 Azure 無料アカウントでは、B1ms レベルは 12 か月間、月間の上限まで無料です。 「Azure Database for MySQL の価格」をご確認ください。
  • Azure Cache for Redis は、最小キャッシュ サイズの Basic レベルで作成されます。 このレベルには少ないコストがかかります。 高い可用性、クラスタリング、およびその他の機能のために、より高いパフォーマンス レベルにスケールアップできます。 「Azure Cache for Redis の価格」を参照してください。
  • 仮想ネットワークでは、ピアリングなどの追加機能を構成しない限り、料金は発生しません。 「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 ジョブからのファイルに確実にアクセスできるようにします。

2 つのジョブのプロセスでかかる時間のほとんどは、成果物のアップロードとダウンロードに費やされます。 必要であれば、2 つのジョブを 1 つにまとめて、アップロードとダウンロードの手順を不要にすることで、ワークフロー ファイルを簡略化することができます。

次の手順

次のチュートリアルに進み、カスタム ドメインと証明書を使用してアプリをセキュリティで保護する方法を学習してください。

または、他のリソースを参照してください。