チュートリアル: Azure App Service で PHP (Laravel) と 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 か月間無料でお試しいただけます。 詳細については、「Azure 無料アカウントを使用して Azure Database for MySQL - フレキシブル サーバーを無料で試す」を参照してください。
サンプル アプリケーション
このチュートリアルに従うには、リポジトリからサンプル アプリケーションをクローンまたはダウンロードします。
git clone https://github.com/Azure-Samples/laravel-tasks.git
アプリケーションをローカルで実行したい場合は、次のようにします。
.env で、ローカル環境の Azure Database for MySQL フレキシブル サーバー データベースの設定を使って、データベースの設定 (
DB_DATABASE
、DB_USERNAME
、DB_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 で、次の操作を行います。
|
|
[Web アプリとデータベースの作成] ページで、次のようにフォームに入力します。
|
|
デプロイは数分で完了し、次のリソースが作成されます。
|
2 - データベース接続の設定
作成ウィザードによってデータベースへの接続に使用するアプリ設定が生成されましたが、まだコードに使用できる形式ではありません。 この手順では、アプリ設定を編集し、アプリに必要な形式に更新します。
手順 | Screenshot | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
App Service ページの左側メニューで、[構成] を選びます。 | |||||||||||
[構成] ページの [アプリケーションの設定] タブで、次の各設定の [編集] を選び、[名前] フィールドを新しい値で更新して、[OK] を選びます。
|
|||||||||||
新しい MYSQL_ATTR_SSL_CA データベース設定を作成します。
|
|||||||||||
同じ手順に従って、次の追加アプリ設定を作成し、[保存] を選びます。
|
3 - サンプル コードのデプロイ
この手順では、GitHub Actions を使って GitHub のデプロイを構成します。 これは、App Service にデプロイする多くの方法の 1 つにすぎませんが、デプロイ プロセスで継続的インテグレーションを実現する優れた方法でもあります。 既定では、GitHub リポジトリに git push
があるたびにビルドとデプロイのアクションが起動されます。 Visual Studio Code を使ってブラウザーで直接コードベースに変更を加え、GitHub Actions で自動的にデプロイできるようにします。
4 - データベース スキーマの生成
作成ウィザードは、Azure Database for 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 の上部にある検索バーで次を行います。
|
|
[リソース グループ] ページで、[リソース グループの削除] を選択します。 | |
|
よく寄せられる質問
- この設定にはいくらかかりますか。
- 仮想ネットワークの内側でセキュリティ保護されている Azure Database for MySQL フレキシブル サーバー データベースに接続するにはどうすればよいですか?
- GitHub Actions でのローカル アプリの開発はどのように行いますか。
- GitHub Actions のデプロイが遅いのはなぜですか。
この設定にはいくらかかりますか。
作成リソースの価格は次のとおりです。
- 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
コマンドを使います。
- 基本的なアクセスには、アプリの SSH ターミナルから
- デスクトップ ツール (MySQL Workbench など):
- Azure CLI での SSH トンネリングの使用:
- Azure CLI を使って、Web アプリに対する SSH セッションを作成します。
- その SSH セッションを使って、トラフィックを MySQL にトンネリングします。
- サイト間 VPN または Azure VM の使用:
- 使うマシンは仮想ネットワークの一部である必要があります。
- 次の使用を検討します。
- サブネットの 1 つにリンクされている Azure VM。
- Azure 仮想ネットワークにサイト間 VPN 接続しているオンプレミス ネットワーク内のコンピューター。
- Azure CLI での SSH トンネリングの使用:
- Azure Cloud Shell の統合:
- 直接アクセスのために仮想ネットワークと 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 つにまとめて、アップロードとダウンロードの手順を不要にすることで、ワークフロー ファイルを簡略化することができます。
まとめ
このチュートリアルでは、以下の内容を学習しました。
- Azure で既定でセキュリティ保護された PHP と Azure Database for MySQL フレキシブル サーバー アプリを作成する
- アプリの設定を使って Azure Database for MySQL フレキシブル サーバーへの接続シークレットを構成する
- GitHub Actions を使ってアプリケーションのコードをデプロイする
- アプリを更新して再デプロイする
- データベースの移行を安全に実行する
- Azure から診断ログをストリーミングする
- Azure Portal でアプリを管理する