注
パッケージからの実行は、Python アプリではサポートされていません。 Python コードの ZIP ファイルをデプロイするときは、ビルドの自動化を有効にするフラグAzure設定する必要があります。 ビルドの自動化により、アプリのPython仮想環境が作成され、必要な要件とパッケージがインストールされます。 詳細については、「ビルド オートメーション」を参照してください。
パッケージからの実行は、Azure App Service上のJava アプリでもサポートされていません。 組み込みのJava ランタイム (SE、Tomcat、JBoss EAP Java) では起動時にアプリ ディレクトリへの書き込みアクセスが必要ですが、パッケージから実行すると、アプリコンテンツが読み取り専用ファイルシステムとしてマウントされます。
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 ファイルとしてダウンロードした場合、そのファイル as-is を 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 の Settings>Properties>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) を使用します。