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 関数の場合、コールド スタート時間を減らすことができます。

注意

現時点では、ZIP パッケージ ファイルのみがサポートされています。

プロジェクトの ZIP パッケージを作成する

注意

ファイルを ZIP パッケージでダウンロードした場合は、まずファイルを抽出します。 たとえば、GitHub から ZIP パッケージをダウンロードした場合、そのファイルをそのままデプロイすることはできません。 GitHub では、入れ子になったディレクトリが追加されますが、これらは App Service と連携しません。

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

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

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

プロジェクト内のすべての ZIP アーカイブを作成します。 dotnet プロジェクトの場合、このフォルダーは dotnet publish コマンドの出力フォルダーです。 次のコマンドには、お使いの端末の既定のツールを使用します。

# 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}" のような形式になります。

トラブルシューティング

  • パッケージから直接実行すると、wwwroot は読み取り専用になります。 アプリがこのディレクトリにファイルを書き込もうとすると、エラーが発生します。
  • TAR および GZIP 形式はサポートされていません。
  • ZIP ファイルは、最大 1 GB にすることができます。
  • この機能は、ローカル キャッシュと互換性がありません。
  • コールドスタートのパフォーマンスを向上するには、ローカルの Zip オプション (WEBSITE_RUN_FROM_PACKAGE = 1) を使用します。

その他のリソース