ZIP パッケージから Azure App Service のアプリを直接実行する

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はトップレベルにネストされたディレクトリを追加しますが、これはApp Serviceでは機能しません。

ローカル ターミナル ウィンドウで、アプリ プロジェクトのルート ディレクトリに移動します。

このディレクトリには、Web アプリへの入力ファイルを含める必要があります (index.htmlindex.phpapp.js など)。 パッケージ管理ファイルを含めることもできます (project.jsoncomposer.jsonpackage.jsonbower.jsonrequirements.txt など)。

デプロイの自動化を App Service で自動的に実行したい場合を除き、すべてのビルド タスク (npmbowergulpcomposerpip など) を実行し、アプリの実行に必要なファイルがすべて揃っていることを確認してください。 パッケージを直接実行したい場合、この手順は必須です。

プロジェクト内のすべての 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 deployment source config-zip コマンドを使用することです。 次に例を示します。

az webapp deployment source config-zip --resource-group <group-name> --name <app-name> --src <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 ランタイムがパッケージに安全にアクセスできるようにする必要があります。

ファイルを 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 内のパッケージにアクセスする

Azure AD で要求を承認するように Azure Blob Storage を構成できます。 つまり、有効期限がある SAS キーを生成する代わりに、アプリケーションのマネージド ID を使用することができます。 既定では、アプリのシステム割り当て ID が使用されます。 ユーザー割り当て ID を指定する場合は、WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID アプリ設定をその ID のリソース ID に設定できます。 この設定は "SystemAssigned" を値として受け入れることもできますが、これは設定をまとめて省略することと同じです。

ID を使用してパッケージをフェッチできるようにするには、次のようにします。

  1. Blob がプライベート アクセス用に構成されていることを確認します。

  2. ID に、パッケージ blob に対するスコープを持つ Storage Blob データリーダー ロールを付与します。 ロールの割り当ての作成の詳細については、「blob データにアクセスするための Azure ロールの割り当て」を参照してください。

  3. WEBSITE_RUN_FROM_PACKAGE アプリケーション設定をパッケージの BLOB 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) を使用します。

その他のリソース