注
パッケージからの実行は、Python アプリではサポートされていません。 Python コードの ZIP ファイルをデプロイする場合は、Azure ビルド オートメーションを有効にするフラグを設定する必要があります。 ビルド オートメーションでは、アプリ用の Python 仮想環境を作成し、必要な要件やパッケージをインストールします。 詳細については、「ビルド オートメーション」を参照してください。
Azure App Service では、デプロイ ZIP パッケージ ファイルから直接アプリを実行できます。 この記事では、アプリでこの機能を有効にする方法を示します。
App Service の他のすべての展開方法には共通点があります。解凍ファイルは、アプリの D:\home\site\wwwroot (または Linux アプリの 場合は /home/site/wwwroot ) に展開されます。 同じディレクトリが実行時にアプリによって使用されるので、ファイル ロックの競合によってデプロイが失敗する可能性があります。また、一部のファイルがまだ更新されていないため、アプリが予期しない動作をする可能性があります。 この設定を有効にするには、 WEBSITE_RUN_FROM_PACKAGE
変数に値を割り当てる必要はありません。また、完全に削除することもできます。
一方、ZIP パッケージから直接実行する場合、パッケージ内のファイルは wwwroot ディレクトリにコピーされません。 代わりに、ZIP パッケージ自体が読み取り専用の wwwroot ディレクトリとして直接マウントされます。 この設定を有効にするには、 WEBSITE_RUN_FROM_PACKAGE
=1 を設定するか、ZIP ファイルの URL を指定します。 パッケージから直接実行すると、いくつかのメリットがあります。
- デプロイとランタイムの間でファイル ロックの競合がなくなります。
- 常に、完全にデプロイされたアプリのみが実行されることが保証されます。
- 運用環境のアプリにデプロイできます (再起動が必要です)。
- Azure Resource Manager デプロイのパフォーマンスが向上します。
- 特に大規模な npm パッケージ ツリーの JavaScript 関数の場合、コールド スタート時間を減らすことができます。
注
現時点では、ZIP パッケージ ファイルのみがサポートされています。
プロジェクトの ZIP パッケージを作成する
重要
デプロイ用の ZIP パッケージを作成するときは、ルート ディレクトリを含めないでください。 ルート ディレクトリ内のファイルとディレクトリのみを含めます。 GitHub リポジトリを ZIP ファイルとしてダウンロードした場合、そのファイルをそのまま App Service にデプロイすることはできません。 GitHub では、入れ子になったディレクトリが最上位レベルに追加されます。これは App Service では機能しません。
ローカル ターミナル ウィンドウ内で、アプリ プロジェクトのルート ディレクトリに移動します。
このディレクトリには、 index.html
、 index.php
、 app.js
など、Web アプリへのエントリ ファイルが含まれている必要があります。 また、 project.json
、 composer.json
、 package.json
、 bower.json
、 requirements.txt
などのパッケージ管理ファイルを含めることもできます。
App Service でデプロイの自動化を実行したくない場合は、すべてのビルド タスクを実行します。 たとえば、 npm
、 bower
、 gulp
、 composer
、 pip
などです。 アプリを実行するために必要なすべてのファイルがあることを確認してください。
パッケージを直接実行する場合、この手順は必須です。
プロジェクト内のすべての ZIP アーカイブを作成します。
dotnet
プロジェクトの場合は、出力ディレクトリ自体を除き、dotnet publish
コマンドの出力ディレクトリ内のすべてを追加します。 たとえば、ターミナルで次のコマンドを入力して、現在のディレクトリの内容を含む ZIP パッケージを作成します。
# Bash
zip -r <file-name>.zip .
# PowerShell
Compress-Archive -Path * -DestinationPath <file-name>.zip
ZIP パッケージからの実行を有効にする
WEBSITE_RUN_FROM_PACKAGE
アプリ設定では、ZIP パッケージから実行できます。 それを設定するには、Azure CLI で次のコマンドを実行します。
az webapp config appsettings set --resource-group <group-name> --name <app-name> --settings WEBSITE_RUN_FROM_PACKAGE="1"
WEBSITE_RUN_FROM_PACKAGE="1"
を使用すると、アプリをローカルの ZIP パッケージから実行できます。
リモート パッケージから実行することもできます。
ZIP パッケージを実行する
App Service で ZIP パッケージを実行する最も簡単な方法は、Azure CLI az webapp deployment source config-zip コマンドを使用することです。 次に例を示します。
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <filename>.zip
WEBSITE_RUN_FROM_PACKAGE
アプリの設定が設定されているため、このコマンドは ZIP パッケージの内容をアプリの D:\home\site\wwwroot ディレクトリに抽出しません。 代わりに、ZIP ファイルがそのまま D:\home\data\SitePackages にアップロードされ、同じディレクトリに packagename が作成されます。それには、実行時に読み込む ZIP パッケージの名前が含まれています。 ZIP パッケージを別の方法 (FTP など) でアップロードした場合は、D:\home\data\SitePackages ディレクトリと packagename ファイルを手動で作成する必要があります。
また、このコマンドではアプリが再起動されます。
WEBSITE_RUN_FROM_PACKAGE
が設定されているため、App Service では、アップロードされたパッケージが読み取り専用の wwwroot ディレクトリとしてマウントされ、そのマウントされたディレクトリからアプリが直接実行されます。
代わりに外部 URL から実行する
Azure Blob Storage などの外部 URL から ZIP パッケージを実行することもできます。 Azure Storage Explorer を使用して、BLOB ストレージ アカウントに ZIP パッケージ ファイルをアップロードできます。 Shared Access Signature (SAS) でプライベート ストレージ コンテナーを使用するか、マネージド ID を使用して App Service ランタイムが ZIP パッケージに安全にアクセスできるようにする必要があります。
注
現時点では、ローカル ZIP パッケージを実行する既存の App Service リソースを、リモート ZIP パッケージから実行するように移行することはできません。 外部 URL から実行するように構成された新しい App Service リソースを作成する必要があります。
ファイルを Blob Storage にアップロードし、ファイルの SAS URL を取得したら、WEBSITE_RUN_FROM_PACKAGE
アプリ設定をその URL に設定します。 URL が .zip
で終わることを確認します。 次の例では、Azure CLI を使用してそれを行っています。
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_RUN_FROM_PACKAGE="https://myblobstorage.blob.core.windows.net/content/SampleCoreMVCApp.zip?st=2018-02-13T09%3A48%3A00Z&se=2044-06-14T09%3A48%3A00Z&sp=rl&sv=2017-04-17&sr=b&sig=bNrVrEFzRHQB17GFJ7boEanetyJ9DGwBSV8OM3Mdh%2FM%3D"
更新されたパッケージを同じ名前で Blob Storage に発行する場合は、更新されたパッケージが App Service に読み込まれるように、アプリを再起動する必要があります。
マネージド ID を使用して Azure Blob Storage 内のパッケージにアクセスする
Microsoft Entra ID で要求を承認するように Azure Blob Storage を構成できます。 この構成とは、有効期限がある SAS キーを生成する代わりに、アプリケーションのマネージド ID を使用することです。 既定では、アプリのシステム割り当て ID が使用されます。 ユーザー割り当て ID を指定する場合は、WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID
アプリ設定をその ID のリソース ID に設定できます。 この設定では SystemAssigned
を値として受け入れることもできます。これは、設定を省略することと同じです。
ID を使用してパッケージをフェッチできるようにするには、次のようにします。
Blob がプライベート アクセス用に構成されていることを確認します。
ID に、パッケージ blob に対するスコープを持つ Storage Blob データリーダー ロールを付与します。 ロールの割り当ての作成の詳細については、「blob データにアクセスするための Azure ロールの割り当て」を参照してください。
WEBSITE_RUN_FROM_PACKAGE
アプリケーション設定をパッケージの BLOB URL に設定します。 この URL は通常、https://{storage-account-name}.blob.core.windows.net/{container-name}/{path-to-package}
または同様の形式です。ユーザー割り当て ID を指定する場合は、
WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID
アプリ設定をその ID のリソース ID に設定できます。 この設定は "SystemAssigned" を値として受け入れることもできますが、これは設定をまとめて省略することと同じです。 リソース ID は、Azure でのリソースの標準的な表現です。 ユーザー割り当てマネージド ID の場合、それは/subscriptions/subid/resourcegroups/rg-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name
になります。 ユーザー割り当てマネージド ID のリソース ID は、[設定] ->[プロパティ] ->[ユーザー割り当てマネージド ID の ID] で取得できます。
パッケージからの実行時に WebJob ファイルをデプロイする
パッケージからのアプリの実行を有効にする場合、WebJob ファイルをデプロイする方法は 2 つあります。
- アプリと同じ ZIP パッケージでデプロイする: 通常と同じようにそれらを
<project-root>\app_data\jobs\...
に含めます (このパスは、\site\wwwroot\app_data\jobs\...
に記載されているようにデプロイ パス にマップされます)。 - アプリの ZIP パッケージとは別にデプロイする: 通常のデプロイ パス
\site\wwwroot\app_data\jobs\...
は現在、読み取り専用であるため、そこに WebJob ファイルをデプロイすることはできません。 代わりに、WebJob ファイルを、読み取り専用ではない\site\jobs\...
にデプロイします。\site\wwwroot\app_data\jobs\...
と\site\jobs\...
にデプロイされた WebJob の両方が実行されます。
注
\site\wwwroot
が読み取り専用になると、disable.job の作成などの操作は失敗します。
トラブルシューティング
- パッケージから直接実行すると、
wwwroot
は読み取り専用になります。 アプリがこのディレクトリにファイルを書き込もうとすると、エラーが発生します。 - TAR および GZIP 形式はサポートされていません。
- ZIP ファイルは、最大 1 GB にすることができます。
- この機能は、ローカル キャッシュと互換性がありません。
- コールドスタートのパフォーマンスを向上するには、ローカルの Zip オプション (
WEBSITE_RUN_FROM_PACKAGE
= 1) を使用します。