次の方法で共有


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

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

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

[前提条件]

1 - サンプルを実行する

最初に、開始点としてサンプルのデータ駆動型アプリを設定します。 便宜のために、サンプル リポジトリには開発コンテナー構成が含まれています。 開発コンテナーには、データベース、キャッシュ、サンプル アプリケーションに必要なすべての環境変数など、アプリケーションの開発に必要なすべてのものが含まれています。 開発コンテナーは、GitHub codespace で実行できます。つまり、Web ブラウザーを使用して任意のコンピューターでサンプルを実行できます。

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

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

手順 2: GitHub フォークで、次の操作を行います。

  1. [コード]>[メインに codespace を作成] を選択します。 codespace の設定には数分かかります。 また、指定された .env ファイルには、Laravel がローカルで実行する必要があるダミーAPP_KEY変数が既に含まれています。

手順 3: codespace ターミナルで次のことを行います。

  1. composer install を実行します。
  2. php artisan migrate を使用して、データベースの移行を実行します。
  3. php artisan serve を使用してアプリを実行します。
  4. ''Your application running on port 80 is available.'' という通知が表示されたら、[ブラウザーで開く] を選択します。 新しいブラウザー タブにサンプル アプリケーションが表示されるはずです。アプリケーションを停止するには、Ctrl+C と入力します。

問題がありますか? 「トラブルシューティング」セクションを確認してください。

2 - App Service、データベース、キャッシュを作成する

この手順では、Azure リソースを作成します。 このチュートリアルで使用する手順では、App Service、Azure Database for MySQL、Azure Cache for Redis を含む一連のセキュリティで保護された既定のリソースを作成します。 作成プロセスでは、次のように指定します。

  • 名前: Web アプリの名前。 アプリの DNS 名の一部として使用されます。
  • 世界でアプリを物理的に実行するためのリージョン。 これは、アプリの DNS 名の一部としても使用されます。
  • アプリのランタイム スタック。 ここで、アプリに使う PHP のバージョンを選びます。
  • アプリのホスティング プラン。 これは、アプリの一連の機能と容量のスケーリングを含む価格レベルです。
  • アプリのリソース グループ。 リソース グループを使うと、アプリケーションに必要なすべての Azure リソースを (論理コンテナーに) グループ化できます。

Azure portal にサインインし、以下の手順に従って Azure App Service リソースを作成します。

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

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

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

  1. 名前: msdocs-laravel-mysql-XYZmsdocs-laravel-mysql-XYZ_group という名前のリソース グループが自動的に生成されます。
  2. ランタイム スタック: PHP 8.4
  3. オペレーティング システム: Linux
  4. [リージョン]: 近くの任意の Azure リージョン。
  5. Linux プラン: 新規作成 し、 msdocs-laravel-mysql-XYZ という名前を使用します。
  6. 価格プラン: 基本。 準備ができたら、別の価格レベルにスケールアップできます。

ステップ 3:

  1. [ データベース ] タブを選択します。
  2. [ データベースの作成] を選択します
  3. [エンジン] で、[MySQL - フレキシブル サーバー] を選択します。
  4. [ Azure Cache for Redis の作成] を選択します
  5. [ 名前] ([キャッシュ] の下) に、キャッシュの名前を入力します。
  6. [SKU][Basic] を選択します。

手順 4:

  1. [ デプロイ ] タブを選択します。
  2. 継続的デプロイを有効にします。
  3. 組織で、GitHub エイリアスを選択します。
  4. [リポジトリ] で、[laravel-tasks] を選びます。
  5. [ブランチ][main] を選びます。
  6. 基本認証が無効になっていることを確認します。
  7. [Review + create](レビュー + 作成) を選択します。
  8. 検証が完了した後、 [作成] を選択します。

手順 5: デプロイが完了するまでに数分かかります。 デプロイが完了したら、[リソースに移動] ボタンを選択します。 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 解決を可能にします。

3 - セキュリティで保護された接続シークレット

作成ウィザードにより、すでに接続変数がアプリの設定として自動的に生成されています。 ただし、セキュリティのベスト プラクティスは、App Service からシークレットを完全に排除することです。 シークレットをキー保管庫に移動し、サービスコネクタを使用してアプリ設定を Key Vault の参照 に変更します。

手順 1: 既存の接続文字列を取得する

  1. App Service ページの左側のメニューで、[設定] > [環境変数] を選びます。
  2. [接続文字列] を選択します。
  3. [AZURE_MYSQL_CONNECTIONSTRING] を選択します。
  4. [ アプリケーションの追加/編集] 設定の [ ] フィールドで、後で使用するためにユーザー名とパスワードをコピーします。 接続文字列を使用すると、プライベート エンドポイントの背後でセキュリティ保護された MySQL データベースに接続できます。 ただし、シークレットは App Service アプリに直接保存されますが、これは最適ではありません。 これを変更します。

手順 2: シークレットを安全に管理するためのキー コンテナーを作成する

  1. 上部の検索バーに「キー コンテナー」と入力し、[Marketplace]> を選択します。
  2. リソース グループで、msdocs-laravel-mysql-XYZ_group を選択します。
  3. [キー コンテナー名] に、文字と数字のみで構成される名前を入力します。
  4. [リージョン] をリソース グループと同じ場所に設定します。

手順 3: プライベート エンドポイントを使用してキー コンテナーをセキュリティ保護する

  1. [ネットワーク] タブを選択します。
  2. [パブリック アクセスを有効にする] の選択を解除します。
  3. [プライベート エンドポイントを作成する] を選択します。
  4. リソース グループで、msdocs-laravel-mysql-XYZ_group を選択します。
  5. ダイアログの [場所] で、App Service アプリと同じ場所を選択します。
  6. [名前] に「msdocs-laravel-mysql-XYZVaultEndpoint」と入力します。
  7. [仮想ネットワーク] で、msdocs-laravel-mysql-XYZ_group グループ内の仮想ネットワークを選択します。
  8. [ サブネット] で、使用可能な互換性のあるサブネットを選択します。 Web アプリ ウィザードが、あなたのために便利に作成しました。
  9. [OK] を選択します。
  10. [Review + create](確認と作成) を選択し、次に [作成] を選択します。 キー コンテナーのデプロイが完了するまで待ちます。 "デプロイが完了しました" と表示されます。

手順 4: MySQL コネクタを作成する

  1. 上部の検索バーに 「msdocs-laravel-mysql」と入力し、 msdocs-laravel-mysql-XYZ という App Service リソースを選択します。
  2. [App Service] ページの左側にあるメニューで、[設定] > [サービス コネクタ] を選択します。
  3. を選択してを作成します。
  4. [サービスの種類] で、[DB for MySQL フレキシブル サーバー] を選択します。
  5. MySQL フレキシブル サーバーの場合は、サーバー (msdocs-laravel-mysql-235-server など) を選択します。
  6. MySQL データベースの場合は、データベース (msdocs-laravel-mysql-235-database など) を選択します。

手順 5: MySQL コネクタの認証を構成する

  1. 認証 タブを選択します。
  2. [接続文字列] を選択します。
  3. [パスワード] に、先ほどコピーしたパスワードを貼り付けます。
  4. [シークレットを Key Vault に保存する] を選択します。
  5. [Key Vault 接続] で、[新規作成] を選択します。 [接続の作成] ダイアログが編集ダイアログの上に開きます。

手順 6: Key Vault 接続を確立する

  1. Key Vault 接続の [接続の作成] ダイアログの [キー コンテナー] で、前に作成したキー コンテナーを選びます。
  2. [確認および作成]を選択します。
  3. 検証が完了したら、[作成] を選択します。

手順 6: MySQL コネクタの設定を完了する

  1. MySQL コネクタ ダイアログに戻りました。 [認証] タブで、キー コンテナー コネクタが作成されるまで待ちます。 完了すると、[Key Vault 接続] ドロップダウンでそれが自動的に選択されます。
  2. [確認および作成]を選択します。
  3. を選択してを作成します。 "更新に成功しました" という通知が表示されるまで待ちます。

手順 7: キー コンテナーのシークレットを使用するための Redis コネクタを構成する

  1. [サービス コネクタ] ページで、Cache for Redis コネクタの横にあるチェックボックスをオンにし、[編集] を選択します。
  2. 認証 タブを選択します。
  3. [シークレットを Key Vault に保存する] を選択します。
  4. [Key Vault 接続] で、作成したキー ボールトを選択します。
  5. [次へ: ネットワーク] を選択します。
  6. [ターゲット サービスへのアクセスを有効にするようにファイアウォール規則を構成する] を選択します。 アプリ作成ウィザードでは、プライベート エンドポイントを使用して SQL データベースが既にセキュリティで保護されています。
  7. [保存] を選択します。 "更新に成功しました" という通知が表示されるまで待ちます。

手順 8: キー ボールト統合を確認する

  1. 左側のメニューで、もう一度 [設定] > [環境変数] を選びます。
  2. AZURE_MYSQL_PASSWORDの横にある [値の表示] を選択します。 値は @Microsoft.KeyVault(...) になります。これは、シークレットがキー コンテナーで管理されるようになったため、これがキー コンテナー参照であることを意味します。
  3. Redis の接続文字列を確認するには、[AZURE_REDIS_CONNECTIONSTRING] の横にある [値を表示] を選択します。

まとめると、接続シークレットをセキュリティで保護するためのプロセスには次の作業が含まれます。

  • App Service アプリの環境変数から接続シークレットを取得する。
  • キー コンテナーを作成する。
  • システム割り当てマネージド ID を使用して Key Vault 接続を作成する。
  • キー コンテナーにシークレットを格納するようにサービス コネクタを更新する。

問題がありますか? 「トラブルシューティング」セクションを確認してください。


4 - Laravel 変数を構成する

手順 1: アプリ設定として CACHE_DRIVER を作成します。

  1. [アプリ設定] タブで [追加] を選択します。
  2. [名前] フィールドに「CACHE_DRIVER」と入力します。
  3. [値] フィールドに、「redis」と入力します。
  4. [適用] を選択し、次に [適用] を再度選択し、最後に [確認] を選択します。

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

  • 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 の暗号化変数です。

重要

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

APP_KEY アプリ設定もキー コンテナー参照として構成するのが理想的です。これはマルチステップ プロセスです。 詳細については、「 APP_KEY アプリの設定を Key Vault 参照に変更する方法」を参照してください。

5 - サンプル コードをデプロイする

この手順では、GitHub Actions を使用して GitHub のデプロイを構成します。 これは、App Service にデプロイする多くの方法の 1 つにすぎませんが、デプロイ プロセスで継続的インテグレーションを実現する優れた方法でもあります。 既定では、GitHub リポジトリに git push があるたびにビルドとデプロイのアクションが起動されます。

手順 1: サンプル フォークの GitHub コードスペースに戻り、 git pull origin main実行します。 これにより、新しくコミットされたワークフロー ファイルが codespace にプルされます。

手順 2 (オプション 1: GitHub Copilot を使用):

  1. [チャット] ビューを選択し、+ を選択して、新しいチャット セッションを開始します。
  2. "@workspaceアプリはデータベースと redis にどのように接続しますか?Copilot では、 config/database.php での設定の構成方法について説明する場合があります。
  3. @workspace実稼働モードでは、アプリは App Service Web アプリで実行されています。このアプリは、Azure Service Connector を使用して MySQL フレキシブル サーバーに接続します。使用する必要がある環境変数の名前は何ですか?Copilot では、 以下の GitHub Copilot の手順を使用せずに、オプション 2 と同様のコード提案を行い、 config/database.php ファイルを変更するように指示することもできます。
  4. エクスプローラーで config/database.php を開き、コード候補を追加します。
  5. "@workspace 私の App Service アプリは、Azure Service Connector を使用して、Django クライアントの種類を使用した Cache for Redis への接続も行います。 使用する必要がある環境変数の名前は何ですか?*" Copilot では、オプション 2 のコード候補と同様のコード候補が表示される場合があります。 以下の GitHub Copilot の手順は使用せずconfig/database.php ファイルを変更するように指示することもできます。 メッセージが表示されたら、GitHub Copilot for Azure にサインインして、より正確な回答を得ます。
  6. コード候補を追加します。 GitHub Copilot は毎回同じ応答を提供するわけではなく、常に正しいとは限りません。 その応答を微調整するために、さらに質問をする必要があるかもしれません。 ヒントについては、「自分の codespace で GitHub Copilot を使用して何ができますか?」を参照してください。

手順 2 (オプション 2: GitHub Copilot なし):

  1. エクスプローラーで config/database.php を開きます。 mysql セクションを探し、次の変更を行います。
  2. DB_HOST (49 行目) をAZURE_MYSQL_HOSTに置き換えます。
  3. DB_DATABASE (51 行目) をAZURE_MYSQL_DBNAMEに置き換えます。
  4. DB_USERNAME (52 行目) をAZURE_MYSQL_USERNAMEに置き換えます。
  5. DB_PASSWORD (53 行目) をAZURE_MYSQL_PASSWORDに置き換えます。
  6. DB_PORT (50 行目) をAZURE_MYSQL_PORTに置き換えます。
  7. [Redis cache ] セクションまでスクロールし、次の変更を行います。
  8. REDIS_HOST (142 行目) をAZURE_REDIS_HOSTに置き換えます。
  9. REDIS_PASSWORD (144 行目) をAZURE_REDIS_PASSWORDに置き換えます。
  10. REDIS_PORT (145 行目) をAZURE_REDIS_PORTに置き換えます。
  11. REDIS_CACHE_DB (146 行目) をAZURE_REDIS_DATABASEに置き換えます。
  12. 同じセクションで、'scheme' => 'tls', を含む行を追加します。 この構成は、暗号化を使用して Redis に接続するよう Laravel に指示します。

ステップ 3:

  1. [ソース管理] 拡張機能を選びます。
  2. テキスト ボックスに、Configure Azure database and cache connections のようなコミット メッセージを入力します。 または、 を選択し、GitHub Copilot でコミット メッセージを生成します。
  3. [コミット] を選択し、[はい] で確定します。
  4. [変更の同期 1] を選択し、[OK] で確認します。

手順 4: Azure portal の [デプロイ センター] ページに戻ります。

  1. [ログ] タブを選択し、[最新の情報に更新] を選択して、新しいデプロイの実行を確認します。
  2. デプロイの実行のログ項目で、最新のタイムスタンプを持つ [ビルドまたはデプロイ ログ] エントリを選びます。

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

問題がありますか? 「トラブルシューティング」セクションを確認してください。

6 - データベース スキーマを生成する

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

手順 1: [App Service] ページに戻り、左側のメニューで次のようにします。

  1. [開発ツール]>[SSH] を選択します。
  2. [Go] \(移動) を選択します。

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

  1. cd /home/site/wwwroot を実行します。 デプロイされたすべてのファイルがここにあります。
  2. php artisan migrate --force を実行します。 それに成功すると、App Service は MySQL データベースに正常に接続した状態になります。

ヒント

SSH セッションでは、 /home 内のファイルに対する変更のみが、アプリの再起動後も保持されます。 /home の外部の変更は永続化されません。

7 - サイト ルートの変更

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

手順 1:

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

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

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

8 - アプリを参照する

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

  1. 左側のメニューから [概要] を選びます。
  2. アプリの 既定のドメイン を選択します。

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

ヒント

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

9 - 診断ログをストリーム配信する

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

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

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

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

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

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

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

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

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

ステップ 3:

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

2.Azure リソースを作成してサンプル アプリをデプロイする

このステップでは、Azure リソースを作成し、サンプル アプリを App Service on Linux にデプロイします。 このチュートリアルで使用される手順では、App Service と Azure Database for MySQL を含む既定でセキュリティ保護された一連のリソースを作成します。

GitHub codespace には、 Azure Developer CLI (AZD) が既に含まれています。

  1. php artisan key:generate --showを使用して Laravel 暗号化キーを生成します。

    php artisan key:generate --show
    
  2. azd auth login コマンドを実行し、プロンプトに従って Azure にサインインします。

    azd auth login
    
  3. 必要な Azure リソースを作成し、azd up コマンドを使用してアプリ コードをデプロイします。 プロンプトに従って、Azure リソースの目的のサブスクリプションと場所を選択します。

    azd up
    
  4. メッセージが表示されたら、次の回答を入力します。

    質問 答え
    Enter a new environment name (新しい環境の名前を入力してください) 一意の名前を入力します。 AZD テンプレートでは、この名前を Azure での Web アプリの DNS 名の一部として使用します (<app-name>-<hash>.azurewebsites.net)。 英数字とハイフンを使用できます。
    使用する Azure サブスクリプションを選択する サブスクリプションを選択します。
    使用する Azure の場所を選択する 場所を選択します。
    'appKey' インフラストラクチャのセキュリティで保護されたパラメーターの値を入力します ここでは、 php artisan key:generate --show の出力を使用します。 AZD テンプレートは、アプリで使用できる Key Vault シークレットを作成します。
    'databasePassword' インフラストラクチャのセキュリティで保護されたパラメーターの値を入力します MySQL のデータベース パスワード。 長さは 8 文字以上で、大文字、小文字、数字、特殊文字を含める必要があります。

    azd up コマンドが完了するまで約 15 分かかります (大部分の時間は Redis キャッシュに費やされます)。 また、アプリケーションのコードのコンパイルとデプロイも行われますが、後でコードを変更して App Service で動くようにします。 実行中、このコマンドは、Azure のデプロイへのリンクを含む、プロビジョニングとデプロイのプロセスに関するメッセージを提供します。 完了すると、コマンドはデプロイ アプリケーションへのリンクも表示します。

    この AZD テンプレートには、次の Azure リソースを使用して既定でセキュリティ保護されたアーキテクチャを生成するファイル (azure.yamlinfra ディレクトリ) が含まれています。

    • [リソース グループ]: 作成されたすべてのリソースのコンテナー。
    • [App Service プラン]: App Service のコンピューティング リソースを定義します。 B1 レベルの Linux プランが作成されます。
    • [App Service]: アプリを表し、App Service プランで実行されます。
    • [仮想ネットワーク]: App Service アプリと統合され、バックエンド ネットワーク トラフィックを分離します。
    • Azure Database for MySQL Flexible Server: DNS ゾーン統合を通じて仮想ネットワークからのみアクセス可能です。 サーバー上にデータベースが自動的に作成されます。
    • [Azure Cache for Redis]: 仮想ネットワーク内からのみアクセスできます。
    • プライベート エンドポイント: 仮想ネットワーク内のキー コンテナーと Redis キャッシュのアクセス エンドポイント。
    • [プライベート DNS ゾーン]: 仮想ネットワーク内のキー コンテナー、データベース サーバー、Redis キャッシュの DNS 解決を可能にします。
    • [Log Analytics ワークスペース]: アプリでログを配布するためのターゲット コンテナーとして機能します。ここでは、ログにクエリを実行することもできます。
    • [キー コンテナー]: AZD を使用して再デプロイしたときにデータベース パスワードを同じに維持するために使用されます。

問題がありますか? 「トラブルシューティング」セクションを確認してください。

3.アプリケーション コードで Azure 接続文字列を使用する

使用している AZD テンプレートにより、接続変数がアプリ設定として既に自動的に生成されており、それらが便宜のためにターミナルに出力されます。 アプリの設定は、接続のシークレットをコード リポジトリに残さないための 1 つの方法です。

  1. AZD 出力で、 AZURE_MYSQL_AZURE_REDIS_で始まるアプリ設定を見つけます。 設定名のみが表示されます。 これらは、AZD の出力では次のようになります。

     App Service app has the following app settings:
             - AZURE_KEYVAULT_RESOURCEENDPOINT
             - AZURE_KEYVAULT_SCOPE
             - AZURE_MYSQL_DBNAME
             - AZURE_MYSQL_FLAG
             - AZURE_MYSQL_HOST
             - AZURE_MYSQL_PASSWORD
             - AZURE_MYSQL_PORT
             - AZURE_MYSQL_USERNAME
             - AZURE_REDIS_DATABASE
             - AZURE_REDIS_HOST
             - AZURE_REDIS_PASSWORD
             - AZURE_REDIS_PORT
             - AZURE_REDIS_SSL
     

    AZURE_MYSQL_で始まる設定は MySQL データベースの接続変数であり、AZURE_REDIS_で始まる設定は Redis Cache 用です。 これは、後でコードで使用する必要があります。 便宜上、AZD テンプレートには、Azure portal のアプリのアプリ設定ページへの直接リンクが表示されます。

  2. エクスプローラーから config/database.php を開きます。 これは、データベースと Redis Cache 接続の構成ファイルです。

  3. mysql接続を定義するパーツ (46 から 64 行目) を見つけ、AZD 出力のDB_HOST アプリ設定でDB_PORTDB_DATABASEDB_USERNAMEDB_PASSWORD、およびAZURE_MYSQL_を置き換えます。 mysql接続は次のコードのようになります。

    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('AZURE_MYSQL_HOST', '127.0.0.1'),
        'port' => env('AZURE_MYSQL_PORT', '3306'),
        'database' => env('AZURE_MYSQL_DBNAME', 'forge'),
        'username' => env('AZURE_MYSQL_USERNAME', 'forge'),
        'password' => env('AZURE_MYSQL_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
    

    Laravel のデータベース構成の詳細については、 Laravel のドキュメントを参照してください。

  4. Redis Cache 接続を定義する部分 (140 から 147 行目) を見つけ、AZD 出力の REDIS_HOSTREDIS_PASSWORDREDIS_PORTREDIS_CACHE_DBAzure_REDIS_ アプリ設定に置き換えます。 また、接続に 'scheme' => 'tls', を追加します。 キャッシュ接続は次のコードのようになります。

    'cache' => [
        'scheme' => 'tls',
        'url' => env('REDIS_URL'),
        'host' => env('AZURE_REDIS_HOST', '127.0.0.1'),
        'username' => env('REDIS_USERNAME'),
        'password' => env('AZURE_REDIS_PASSWORD'),
        'port' => env('AZURE_REDIS_PORT', '6379'),
        'database' => env('AZURE_REDIS_DATABASE', '1'),
    ],
    

    Laravel での Redis Cache の構成の詳細については、 Laravel のドキュメントを参照してください

    変更はまだデプロイされていないことに注意してください。 次の手順の最後にデプロイします。

4. WebアプリでLaravel設定を構成する

  1. エクスプローラーで infra/resources.bicep を開きます。 これは、作成された Azure リソースを定義する Bicep ファイルです。

  2. アプリ設定を定義するパーツ (510 から 514 行目) を見つけてコメントを解除します。 これらのアプリ設定は次のとおりです。

    設定 説明
    CACHE_DRIVER Redis をキャッシュとして使用するように Laravel に指示します ( Laravel のドキュメントを参照)。
    MYSQL_ATTR_SSL_CA Azure で MySQL への TLS 接続を開くために必要です。 便宜上、証明書ファイルはサンプル リポジトリに含まれています。 この変数は、config/database.php の mysql 接続によって使用されます
    LOG_CHANNEL stderrにログをパイプするように Laravel に指示します。これにより、App Service ログで使用できるようになります (Laravel のドキュメントを参照)。
    APP_DEBUG Laravel でデバッグ モード ページを有効にします ( Laravel のドキュメントを参照)。
    APP_KEY Laravel 暗号化変数。 AZD テンプレートでは既に Key Vault シークレット (212 行目から 217 行目) が作成されているため、 Key Vault 参照を使用してアクセスできます。
  3. infra/resources.bicep で、App Service アプリのリソース定義とコメント解除行 315 を見つけます。

    appCommandLine: 'cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload'
    

    Laravel アプリケーションのライフサイクル は、アプリケーション ルートではなく /public ディレクトリから開始されます。 App Service の既定の PHP コンテナーでは、アプリケーション ルートで開始される Nginx が使用されます。 サイト ルートを変更するには、PHP コンテナー内 (/etc/nginx/sites-available/default) の Nginx 構成ファイルを変更する必要があります。 便宜上、サンプル リポジトリには default と呼ばれる置換構成ファイルが含まれており、 Nginx に /public ディレクトリを検索するように指示します。 appCommandLineのこのカスタム コマンドは、Linux コンテナーがクリーンな状態から再読み込みされるたびに、アプリがファイル置換の適用を開始するたびに実行されます。

  4. codespace ターミナルに戻り、もう一度 azd up 実行します。

    azd up
    

ヒント

azd up は、 azd packageazd provision、および azd deploy を一緒に実行します。インフラストラクチャとアプリケーションの両方の変更を行うため、これは理にかなっています。 インフラストラクチャの変更のみを行うには、 azd provisionを実行します。 変更をアプリケーション コードにデプロイするには、 azd deployを実行します。

問題がありますか? 「トラブルシューティング」セクションを確認してください。

5.データベース スキーマを生成する

MySQL データベースが仮想ネットワークによって保護されている場合、Laravel データベースの移行を実行する最も簡単な方法は、App Service の Linux コンテナーとの SSH セッションにあります。

  1. AZD の出力で、SSH セッションの URL を見つけ、ブラウザーでそこに移動します。 出力では次のようになります。

     Open SSH session to App Service container at: <URL>
     
  2. SSH セッションで、 /home/site/wwwroot ディレクトリからデータベースの移行を実行します。

    cd /home/site/wwwroot
    php artisan migrate --force
    

    それが成功したら、App Service はデータベースに正常に接続しています

/home 内のファイルへの変更のみが、アプリの再起動後も保持されます。

問題がありますか? 「トラブルシューティング」セクションを確認してください。

6.アプリに移動

  1. AZD の出力で、アプリの URL を見つけ、ブラウザーでそこに移動します。 URL は、AZD の出力では次のようになります。

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <URL>
     
  2. 一覧にいくつかのタスクを追加します。

    タスクを示す Azure で実行されている MySQL を含む Laravel Web アプリのスクリーンショット。

    おめでとうございます。Azure Database for MySQL へのセキュリティで保護された接続を使用して、Web アプリが Azure App Service で実行されています。

問題がありますか? 「トラブルシューティング」セクションを確認してください。

7.診断ログをストリーミングする

Azure App Service は、アプリケーションの問題を診断するために、コンソールに記録されたすべてのメッセージをキャプチャします。 便宜のために、AZD テンプレートでは、既にローカル ファイル システムへのログ記録が有効になっており、それらのログが Log Analytics ワークスペースに配布されています

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

Route::get('/', function () {
    Log::info("Get /");
    $startTime = microtime(true);
    // Simple cache-aside logic
    if (Cache::has('tasks')) {
        $data = Cache::get('tasks');
    } else {
        $data = Task::orderBy('created_at', 'asc')->get();
        Cache::add('tasks', $data);
    }
    return view('tasks', ['tasks' => $data, 'elapsed' => microtime(true) - $startTime]);
});

AZD の出力で、App Service ログをストリーミングするためのリンクを見つけ、ブラウザーでそこに移動します。 このリンクは、AZD の出力では次のようになります。

Stream App Service logs at: <URL>

問題がありますか? 「トラブルシューティング」セクションを確認してください。

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

現在のデプロイ環境内のすべての Azure リソースを削除するには、azd down を実行し、プロンプトに従います。

azd down

トラブルシューティング

データベースの移行中にエラーが発生する php_network_getaddresses: getaddrinfo for mysqldb failed: No address associated with hostname...

これは、MySQL 接続変数が正しく構成されていないことを示します。 AZURE_MYSQL_ アプリの設定が 3 で正しく構成されていることを確認します。アプリケーション コードで Azure 接続文字列を使用します。

ブラウザーに空白のページが表示されます。

これは、App Service が /public で PHP 開始ファイルを見つけることができないことを示します。 4 の手順に従います 。Web アプリで Laravel の設定を構成します。

ブラウザーでデバッグ ページが表示される Unsupported cipher or incorrect key length.

APP_KEY設定が無効なキーに設定されていることを示します。 azd upを実行するときは、appKeyの出力にphp artisan key:generate --showを設定してください。

ブラウザーでデバッグ ページが表示される Uncaught Error: Class "Illuminate\..." not found.

このエラーと同様のエラーは、composer installする前にazd upを実行しなかったか、/vendor ディレクトリ内のパッケージが古くなっていることを示しています。 composer installを実行し、もう一度azd deployします。

ブラウザーでデバッグ ページが表示される php_network_getaddresses: getaddrinfo for redishost failed: Name or service not known.

Redis 接続変数が正しく構成されていないことを示します。 AZURE_REDIS_ アプリの設定が 3 で正しく構成されていることを確認します。アプリケーション コードで Azure 接続文字列を使用します。

ブラウザーでデバッグ ページが表示される SQLSTATE[42S02]: Base table or view not found: 1146 Table 'XXXX-XXXXXXXXX-mysql-database.tasks' doesn't exist

つまり、データベースの移行を実行していないか、データベースの移行が成功しなかったことを意味します。 5. の手順に従います 。データベース スキーマを生成します

よく寄せられる質問

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

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

  • 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 を統合することもできます。

APP_KEY アプリの設定を Key Vault 参照に変更するにはどうすればよいですか?

「4 - Laravel 変数の構成」のポータルの手順から、GitHub コードスペースで次の Azure CLI コマンドを実行して、APP_KEYを Key Vault 参照に変更できます。

# Change the following variables to match your environment
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
KEY_VAULT_NAME=<key-vault-name>
APP_SERVICE_NAME=<app-name>
SECRET_NAME=laravelAppKey

# Set the subscription ID
az account set --subscription $SUBSCRIPTION_ID

# Assign 'Key Vault Secrets Officer' role to your user at the scope of the key vault
az role assignment create \
  --assignee $(az ad signed-in-user show --query id -o tsv) \
  --role $(az role definition list --name "Key Vault Secrets Officer" --query "[].id" -o tsv) \
  --scope $(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id --output tsv)

# Add the secret to the key vault
az keyvault secret set \
  --vault-name $KEY_VAULT_NAME \
  --name $SECRET_NAME \
  --value $(php artisan key:generate --show)

# Add Key Vault reference to the App Service configuration
az webapp config appsettings set \
  --resource-group $RESOURCE_GROUP \
  --name $APP_SERVICE_NAME \
  --settings "APP_KEY=@Microsoft.KeyVault(SecretUri=https://$KEY_VAULT_NAME.vault.azure.net/secrets/$SECRET_NAME)"

ポータルで同じ操作を実行することもできます。 詳細については、以下を参照してください。

  1. Key Vault スコープのロールの割り当て
  2. キー コンテナーにシークレットを追加する
  3. キー コンテナーからシークレットを取得する
  4. アプリケーションの設定を構成する

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 つにまとめて、アップロードとダウンロードの手順を不要にすることで、ワークフロー ファイルを簡略化することができます。

ユーザー割り当て ID を作成するためのアクセス許可がありません

デプロイ センターから GitHub Actions デプロイを設定する」を参照してください。

自分のコードスペースで GitHub Copilot を使用して何ができますか?

codespace を作成したときに、既に GitHub Copilot チャット ビューが表示されていることに気付いたかもしれません。 便宜のために、GitHub Copilot チャット拡張機能をコンテナー定義 (.devcontainer/devcontainer.json を参照) に含めています。 ただし、GitHub Copilot アカウント (30 日間の無料試用版を利用できます) が必要です。

GitHub Copilot に話しかけるときのヒントを、いくつか次に示します。

  • 1 つのチャット セッションでは、質問と回答は相互に基づいて構築されていくので、質問を調整すると、得られる回答を絞り込むことができます。
  • 既定では、GitHub Copilot からリポジトリ内のファイルにはアクセスできません。 ファイルに関する質問を問い合わせるには、まず、エディターでファイルを開きます。
  • GitHub Copilot がその回答を準備するときにリポジトリ内のすべてのファイルにアクセスできるようにするには、@workspace で質問を開始します。 詳細については、Use the @workspace agentを参照してください。
  • チャット セッションでは、GitHub Copilot は変更を提案でき、場合によっては (@workspace を使用して) 変更を行う箇所も提案できますが、変更を行うことはできません。 提案された変更を追加してテストするかどうかは、ご自身が決める必要があります。

次の手順

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

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