Azure Functions の zip デプロイ

この記事では、関数アプリ プロジェクト ファイルを .zip (圧縮) ファイルから Azure にデプロイする方法について説明します。 Azure CLI を使用する方法と REST API を使用する方法の両方について、プッシュ デプロイの方法を学習します。 Azure Functions Core Tools は、ローカル プロジェクトを Azure に発行するときにも、このようなデプロイメント API を使用します。

Azure Functions には、Azure App Service によって提供されている、さまざまな継続的デプロイと統合オプションが含まれています。 詳細については、「Azure Functions の継続的なデプロイ」を参照してください。

開発にかかる時間を短縮するには、関数アプリ プロジェクト ファイルを .zip ファイルから直接デプロイするのが手軽であると考えられます。 .zip デプロイ API は、.zip ファイルの内容を取得して、関数アプリの wwwroot フォルダーに抽出します。 この .zip ファイル デプロイでは、Kudu サービスを使用することで、継続的な統合ベース デプロイを効率化できます。たとえば、次のような作業を効率化できます。

  • 以前のデプロイから残っているファイルの削除。
  • デプロイのカスタマイズ (デプロイ スクリプトの実行など)。
  • デプロイ ログ。
  • 従量課金プラン関数アプリ内の関数トリガーの同期。

詳細については、.zip デプロイのリファレンスに関するページをご覧ください。

デプロイ .zip ファイルの要件

プッシュ デプロイに使用する .zip ファイルには、関数の実行に必要なすべてのファイルを含める必要があります。

重要

.zip デプロイを実行した場合、既存のデプロイに含まれているファイルのうち、.zip ファイルに含まれていないものはすべて、関数アプリから削除されます。

特定の関数アプリ内のすべての関数のコードは、ホスト構成ファイルを含むルート プロジェクト フォルダーにあります。 host.json ファイルにはランタイム固有の構成が含まれています。このファイルは関数アプリのルート フォルダーにあります。 bin フォルダーには、関数アプリに必要なパッケージやその他のライブラリ ファイルが含まれています。 関数アプリが必要とする特定のフォルダー構造は、言語によって異なります。

Functions ランタイムのバージョン 2.x およびそれ以上では、関数アプリ内のすべての関数が同じ言語スタックを共有する必要があります。

関数アプリには、wwwroot ディレクトリ内のすべてのファイルとフォルダーが含まれています。 .zip ファイルの展開には、wwwroot ディレクトリの内容が含まれますが、ディレクトリ自体は含まれません。 C# クラス ライブラリ プロジェクトをデプロイするときは、コンパイル済みのライブラリ ファイルと依存関係を .zip パケージの bin サブフォルダーに含める必要があります。

ローカル コンピューター上で開発する場合は、組み込みの .zip 圧縮機能またはサードパーティ製のツールを使用して、関数アプリ プロジェクト フォルダーの .zip ファイルを手動で作成できます。

関数アプリ ファイルをダウンロードする

Azure portal のエディターを使用して関数を作成した場合は、次のいずれかの方法で、既存の関数アプリ プロジェクトを .zip ファイルとしてダウンロードできます。

  • Azure portal から:

    1. Azure Portal にサインインし、関数アプリに移動します。

    2. [概要] タブで、 [アプリのコンテンツのダウンロード] を選択します。 ダウンロード オプションを選択し、 [ダウンロード] を選択します。

      関数アプリ プロジェクトのダウンロード

      ダウンロードした .zip ファイルは、.zip プッシュ デプロイを使用して関数アプリに再発行するための適切な形式になっています。 ポータルのダウンロードでは、Visual Studio で関数アプリを直接開くために必要なファイルを追加することもできます。

  • REST API の使用:

    <function_app> プロジェクトからファイルをダウンロードするには、以下の展開の GET API を使用します。

    https://<function_app>.scm.azurewebsites.net/api/zip/site/wwwroot/
    

    /site/wwwroot/ を含めると、zip ファイルには関数アプリ プロジェクト ファイルのみが含まれ、サイト全体は含まれません。 Azure にまだサインインしていない場合は、サインインするように求められます。

.zip ファイルは GitHub リポジトリからダウンロードすることもできます。 GitHub リポジトリを .zip ファイルとしてダウンロードする場合は、分岐用のフォルダー レベルが追加されます。 この追加のフォルダー レベルは、.zip ファイルを GitHub からダウンロードする際、その .zip ファイルを直接デプロイすることはできないということを意味します。 GitHub リポジトリを使用して関数アプリを管理している場合は、継続的インテグレーションを使用してアプリをデプロイする必要があります。

Azure CLI を使用したデプロイ

プッシュ デプロイは、Azure CLI を使用してトリガーすることもできます。 その場合は、az functionapp deployment source config-zip コマンドを使用して、.zip ファイルを関数アプリにプッシュ デプロイします。 このコマンドを使用するには、Azure CLI バージョン 2.0.21 以降を使用する必要があります。 使用している Azure CLI のバージョンを確認するには、az --version コマンドを使用します。

次のコマンドでは、<zip_file_path> プレース ホルダーを .zip ファイルの場所へのパスに置き換えてください。 また、<app_name> を関数アプリの一意の名前に置き換え、<resource_group> をリソース グループの名前に置き換えます。

az functionapp deployment source config-zip -g <resource_group> -n \
<app_name> --src <zip_file_path>

このコマンドを実行すると、ダウンロードした .zip ファイル内のプロジェクト ファイルが、Azure 内の関数アプリにデプロイされます。 その後、アプリが再起動されます。 この関数アプリに対するデプロイの一覧を表示するには、REST API を使用する必要があります。

Azure CLI をローカル コンピューター上で使用している場合、<zip_file_path> にはお使いのコンピューター上の .zip ファイルへのパスを指定します。 Azure CLI は Azure Cloud Shell 内で実行することもできます。 Cloud Shell を使用する場合は、まず、Cloud Shell に関連付けられた Azure Files アカウントに .zip ファイルをアップロードする必要があります。 その場合は、<zip_file_path> には、Cloud Shell アカウントで使用している保存場所を指定します。 詳細については、「Azure Cloud Shell でファイルを永続化する」をご覧ください。

REST API を使って ZIP ファイルを展開する

展開サービス REST API を使って、.zip ファイルを Azure 内のアプリに展開できます。 展開するには、POST 要求を https://<アプリ名>.scm.azurewebsites.net/api/zipdeploy に送信します。 POST 要求のメッセージの本文に .zip ファイルを含める必要があります。 アプリの展開資格情報は、HTTP 基本認証を使って要求で提供します。 詳しくは、.zip のプッシュ展開に関するページをご覧ください。

HTTP BASIC 認証では、App Service 展開資格情報が必要です。 自分の展開資格情報を設定する方法については、「ユーザー レベルの資格情報の設定とリセット」を参照してください。

cURL を使用する

次の例は cURL ツールを使用して .zip ファイルを展開します。 プレースホルダー <deployment_user><zip_file_path><app_name> を置き換えます。 cURL によって要求されたら、パスワードを入力します。

curl -X POST -u <deployment_user> --data-binary @"<zip_file_path>" https://<app_name>.scm.azurewebsites.net/api/zipdeploy

この要求により、アップロードされた .zip ファイルからのプッシュ展開がトリガーされます。 次の cURL の例で示すように、https://<app_name>.scm.azurewebsites.net/api/deployments エンドポイントを使うことにより、現在および過去の展開を確認できます。 やはり、<app_name> はアプリの名前に置き換え、<deployment_user> は展開資格情報のユーザー名に置き換えます。

curl -u <deployment_user> https://<app_name>.scm.azurewebsites.net/api/deployments

PowerShell の場合

次の例では、Publish-AzWebapp を使用して .zip ファイルをアップロードします。 プレースホルダー <group-name><app-name><zip-file-path> を置き換えます。

Publish-AzWebapp -ResourceGroupName <group-name> -Name <app-name> -ArchivePath <zip-file-path>

この要求により、アップロードされた .zip ファイルからのプッシュ展開がトリガーされます。

現在と過去の展開を確認するには、次のコマンドを実行します。 ここでも、<deployment-user><deployment-password>、および <app-name> の各プレースホルダーを置き換えます。

$username = "<deployment-user>"
$password = "<deployment-password>"
$apiUrl = "https://<app-name>.scm.azurewebsites.net/api/deployments"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))
$userAgent = "powershell/1.0"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent $userAgent -Method GET

展開パッケージから関数を実行する

展開パッケージのファイルから直接関数を実行することもできます。 この方法では、パッケージから関数アプリの wwwroot ディレクトリにファイルをコピーする手順がスキップされます。 代わりに、パッケージ ファイルが Functions ランタイムによってマウントされ、wwwroot ディレクトリの内容が読み取り専用になります。

zip デプロイとこの機能は統合されており、関数アプリの設定 WEBSITE_RUN_FROM_PACKAGE の値を 1 に設定することで有効にできます。 詳しくは、展開パッケージ ファイルからの関数の実行に関するページをご覧ください。

展開のカスタマイズ

展開プロセスでは、プッシュする .zip ファイルにはすぐに実行できる状態のアプリが含まれるものと想定されています。 既定では、カスタマイズは実行されません。 継続的インテグレーションで取得するものと同じビルド プロセスを有効にするには、アプリケーションの設定に以下を追加します。

SCM_DO_BUILD_DURING_DEPLOYMENT=true

.zip プッシュ展開を使うときのこの設定の既定値は false です。 継続的インテグレーション展開の場合の既定値は true です。 true に設定すると、展開の間にユーザーの展開関連の設定が使われます。 これらの設定は、アプリ設定として、または .zip ファイルのルートに存在する .deployment 構成ファイルで、構成できます。 詳しくは、展開リファレンスの「Repository and deployment-related settings」(リポジトリと展開関連の設定) をご覧ください。

次のステップ