チュートリアル: 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 アプリが完成します。

Task List という Azure サンプル アプリに新しいタスクが追加された画面のスクリーンショット。

このチュートリアルでは、以下の内容を学習します。

  • 既定でセキュリティ保護された 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_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 リソースを作成します。

手順 Screenshot
Azure portal で次の操作を行います。
  1. Azure portal の上部にある検索バーに「Web app database」と入力します。
  2. [Marketplace] の見出しの下にある [Web アプリとデータベース] というラベルの付いた項目を選びます。
作成ウィザードに直接移動することもできます。
上部にあるツール バーの検索ボックスを使用して、Web アプリとデータベースの作成ウィザードを検索する方法を示すスクリーンショット。
[Web アプリとデータベースの作成] ページで、次のようにフォームに入力します。
  1. [リソース グループ][新規作成] を選び、名前として msdocs-laravel-mysql-tutorial を使います。

  2. リージョン → 任意の近くの Azure リージョン。

  3. [名前]msdocs-laravel-mysql-XYZ。ここで XYZ は任意のランダムな 3 文字です。 この名前は Azure 全体で一意である必要があります。

  4. [ランタイム スタック]PHP 8.0

    MySQL - フレキシブル サーバーは、既定でデータベース エンジンとして選ばれています。 Azure Database for MySQL は、Azure 上のサービスとしてフル マネージドな MySQL データベースで、最新のコミュニティ エディションと互換性があります。

  5. 生成されるデータベース名 (<app-name>-database) をメモします。 この情報は後で必要になります。

  6. [Review + create](レビュー + 作成) をクリックします。

検証が完了したら、[作成] をクリックします。
[Web アプリとデータベース] ウィザードで新しいアプリとデータベースを構成する方法を示すスクリーンショット。
デプロイは数分で完了し、次のリソースが作成されます。
  • リソース グループ → 作成されたすべてのリソースのコンテナーです。
  • App Service プラン → App Service のコンピューティング リソースを定義します。 P1v2 レベルの Linux プランが作成されます。
  • App Service → アプリを表し、App Service プランで実行されます。
  • 仮想ネットワーク → App Service アプリと統合され、バックエンドのネットワーク トラフィックを分離します。
  • Azure Database for MySQL - フレキシブル サーバー → 仮想ネットワークからのみアクセス可能です。 サーバー上にデータベースとユーザーが作成されます。
  • プライベート DNS ゾーン → 仮想ネットワーク内の MySQL データベース サーバーの DNS 解決を有効にします。
デプロイが完了したら、[リソースに移動] ボタンをクリックします。 App Service アプリに直接アクセスします。
Azure で Web アプリを作成するために入力するフォームを示すスクリーンショット。

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

作成ウィザードによってデータベースへの接続文字列が生成されましたが、まだコードに使用できる形式ではありません。 この手順では、アプリに必要な形式でアプリ設定を作成します。

手順 Screenshot
App Service ページの左側メニューで、[構成] を選びます。 App Service の [構成] ページを開く方法を示すスクリーンショット。
[構成] ページの [アプリケーション設定] タブで、DB_DATABASE 設定を作成します。
  1. [新しいアプリケーション設定] をクリックします。

  2. [名前] フィールドに「DB_DATABASE」と入力します。

  3. [値] フィールドに、msdocs-docs-laravel-mysql-XYZ-database のように、作成ウィザードで自動的に生成されたデータベース名を入力します。

  4. [OK] をクリックします。

自動生成された接続文字列を確認する方法を示すスクリーンショット。
[アプリケーション設定] タブに戻ります。
  1. 一番下までスクロールして、接続文字列 [defaultConnection] を選びます。 これは作成ウィザードで生成されたもので、必要なユーザー名とパスワードが含まれています。

  2. [値] フィールドで [コピー] ボタンを選び、後で使うためにテキスト ファイルに値を貼り付けます。 次のような形式です (わかりやすいように改行しています)。

    Database=mysql;
    Server=<database-server-domain-name>;
    User Id=<username>;
    Password=<password>
    
  3. [キャンセル] を選択します。

アプリ設定の作成方法を示すスクリーンショット。
アプリ設定の作成と同じ手順に従って、次の追加アプリ設定を作成します。
  • DB_HOST: コピーした接続文字列の <database-server-domain-name> を値として使います。

  • DB_USERNAME: コピーした接続文字列の <username> を値として使います。

  • DB_PASSWORD: コピーした接続文字列の <password> を値として使います。

  • MYSQL_ATTR_SSL_CA: /home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem を値として使用します。

    このアプリ設定は、MySQL サーバーにアクセスするために必要な TLS/SSL 証明書のパスを指すものです。 便宜上、サンプル リポジトリに含まれています。

  • APP_DEBUG: true を値として使います。 この変数は Laravel のデバッグ変数です。

  • APP_KEY: base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= を値として使います。 この値は Laravel の暗号化変数です。

    重要

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

[構成] ページですべての必要なアプリ設定を示すスクリーンショット。

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

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

手順 Screenshot
新しいブラウザー ウィンドウで次を行います。
  1. GitHub アカウントにサインインします。

  2. https://github.com/Azure-Samples/laravel-tasks に移動します。

  3. [フォーク] をクリックします。

  4. [フォークの作成] をクリックします。

サンプル GitHub リポジトリのフォークを作成する方法を示すスクリーンショット。
GitHub のページで、. キーを押して、ブラウザーで Visual Studio Code を開きます。 GitHub で Visual Studio Code のブラウザー エクスペリエンスを開く方法を示すスクリーンショット。
ブラウザーの Visual Studio Code から、エクスプローラーで config/database.php を開きます。mysql の接続では、先ほど作成した MySQL 接続用のアプリ設定が既に使われていることを確認します (DB_HOSTDB_DATABASEDB_USERNAMEDB_PASSWORDMYSQL_ATTR_SSL_CA)。 ブラウザーの Visual Studio Code と、開いたファイルを示すスクリーンショット。
App Service ページに戻り、左側のメニューから [デプロイ センター] を選びます。 App Service でデプロイ センターを開く方法を示すスクリーンショット。
デプロイ センターのページで次を行います。
  1. [ソース] で、[GitHub] を選びます。 既定では、ビルド プロバイダーとして GitHub Actions が選ばれます。

  2. GitHub アカウントにサインインし、プロンプトに従って Azure を承認します。

  3. [組織] で、自分のアカウントを選びます。

  4. [リポジトリ] で、[laravel-tasks] を選びます。

  5. [ブランチ][main] を選びます。

  6. トップ メニューの [保存] をクリックします。

App Service は、選んだ GitHub リポジトリの .github/workflows ディレクトリに、ワークフロー ファイルをコミットします。
GitHub Actions を使って CI/CD を構成する方法を示すスクリーンショット。
デプロイ センターのページで次を行います。
  1. [ログ] を選択します。 デプロイの実行は既に開始されています。

  2. デプロイの実行のログ項目で、[ビルドまたはデプロイ ログ] を選びます。

    GitHub リポジトリにアクセスし、GitHub アクションが実行されていることを確認します。 ワークフロー ファイルでは、ビルドとデプロイという 2 つの異なるステージを定義します。

デプロイ センターでデプロイ ログを開く方法を示すスクリーンショット。
コードを変更するには、ブラウザーで Visual Studio Code に移動します。
  1. [ソース管理] 拡張機能を選びます。

  2. 変更したファイル (database.php など) の横で [+] を選び、変更をステージングします。

  3. テキスト ボックスに、コミット メッセージ (add certificate など) を入力します。

  4. チェックマークを選んで、GitHub にコミットしてプッシュします。

デプロイ センターのページに戻ると、別の実行が開始されているため、新しいログ エントリが表示されます。 実行が完了するのを待ちます。 約 15 分ほどかかります。

ヒント

GitHub のアクションは、GitHub リポジトリの .github/workflow にあるファイルで定義されています。 ファイルをカスタマイズすることで、より高速にすることができます。

Visual Studio Code のブラウザー エクスペリエンスで変更をコミットする方法を示すスクリーンショット。

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

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

手順 Screenshot
App Service ページで次を行います。
  1. 左側のメニューから、[SSH] を選びます。

  2. [Go] \(移動) を選択します。

App Service コンテナーとの SSH セッションが、ブラウザーで開かれます。 必要であれば、代わりに直接 https://<app-name>.scm.azurewebsites.net/webssh/host に移動することもできます。
Azure portal からアプリの SSH シェルを開く方法を示すスクリーンショット。
SSH ターミナルで次を行います。
  1. CD でアプリケーション コードのルートに移動します。

    cd /home/site/wwwroot
    
  2. アプリケーションのルートからデータベースの移行を実行します。

    php artisan migrate --force
    

    注意

    /home 内のファイルへの変更のみが、アプリの再起動後も保持されます。 /home の外部の変更は永続化されません。

SSH シェルで実行するコマンドとその出力を示すスクリーンショット。

5 - サイト ルートの変更

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

手順 Screenshot
App Service ページで次を行います。
  1. 左側のメニューから、[構成] を選択します。

  2. [全般設定] タブを選択します。

App Service の [構成] ページの [全般設定] タブを開く方法を示すスクリーンショット。
[全般設定] タブで次を行います。
  1. [スタートアップ コマンド] ボックスに、「cp/home/site/wwwroot/default/etc/nginx/sites-available/default && service nginx reload」というコマンドを入力します。

    PHP 8.0 コンテナー内の Nginx 構成ファイルを置き換え、Nginx を再起動させます。 この構成により、コンテナーの起動時に毎回この変更が行われるようになります。

  2. [保存] を選択します。

App Service で起動コマンドを構成する方法を示すスクリーンショット。

6 - アプリの参照

手順 Screenshot
App Service ページで次を行います。
  1. 左側のメニューから [概要] を選びます。

  2. アプリの URL を選びます。

    直接、https://<app-name>.azurewebsites.net に移動することもできます。

Azure portal から App Service を起動する方法を示すスクリーンショット。
リストにいくつかのタスクを追加します。Azure App Service でデータ主導型の PHP アプリが実行されています。 App Service で実行されている Laravel アプリのスクリーンショット。

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

手順 Screenshot
App Service ページで次を行います。
  1. 左側のメニューから、[App Service ログ] を選びます。

  2. [アプリケーション ログ記録][ファイル システム] を選びます。

Azure portal で App Service のネイティブ ログを有効にする方法を示すスクリーンショット。
左側のメニューから [ログ ストリーム] をクリックします。プラットフォーム ログとコンテナー内のログを含む、アプリのログが表示されます。 Azure portal でログ ストリームを表示する方法を示すスクリーンショット。

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

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

手順 Screenshot
Azure portal の上部にある検索バーで次を行います。
  1. リソース グループ名を入力します。

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

Azure portal でリソース グループを検索し、そこに移動する方法を示すスクリーンショット。
[リソース グループ] ページで、 **[リソース グループの削除]** をクリックします。 Azure portal の [リソースグループの削除] ボタンの場所を示すスクリーンショット。
  1. リソース グループの名前を入力して、削除を確定します。

  2. [削除] をクリックします。

Azure portal でリソース グループを削除するための確認ダイアログを示すスクリーンショット。

よく寄せられる質問

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

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

  • 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 ジョブからのファイルに確実にアクセスできるようにします。

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

まとめ

このチュートリアルでは、次の作業を行う方法を学びました。

  • 既定でセキュリティ保護された PHP と MySQL のアプリを Azure で作成する
  • アプリ設定を使って、MySQL への接続シークレットを構成する
  • GitHub Actions を使ってアプリケーションのコードをデプロイする
  • アプリを更新して再デプロイする
  • データベースの移行を安全に実行する
  • Azure から診断ログをストリーミングする
  • Azure Portal でアプリを管理する

次の手順