チュートリアル:Azure App Service で PHP および 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 無料アカウントを作成してください。

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

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

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-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 つの異なるステージを定義します。

デプロイ センターでデプロイ ログを開く方法を示すスクリーンショット。
実行が完了するのを待ちます。 約 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
    

    Note

    /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 でアプリを管理する

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

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