ZIP パッケージから Azure App Service のアプリを直接実行する
Note
パッケージからの実行は、Python アプリではサポートされていません。 Python コードの ZIP ファイルをデプロイする場合は、Azure ビルド自動化を有効にするフラグを設定する必要があります。 ビルド オートメーションでは、アプリ用の Python 仮想環境を作成し、必要な要件やパッケージをインストールします。 詳細については、「ビルド オートメーション」を参照してください。
Azure App Service では、デプロイ ZIP パッケージ ファイルから直接アプリを実行できます。 この記事では、アプリでこの機能を有効にする方法を示します。
App Service での他のすべてのデプロイ方法には共通点があります。ファイルは、アプリの D:\home\site\wwwroot にデプロイされます (または、Linux アプリの場合は /home/site/wwwroot)。 同じディレクトリが実行時にアプリによって使用されるので、ファイル ロックの競合によってデプロイが失敗する可能性があります。また、一部のファイルがまだ更新されていないため、アプリが予期しない動作をする可能性があります。
これに対して、パッケージから直接実行すると、パッケージ内のファイルは wwwroot ディレクトリにコピーされません。 代わりに、ZIP パッケージ自体が読み取り専用の wwwroot ディレクトリとして直接マウントされます。 パッケージから直接実行すると、いくつかのメリットがあります。
- デプロイとランタイムの間でファイル ロックの競合がなくなります。
- 常に、完全にデプロイされたアプリのみが実行されることが保証されます。
- 運用環境のアプリにデプロイできます (再起動が必要です)。
- Azure Resource Manager デプロイのパフォーマンスが向上します。
- 特に大規模な npm パッケージのツリーの JavaScript 関数の場合、コールド スタート時間を減らすことができます。
Note
現時点では、ZIP パッケージ ファイルのみがサポートされています。
プロジェクトの ZIP パッケージを作成する
重要
デプロイ用の ZIP パッケージを作成するときは、ルート ディレクトリは含めず、その中のファイルとディレクトリのみを含めるようにしてください。 GitHub リポジトリを ZIP ファイル形式でダウンロードした場合、そのファイルをそのまま App Service にデプロイすることはできません。 GitHub によって ZIP 内に追加されるディレクトリ入れ子構造が App Service に適合しないためです。
ローカル ターミナル ウィンドウで、アプリ プロジェクトのルート ディレクトリに移動します。
このディレクトリには、Web アプリへの入力ファイルを含める必要があります (index.html、 index.php、app.js など)。 パッケージ管理ファイルを含めることもできます (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
パッケージからの実行を有効にする
WEBSITE_RUN_FROM_PACKAGE
アプリ設定により、パッケージから実行できるようになります。 それを設定するには、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"
を使用すると、アプリに対してローカルなパッケージからアプリを実行できます。 リモート パッケージから実行することもできます。
パッケージの実行
App Service でパッケージを実行する最も簡単な方法は、Azure CLI の az webapp deploy コマンドを使用することです。 次に例を示します。
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <filename>.zip
WEBSITE_RUN_FROM_PACKAGE
アプリ設定が設定されているため、このコマンドではパッケージの内容がアプリの 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 からパッケージを実行することもできます。 Azure Storage Explorer を使用して、パッケージ ファイルを Blob Storage アカウントにアップロードします。 Shared Access Signature (SAS) を利用するプライベート ストレージ コンテナーを使用するか、マネージド ID を使用して、App Service ランタイムがパッケージに安全にアクセスできるようにする必要があります。
Note
現時点では、ローカル パッケージを実行する既存の App Service リソースは、リモート パッケージから実行するようには移行できません。 外部 URL から実行するように構成された新しい App Service リソースを作成する必要があります。
ファイルを Blob Storage にアップロードし、ファイルの SAS URL を取得したら、WEBSITE_RUN_FROM_PACKAGE
アプリ設定を URL に設定します。 次の例では、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}
または同様の形式です。
パッケージからの実行時に WebJob ファイルをデプロイする
パッケージからのアプリの実行を有効にする場合、WebJob ファイルをデプロイする方法は 2 つあります。
- アプリと同じ ZIP パッケージでデプロイする: 通常と同じようにそれらを
<project-root>\app_data\jobs\...
に含めます (このパスは、WebJob のクイックスタートに記載されているようにデプロイ パス\site\wwwroot\app_data\jobs\...
にマップされます)。 - アプリの ZIP パッケージとは別にデプロイする: 通常のデプロイ パス
\site\wwwroot\app_data\jobs\...
は現在、読み取り専用であるため、そこに WebJob ファイルをデプロイすることはできません。 代わりに、WebJob ファイルを、読み取り専用ではない\site\jobs\...
にデプロイします。\site\wwwroot\app_data\jobs\...
と\site\jobs\...
にデプロイされた WebJob の両方が実行されます。
Note
\site\wwwroot
が読み取り専用になると、 disable.job の作成などの操作は失敗します。
トラブルシューティング
- パッケージから直接実行すると、
wwwroot
は読み取り専用になります。 アプリがこのディレクトリにファイルを書き込もうとすると、エラーが発生します。 - TAR および GZIP 形式はサポートされていません。
- ZIP ファイルは、最大 1 GB にすることができます。
- この機能は、ローカル キャッシュと互換性がありません。
- コールドスタートのパフォーマンスを向上するには、ローカルの Zip オプション (
WEBSITE_RUN_FROM_PACKAGE
= 1) を使用します。