チュートリアル:Azure App Service で PHP および MySQL アプリを構築する

Azure App Service は、Windows オペレーティング システムを使用する、高度にスケーラブルな自己適用型の Web ホスティング サービスを提供します。 このチュートリアルでは、Azure で PHP アプリを作成し、MySQL データベースに接続する方法について説明します。 このチュートリアルを終了すると、Azure App Service on Windows で実行される Laravel アプリが完成します。

Azure App Service は、Linux オペレーティング システムを使用する、高度にスケーラブルな自己適用型の Web ホスティング サービスを提供します。 このチュートリアルでは、Azure で PHP アプリを作成し、MySQL データベースに接続する方法について説明します。 このチュートリアルを終了すると、Azure App Service on Linux で実行される Laravel アプリが完成します。

Task List という PHP サンプル アプリのスクリーンショット。

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

  • Azure で MySQL データベースを作成する
  • PHP アプリを MySQL に接続する
  • Azure にアプリケーションをデプロイする
  • データ モデルを更新し、アプリを再デプロイする
  • Azure から診断ログをストリーミングする
  • Azure Portal でアプリを管理する

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

前提条件

このチュートリアルを完了するには、以下が必要です。

  • Azure Cloud Shell で Bash 環境を使用します。

    新しいウィンドウで Cloud Shell を起動する

  • 必要に応じて、Azure CLI をインストールして、CLI リファレンス コマンドを実行します。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

ローカル MySQL を準備する

この手順では、このチュートリアルで使用するデータベースをローカル MySQL サーバーに作成します。

ローカル MySQL サーバーに接続する

ターミナル ウィンドウで、ローカル MySQL サーバーに接続します。 このチュートリアルでは、ターミナル ウィンドウを使ってすべてのコマンドを実行します。

mysql -u root -p

パスワードの入力を求められたら、root アカウントのパスワードを入力します。 ルート アカウントのパスワードを思い出せない場合は、「MySQL: root のパスワードをリセットする方法」を参照してください。

コマンドが正常に実行されれば、MySQL サーバーは実行されています。 正常に実行されない場合は、MySQL のインストール後の手順に従って、MySQL サーバーが起動されたことを確認してください。

ローカルにデータベースを作成する

mysql プロンプトで、データベースを作成します。

CREATE DATABASE sampledb;

quit」と入力して、サーバー接続を終了します。

quit

ローカルに PHP アプリを作成する

この手順では、Laravel サンプル アプリケーションを取得し、データベース接続を構成してローカルで実行します。

サンプルを複製する

ターミナル ウィンドウから、cd コマンドで作業ディレクトリに移動します。

次のコマンドを実行して、サンプル レポジトリを複製します。

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

cd コマンドで複製したディレクトリに移動します。 必要なパッケージをインストールします。

cd laravel-tasks
composer install

MySQL 接続を構成する

リポジトリのルートに、 .env という名前のファイルを作成します。 次の変数を .env ファイルにコピーします。 <root_password > プレース ホルダーを、MySQL ルート ユーザーのパスワードに置き換えます。

APP_ENV=local
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=sampledb
DB_USERNAME=root
DB_PASSWORD=<root_password>

この .env ファイルを Laravel でどのように使用するかの詳細については、Laravel 環境の構成に関するページを参照してください。

ローカルでサンプルを実行する

Laravel データベースの移行を実行して、アプリケーションで必要なテーブルを作成します。 移行で作成されるテーブルを確認するには、Git レポジトリの database/migrations ディレクトリを調べます。

php artisan migrate

新しい Laravel アプリケーション キーを生成します。

php artisan key:generate

アプリケーションを実行します。

php artisan serve

ブラウザーで http://localhost:8000 にアクセスします。 ページで、いくつかのタスクを追加します。

MySQL に正常に接続されている PHP

PHP を停止するには、ターミナルで Ctrl + C キーを押します。

Azure に MySQL を作成する

この手順では、MySQL データベースを Azure Database for MySQL に作成します。 その後、このデータベースに接続するように PHP アプリケーションを構成します。

リソース グループを作成する

リソース グループとは、Web アプリ、データベース、ストレージ アカウントなどの Azure リソースのデプロイと管理に使用する論理コンテナーです。 たとえば、後から簡単な手順で一度にリソース グループ全体を削除することもできます。

Cloud Shell で az group create コマンドを使用して、リソース グループを作成します。 次の例では、myResourceGroup という名前のリソース グループを "西ヨーロッパ" の場所に作成します。 Free レベルの App Service がサポートされているすべての場所を表示するには、az appservice list-locations --sku FREE コマンドを実行します。

az group create --name myResourceGroup --location "West Europe"

通常は、現在地付近の地域にリソース グループおよびリソースを作成します。

コマンドが完了すると、リソース グループのプロパティが JSON 出力に表示されます。

MySQL サーバーを作成する

Cloud Shell で az mysql server create コマンドを使用して、Azure Database for MySQL にサーバーを作成します。

次のコマンドの <mysql-server-name> プレースホルダーを一意のサーバー名で置き換え、 <admin-user> プレースホルダーをユーザー名で置き換え、 <admin-password> プレースホルダーをパスワードで置き換えます。 このサーバー名は、MySQL エンドポイント (https://<mysql-server-name>.mysql.database.azure.com) の一部として使用されるため、Azure のすべてのサーバーで一意である必要があります。 MySQL DB SKU の選択の詳細については、「Azure Database for MySQL サーバーの作成」をご覧ください。

az mysql server create --resource-group myResourceGroup --name <mysql-server-name> --location "West Europe" --admin-user <admin-user> --admin-password <admin-password> --sku-name B_Gen5_1

MySQL サーバーが作成されると、Azure CLI によって、次の例のような情報が表示されます。

{
  "administratorLogin": "<admin-user>",
  "administratorLoginPassword": null,
  "fullyQualifiedDomainName": "<mysql-server-name>.mysql.database.azure.com",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/<mysql-server-name>",
  "location": "westeurope",
  "name": "<mysql-server-name>",
  "resourceGroup": "myResourceGroup",
  ...
  -  < Output has been truncated for readability >
}

サーバーのファイアウォールを構成する

Cloud Shell で az mysql server firewall-rule create コマンドを使用して、MySQL サーバーでクライアント接続を許可するためのファイアウォール規則を作成します。 開始 IP と終了 IP の両方が 0.0.0.0 に設定されている場合、ファイアウォールは他の Azure リソースに対してのみ開かれます。

az mysql server firewall-rule create --name allAzureIPs --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0

ヒント

アプリで使用する送信 IP アドレスのみを使用することで、ファイアウォール規則による制限をさらに厳しくすることができます。

Cloud Shell 内で <your-ip-address>ローカル IPv4 IP アドレスに置き換えてコマンドを再び実行し、ローカル コンピューターからアクセスできるようにします。

az mysql server firewall-rule create --name AllowLocalClient --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address=<your-ip-address> --end-ip-address=<your-ip-address>

ローカルに運用 MySQL サーバーに接続する

ローカルのターミナル ウィンドウで、Azure の MySQL サーバーに接続します。 <admin-user><mysql-server-name> に指定した値を使用します。 パスワードの入力を求められたら、Azure でデータベースの作成時に指定したパスワードを使用します。

mysql -u <admin-user>@<mysql-server-name> -h <mysql-server-name>.mysql.database.azure.com -P 3306 -p

運用データベースを作成する

mysql プロンプトで、データベースを作成します。

CREATE DATABASE sampledb;

アクセス許可を持つユーザーを作成する

phpappuser というデータベース ユーザーを作成し、このユーザーに sampledb データベースのすべての特権を付与します。 パスワードには MySQLAzure2017 を使用します。このチュートリアルのために単純なパスワードを選択しています。

CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2017'; 
GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';

quit」と入力して、サーバー接続を終了します。

quit

アプリを Azure MySQL に接続する

この手順では、Azure Database for MySQL に作成した MySQL データベースに PHP アプリケーションを接続します。

データベース接続を構成する

リポジトリのルートに .env.production ファイルを作成し、その中に次の変数をコピーします。 DB_HOSTDB_USERNAME の両方で、プレースホルダーの <mysql_server_name> を置き換えます。

APP_ENV=production
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=<mysql-server-name>.mysql.database.azure.com
DB_DATABASE=sampledb
DB_USERNAME=phpappuser@<mysql-server-name>
DB_PASSWORD=MySQLAzure2017
MYSQL_SSL=true

変更を保存します。

ヒント

MySQL の接続情報を保護するために、このファイルは既に Git リポジトリから除外されています (リポジトリのルートで .gitignore を参照してください)。 後で、App Service の環境変数を構成して Azure Database for MySQL のデータベースに接続する方法を学習します。 環境変数を構成するので、App Service には .env ファイルは必要ありません。

TLS/SSL 証明書を構成する

既定では、Azure Database for MySQL はクライアントからの TLS 接続を強制します。 Azure で MySQL データベースに接続するには、Azure Database for MySQL から提供された .pem 証明書を使用する必要があります。

config/database.php を開き、次のコードに示すように sslmode パラメーターと options パラメーターを connections.mysql に追加します。

'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/BaltimoreCyberTrustRoot.crt.pem', 
    ] : []
],
'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/BaltimoreCyberTrustRoot.crt.pem',
    ] : []
],

このチュートリアルでは、便宜上、証明書 BaltimoreCyberTrustRoot.crt.pem がリポジトリに用意されています。

ローカルでアプリケーションをテストする

環境ファイルとして .env.production を使用して Laravel データベースの移行を実行して、Azure Database for MySQL の MySQL データベース内にテーブルを作成します。 .env.production には Azure の MySQL データベースへの接続情報が含まれていることに注意してください。

php artisan migrate --env=production --force

この時点では、 .env.production には有効なアプリケーション キーはありません。 ターミナルで、新しいものを生成します。

php artisan key:generate --env=production --force

環境ファイルとして .env.production を使用してサンプル アプリケーションを実行します。

php artisan serve --env=production

http://localhost:8000 に移動します。 エラーなしでページが読み込まれれば、PHP アプリケーションは Azure の MySQL データベースに接続しています。

ページで、いくつかのタスクを追加します。

PHP が Azure Database for MySQL に正常にデータベースに接続されている

PHP を停止するには、ターミナルで Ctrl + C キーを押します。

変更をコミットする

次の Git コマンドを実行して、変更をコミットします。

git add .
git commit -m "database.php updates"

アプリをデプロイする準備ができました。

Deploy to Azure (Azure へのデプロイ)

この手順では、MySQL に接続される PHP アプリケーションを Azure App Service にデプロイします。

デプロイ ユーザーを構成する

FTP およびローカルの Git では、"デプロイ ユーザー" を使用して Azure Web アプリにデプロイできます。 デプロイ ユーザーを構成すると、すべての Azure デプロイでこのユーザーを使用できます。 アカウントレベルのデプロイのユーザー名とパスワードは、Azure サブスクリプションの資格情報とは異なります。

デプロイ ユーザーを構成するには、Azure Cloud Shell で az webapp deployment user set コマンドを実行します。 <username> と <password> を、デプロイ ユーザーのユーザー名とパスワードで置き換えます。

  • ユーザー名は、Azure 内で一意である必要があります。ローカル Git プッシュの場合、"@" 記号を含めることはできません。
  • パスワードは長さが 8 文字以上で、文字、数字、記号のうち 2 つを含む必要があります。
az webapp deployment user set --user-name <username> --password <password>

JSON 出力には、パスワードが null として表示されます。 'Conflict'. Details: 409 エラーが発生した場合は、ユーザー名を変更します。 'Bad Request'. Details: 400 エラーが発生した場合は、より強力なパスワードを使用します。

Web アプリのデプロイに使用するユーザー名とパスワードを記録します。

App Service プランを作成する

Cloud Shell で az appservice plan create コマンドを使用して、App Service プランを作成します。

次の例では、Free 価格レベルの myAppServicePlan という名前の App Service プランを作成します。

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

App Service プランが作成されると、Azure CLI によって、次の例のような情報が表示されます。

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

Cloud Shell で az appservice plan create コマンドを使用して、App Service プランを作成します。

次の例では、Free 価格レベルの myAppServicePlan という名前の App Service プランを作成します。

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE --is-linux

App Service プランが作成されると、Azure CLI によって、次の例のような情報が表示されます。

{ 
  "freeOfferExpirationTime": null,
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "linux",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

Web アプリを作成する

myAppServicePlan App Service プランで Web アプリを作成します。

Cloud Shell で、az webapp create コマンドを使用することができます。 次の例では、<app-name> をグローバルに一意のアプリ名に置き換えてください (有効な文字は a-z0-9-)。 ランタイムは PHP|7.2 に設定されています。 サポートされているすべてのランタイムを確認するには、az webapp list-runtimes --linux を実行します。

# Bash
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git
# PowerShell
az --% webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git

Web アプリが作成されると、Azure CLI によって次の例のような出力が表示されます。

Local git is configured with url of 'https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

Git デプロイが有効な、空の新しい Web アプリが作成されました。

注意

Git リモートの URL は deploymentLocalGitUrl プロパティに https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git 形式で出力されます。 この URL は後で必要になるので保存しておいてください。

myAppServicePlan App Service プランで Web アプリを作成します。

Cloud Shell で、az webapp create コマンドを使用することができます。 次の例では、<app-name> をグローバルに一意のアプリ名に置き換えてください (有効な文字は a-z0-9-)。 ランタイムは PHP|7.2 に設定されています。 サポートされているすべてのランタイムを確認するには、az webapp list-runtimes --linux を実行します。

# Bash
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git
# PowerShell
az --% webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git

Web アプリが作成されると、Azure CLI によって次の例のような出力が表示されます。

Local git is configured with url of 'https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

Git デプロイが有効な、空の新しい Web アプリが作成されました。

注意

Git リモートの URL は deploymentLocalGitUrl プロパティに https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git 形式で出力されます。 この URL は後で必要になるので保存しておいてください。

データベース設定を構成する

App Service で、az webapp config appsettings set コマンドを使用して、環境変数を "アプリ設定" として設定します。

次のコマンドでは、アプリ設定 DB_HOSTDB_DATABASEDB_USERNAME、および DB_PASSWORD を構成します。 プレースホルダーの <app-name><mysql-server-name> を置き換えます。

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DB_HOST="<mysql-server-name>.mysql.database.azure.com" DB_DATABASE="sampledb" DB_USERNAME="phpappuser@<mysql-server-name>" DB_PASSWORD="MySQLAzure2017" MYSQL_SSL="true"

PHP getenv メソッドを使用して、これらの設定にアクセスできます。 Laravel コードでは、PHP getenv に対して env ラッパーが使用されます。 たとえば、config/database.php の MySQL 構成は次のコードのようになります。

'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'database'  => env('DB_DATABASE', 'forge'),
    'username'  => env('DB_USERNAME', 'forge'),
    'password'  => env('DB_PASSWORD', ''),
    ...
],

Laravel の環境変数を構成する

Laravel には App Service のアプリケーション キーが必要です。 これはアプリ設定で構成できます。

ローカル ターミナル ウィンドウで、php artisan を使用して新しいアプリケーションキーを生成します ( .env には保存されません)。

php artisan key:generate --show

Cloud Shell で az webapp config appsettings set コマンドを使用して、App Service アプリにアプリケーション キーを設定します。 プレースホルダーの <app-name><outputofphpartisankey:generate> を置き換えます。

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings APP_KEY="<output_of_php_artisan_key:generate>" APP_DEBUG="true"

APP_DEBUG="true" は、デプロイしたアプリでエラーが発生した場合にデバッグ情報を返すように Laravel に指示します。 運用アプリケーションを実行するときは、false に設定してセキュリティを強化します。

仮想アプリケーション パスを設定する

アプリの仮想アプリケーション パスを設定します。 この手順が必要なのは、Laravel アプリケーション のライフサイクルがアプリケーションのルート ディレクトリではなく パブリック ディレクトリから始まるためです。 ライフ サイクルがルート ディレクトリから始まる PHP フレームワークは、仮想アプリケーション パスの手動での構成なしで動作できます。

Cloud Shell で az resource update コマンドを使用して、仮想アプリケーション パスを設定します。 <app-name> プレースホルダーを置換します。

az resource update --name web --resource-group myResourceGroup --namespace Microsoft.Web --resource-type config --parent sites/<app_name> --set properties.virtualApplications[0].physicalPath="site\wwwroot\public" --api-version 2015-06-01

既定では、Azure App Service は、デプロイされたアプリケーション ファイルのルート ディレクトリ (sites\wwwroot) に対して仮想アプリケーションのルート パス ( / ) をポイントします。

Laravel アプリケーションのライフサイクルは、アプリケーションのルート ディレクトリではなく "パブリック" ディレクトリから始まります。 App Service の既定の PHP Docker イメージでは Apache が使用されていて、Laravel 用に DocumentRoot をカスタマイズすることはできません。 ただし、.htaccess を使用して、ルート ディレクトリではなく /public を指すようにすべての要求を書き換えることができます。 リポジトリ ルートには、この目的のために既に .htaccess が追加されています。 これにより、Laravel アプリケーションをすぐにデプロイできます。

詳細については、「Change site root (サイトのルートを変更する)」を参照してください。

Git から Azure へのプッシュ

ローカル ターミナル ウィンドウで、ローカル Git リポジトリに Azure リモートを追加します。 <deploymentLocalGitUrl-from-create-step> を、「Web アプリを作成する」で保存した Git リモートの URL で置き換えます。

git remote add azure <deploymentLocalGitUrl-from-create-step>

アプリをデプロイするために、次のコマンドで Azure リモートにプッシュします。 Git Credential Manager によって資格情報の入力を求めるメッセージが表示されたら、Azure portal へのサインインに使用する資格情報ではなく、「デプロイ ユーザーを構成する」で作成した資格情報を入力してください。

git push azure master

このコマンドの実行には、数分かかる場合があります。 実行中、次の例のような情報が表示されます。

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'a5e076db9c'.
remote: Running custom deployment command...
remote: Running deployment command...
...
< Output has been truncated for readability >

注意

デプロイ プロセスの最後に Composer パッケージがインストールされることに気付くかもしれません。 App Service では既定のデプロイ中にこれらの自動化が実行されないため、このサンプル レポジトリには、有効化するための3 つのファイルがルート ディレクトリに追加されます。

  • .deployment - このファイルは、bash deploy.sh をカスタム デプロイ スクリプトとして実行するよう App Service に指示します。
  • deploy.sh - カスタム デプロイ スクリプト。 このファイルを確認すると、npm install の後で php composer.phar install が実行されることがわかります。
  • composer.phar - Composer パッケージ マネージャー。

この方法を使用して、App Service に対する Git ベースのデプロイに対して任意の手順を追加できます。 詳細については、「Custom Deployment Script (カスタム デプロイ スクリプト)」を参照してください。

ローカル ターミナル ウィンドウで、ローカル Git リポジトリに Azure リモートを追加します。 <deploymentLocalGitUrl-from-create-step> を、「Web アプリを作成する」で保存した Git リモートの URL で置き換えます。

git remote add azure <deploymentLocalGitUrl-from-create-step>

アプリをデプロイするために、次のコマンドで Azure リモートにプッシュします。 Git Credential Manager によって資格情報の入力を求めるメッセージが表示されたら、Azure portal へのサインインに使用する資格情報ではなく、「デプロイ ユーザーを構成する」で作成した資格情報を入力してください。

git push azure master

このコマンドの実行には、数分かかる場合があります。 実行中、次の例のような情報が表示されます。

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'a5e076db9c'.
remote: Running custom deployment command...
remote: Running deployment command...
...
< Output has been truncated for readability >

Azure アプリを参照する

http://<app-name>.azurewebsites.net を参照し、一覧にいくつかのタスクを追加します。

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

データ主導型の PHP アプリが Azure App Service で実行されています。

ローカルにモデルを更新し、再デプロイする

この手順では、task データ モデルと Web アプリに単純な変更を加え、変更内容を Azure に発行します。

このタスク シナリオでは、タスクを完了としてマークできるようにアプリケーションを変更します。

列を追加する

ローカル ターミナル ウィンドウで、Git リポジトリのルートに移動します。

tasks テーブル用の新しいデータベースの移行を生成します。

php artisan make:migration add_complete_column --table=tasks

このコマンドは、生成される移行ファイルの名前を表示します。 このファイルを database/migrations で探して開きます。

up メソッドを次のコードに置き換えます。

public function up()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->boolean('complete')->default(False);
    });
}

上のコードは、tasks テーブルに complete と呼ばれるブール値の列を追加します。

down メソッドを、ロールバック アクション用の次のコードに置き換えます。

public function down()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->dropColumn('complete');
    });
}

ローカル ターミナル ウィンドウで、Laravel データベースの移行を実行して、ローカル データベースを変更します。

php artisan migrate

Laravel の名前付け規則に基づいて、モデル Task (app/Task.php 参照) を tasks テーブルに既定でマップします。

アプリケーション ロジックを更新する

routes/web.php ファイルを開きます。 アプリケーションは、そのルートとビジネス ロジックをここに定義します。

ファイルの末尾に、次のコードを使用してルートを追加します。

/**
 * Toggle Task completeness
 */
Route::post('/task/{id}', function ($id) {
    error_log('INFO: post /task/'.$id);
    $task = Task::findOrFail($id);

    $task->complete = !$task->complete;
    $task->save();

    return redirect('/');
});

上のコードは、データ モデルに対して complete 値の切り替えによる単純な更新を行います。

ビューを更新する

resources/views/tasks.blade.php ファイルを開きます。 <tr> 開始タグを探し、次のコードに置き換えます。

<tr class="{{ $task->complete ? 'success' : 'active' }}" >

上のコードは、タスクが完了しているかどうかに応じて行の色を変更します。

次の行には、次のコードがあります。

<td class="table-text"><div>{{ $task->name }}</div></td>

この行全体を次のコードに置き換えます。

<td>
    <form action="{{ url('task/'.$task->id) }}" method="POST">
        {{ csrf_field() }}

        <button type="submit" class="btn btn-xs">
            <i class="fa {{$task->complete ? 'fa-check-square-o' : 'fa-square-o'}}"></i>
        </button>
        {{ $task->name }}
    </form>
</td>

上のコードは、前に定義したルートを参照する送信ボタンを追加します。

変更をローカルでテストする

ローカル ターミナル ウィンドウで、Git リポジトリのルート ディレクトリから開発サーバーを実行します。

php artisan serve

タスクの状態の変更を確認するには、ブラウザーで http://localhost:8000 に移動し、チェック ボックスをオンにします。

タスクに追加されたチェック ボックス

PHP を停止するには、ターミナルで Ctrl + C キーを押します。

Azure に変更を発行する

ローカル ターミナル ウィンドウで、運用環境の接続文字列を使用して Laravel データベースの移行を実行して、Azure の運用データベースを変更します。

php artisan migrate --env=production --force

すべての変更を Git にコミットした後、コードの変更を Azure にプッシュします。

git add .
git commit -m "added complete checkbox"
git push azure main

git push が完了したら、Azure アプリに移動し、新機能を試します。

Azure に発行されたモデルとデータベースの変更

タスクを追加した場合は、そのタスクがデータベースに保持されます。 データ スキーマに対する更新では、既存のデータはそのまま残ります。

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

Azure App Service で PHP アプリケーションを実行している場合、コンソール ログをターミナルにパイプできます。 このようにすると、アプリケーション エラーのデバッグに役立つ同じ診断メッセージを取得できます。

ログのストリーミングを開始するには、Cloud Shell で az webapp log tail コマンドを使用します。

az webapp log tail --name <app_name> --resource-group myResourceGroup

ログのストリーミングが開始されたら、ブラウザーで Azure アプリを最新の情報に更新して、Web トラフィックを取得します。 ターミナルにパイプされたコンソール ログが表示されます。 コンソール ログがすぐに表示されない場合は、30 秒以内にもう一度確認します。

任意のタイミングでログのストリーミングを停止するには、Ctrl+C と入力します。

App Service のアプリケーション コード内から生成されたコンソール ログにアクセスするには、Cloud Shell で次のコマンドを実行して、診断ログを有効にします。

az webapp log config --resource-group <resource-group-name> --name <app-name> --application-logging true --level Verbose

--level で有効な値は、ErrorWarningInfo、および Verbose です。 後続の各レベルには、前のレベルが含まれます。 たとえば、Error にはエラー メッセージのみが含まれ、Verbose にはすべてのメッセージが含まれます。

診断ログがオンになったら、次のコマンドを実行して、ログのストリームを確認します。

az webapp log tail --resource-group <resource-group-name> --name <app-name>

コンソール ログがすぐに表示されない場合は、30 秒以内にもう一度確認します。

注意

https://<app-name>.scm.azurewebsites.net/api/logs/docker で、ブラウザーからログ ファイルを検査することもできます。

任意のタイミングでログのストリーミングを停止するには、Ctrl+C と入力します。

ヒント

PHP アプリケーションは、標準の error_log() を使用してコンソールに出力できます。 サンプル アプリケーションでは、app/Http/routes.php でこの方法を使用しています。

Web フレームワークとして、Laravel では、ログ記録プロバイダーとして Monolog を使用しています。 Monolog でコンソールにメッセージを出力する方法については、「PHP:How to use monolog to log to console (php://out)」 (PHP: monolog を使用してコンソールにログを記録する方法 (php://out)) を参照してください。

Azure アプリの管理

Azure portal に移動し、お客様が作成したアプリを管理します。

左側のメニューで [App Services] をクリックしてから、お客様の Azure アプリの名前をクリックします。

Azure アプリへのポータル ナビゲーション

お客様のアプリの [概要] ページを確認します。 ここでは、停止、開始、再開、参照、削除のような基本的な管理タスクを行うことができます。

左側のメニューは、アプリを構成するためのページを示しています。

Azure Portal の [App Service] ページ

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

前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると想定していない場合、Cloud Shell で次のコマンドを実行して、リソース グループを削除します。

az group delete --name myResourceGroup

このコマンドの実行には、少し時間がかかる場合があります。

次のステップ

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

  • Azure で MySQL データベースを作成する
  • PHP アプリを MySQL に接続する
  • Azure にアプリケーションをデプロイする
  • データ モデルを更新し、アプリを再デプロイする
  • Azure から診断ログをストリーミングする
  • Azure Portal でアプリを管理する

次のチュートリアルに進み、カスタム DNS 名をアプリにマップする方法を学習してください。

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