チュートリアル: Azure App Service で PHP (Laravel) と Azure Database for 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 アプリが完成します。

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

このチュートリアルでは、次の作業を行う方法について説明します。

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

前提条件

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

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

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

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

  • .env で、ローカル環境の Azure Database for MySQL フレキシブル サーバー データベースの設定を使って、データベースの設定 (DB_DATABASEDB_USERNAMEDB_PASSWORD など) を構成します。 このサンプルを実行するには、ローカル環境に Azure Database for MySQL フレキシブル サーバーのインスタンスが必要です。

  • リポジトリのルートから、次のコマンドで Laravel を起動します。

    composer install
    php artisan migrate
    php artisan key:generate
    php artisan serve
    

1 - App Service と Azure Database for 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 アプリとデータベース] というラベルの付いた項目を選びます。
作成ウィザードに直接移動することもできます。
A screenshot showing how to use the search box in the top tool bar to find the Web App + Database creation wizard.
[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](レビュー + 作成) をクリックします。

検証が完了したら、[作成] をクリックします。
A screenshot showing how to configure a new app and database in the Web App + Database wizard.
デプロイは数分で完了し、次のリソースが作成されます。
  • リソース グループ → 作成されたすべてのリソースのコンテナーです。
  • App Service プラン → App Service のコンピューティング リソースを定義します。 P1v2 レベルの Linux プランが作成されます。
  • App Service → アプリを表し、App Service プランで実行されます。
  • 仮想ネットワーク → App Service アプリと統合され、バックエンドのネットワーク トラフィックを分離します。
  • Azure Database for MySQL - フレキシブル サーバー → 仮想ネットワークからのみアクセス可能です。 サーバー上にデータベースとユーザーが作成されます。
  • プライベート DNS ゾーン → 仮想ネットワーク内の MySQL データベース サーバーの DNS 解決を有効にします。
デプロイが完了したら、[リソースに移動] ボタンをクリックします。 App Service アプリに直接アクセスします。
A screenshot showing the form to fill out to create a web app in Azure.

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

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

手順 Screenshot
App Service ページの左側メニューで、[構成] を選びます。 A screenshot showing how to open the configuration page in App Service.
[Configuration] (構成) ページの [Application settings] (アプリケーション設定) タブで、次のそれぞれの設定で [編集] をクリックし、[名前] フィールドを新しい値で更新して、[OK] をクリックします。
現在の名前 新しい名前
AZURE_MYSQL_DBNAME DB_DATABASE
AZURE_MYSQL_HOST DB_HOST
AZURE_MYSQL_USERNAME DB_USERNAME
AZURE_MYSQL_PASSWORD DB_PASSWORD
A screenshot showing how to see the autogenerated connection string.
新しい MYSQL_ATTR_SSL_CA データベース設定を作成します。
  1. [新しいアプリケーションの設定] をクリックします。

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

  3. [値] フィールドに、「/home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem」と入力します。

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

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

A screenshot showing how to create an app setting.
同じ手順に従って、次の追加アプリ設定を作成し、[保存] をクリックします。
  • APP_DEBUG: true を値として使います。 この変数は Laravel のデバッグ変数です。

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

    重要

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

A screenshot showing all the required app settings in the configuration page.

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. [フォークの作成] をクリックします。

A screenshot showing how to create a fork of the sample GitHub repository.
GitHub のページで、. キーを押して、ブラウザーで Visual Studio Code を開きます。 A screenshot showing how to open the Visual Studio Code browser experience in GitHub.
ブラウザーの Visual Studio Code から、エクスプローラーで config/database.php を開きます。mysql の接続では、先ほど作成した MySQL 接続用のアプリ設定が既に使われていることを確認します (DB_HOSTDB_DATABASEDB_USERNAMEDB_PASSWORDMYSQL_ATTR_SSL_CA)。 A screenshot showing Visual Studio Code in the browser and an opened file.
App Service ページに戻り、左側のメニューから [デプロイ センター] を選びます。 A screenshot showing how to open the deployment center in App Service.
デプロイ センターのページで次を行います。
  1. [ソース] で、[GitHub] を選びます。 既定では、ビルド プロバイダーとして GitHub Actions が選ばれます。

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

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

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

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

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

App Service は、選んだ GitHub リポジトリの .github/workflows ディレクトリに、ワークフロー ファイルをコミットします。
A screenshot showing how to configure CI/CD using GitHub Actions.
デプロイ センターのページで次を行います。
  1. [ログ] を選択します。 デプロイの実行は既に開始されています。

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

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

A screenshot showing how to open deployment logs in the deployment center.
コードを変更するには、ブラウザーで Visual Studio Code に移動します。
  1. [ソース管理] 拡張機能を選びます。

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

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

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

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

ヒント

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

A screenshot showing how to commit your changes in the Visual Studio Code browser experience.

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

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

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

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

App Service コンテナーとの SSH セッションが、ブラウザーで開かれます。 必要であれば、代わりに直接 https://<app-name>.scm.azurewebsites.net/webssh/host に移動することもできます。
A screenshot showing how to open the SSH shell for your app from the Azure portal.
SSH ターミナルで次を行います。
  1. CD でアプリケーション コードのルートに移動します。

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

    php artisan migrate --force
    

    注意

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

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

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. [全般設定] タブを選択します。

A screenshot showing how to open the general settings tab in the configuration page of App Service.
[全般設定] タブで次を行います。
  1. [スタートアップ コマンド] ボックスに、「cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload」コマンドを入力します。

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

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

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

6 - アプリの参照

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

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

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

A screenshot showing how to launch an App Service from the Azure portal.
リストにいくつかのタスクを追加します。Azure App Service でデータ主導型の PHP アプリが実行されています。 A screenshot of the Laravel app running in App Service.

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

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

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

A screenshot showing how to enable native logs in App Service in the Azure portal.
左側のメニューから [ログ ストリーム] をクリックします。プラットフォーム ログとコンテナー内のログを含む、アプリのログが表示されます。 A screenshot showing how to view the log stream in the Azure portal.

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

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

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

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

A screenshot showing how to search for and navigate to a resource group in the Azure portal.
[リソース グループ] ページで、 **[リソース グループの削除]** をクリックします。 A screenshot showing the location of the Delete Resource Group button in the Azure portal.
  1. リソース グループの名前を入力して、削除を確定します。

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

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

よく寄せられる質問

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

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

  • App Service プランは Premium V2 レベルで作成され、スケールアップまたはスケールダウンできます。 「App Service の価格」をご覧ください。
  • Azure Database for MySQL フレキシブル サーバー インスタンスは B1ms レベルで作成され、スケールアップまたはスケールダウンできます。 Azure 無料アカウントでは、B1ms レベルは 12 か月間、月間の上限まで無料です。 Azure Database for MySQL フレキシブル サーバーの価格に関するページをご覧ください。
  • 仮想ネットワークでは、ピアリングなどの追加機能を構成しない限り、料金は発生しません。 「Azure Virtual Network の価格」を参照してください。
  • プライベート DNS ゾーンでは、少額の料金が発生します。 「Azure DNS の価格」を参照してください。

仮想ネットワークの内側でセキュリティ保護されている Azure Database for MySQL フレキシブル サーバー データベースに接続するにはどうすればよいですか?

Azure Database for MySQL フレキシブル サーバー データベースに接続するには、ツールと環境に基づいていくつかの方法を自由に使用できます。

  • コマンド ライン ツールでのアクセス:
    • 基本的なアクセスには、アプリの SSH ターミナルから mysql コマンドを使います。
  • デスクトップ ツール (MySQL Workbench など):
    • Azure CLI での SSH トンネリングの使用:
      • Azure CLI を使って、Web アプリに対する SSH セッションを作成します。
      • その SSH セッションを使って、トラフィックを MySQL にトンネリングします。
    • サイト間 VPN または Azure VM の使用:
      • 使うマシンは仮想ネットワークの一部である必要があります。
      • 次の使用を検討します。
        • サブネットの 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 つにまとめて、アップロードとダウンロードの手順を不要にすることで、ワークフロー ファイルを簡略化することができます。

まとめ

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

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

次の手順