Azure Functions の zip デプロイ

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

Zip デプロイは、デプロイ パッケージから関数を実行する簡単な方法です。 詳細については、「Azure でパッケージ ファイルから関数を実行する」を参照してください。

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

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

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

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

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

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

重要

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

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

関数アプリのすべての関数では、同じ言語スタックが共有される必要があります。

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

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

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://<app_name>.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

非同期 zip デプロイ

同期的にデプロイするときに、接続タイムアウトに関連するエラーが発生する可能性があります。 ?isAsync=true を URL に追加して、非同期的にデプロイします。 zip ファイルがアップロードされるとすぐに、ポーリング可能なデプロイ状態 URL を指定するLocation ヘッダーが含まれた応答を受け取ります。 Location ヘッダーで指定された URL をポーリングすると、プロセス進行中には HTTP 202 (Accepted) 応答を受け取り、アーカイブが展開されてデプロイが正常に完了すると、HTTP 200 (OK) 応答を受け取ります。

Microsoft Entra 認証

zip デプロイに HTTP 基本認証を使う代わりに、Microsoft Entra の ID を使うこともできます。 SCM サイトで HTTP 基本認証が無効になっている場合は、Microsoft Entra の ID が必要になることがあります。

デプロイを実行するユーザーまたはサービス プリンシパルの有効な Microsoft Entra アクセス トークンが必要です。 アクセス トークンは、Azure CLI の az account get-access-token コマンドを使用して取得できます。 アクセス トークンは、HTTP POST 要求の認証ヘッダーで使用されます。

curl -X POST \
    --data-binary "@<zip_file_path>" \
    -H "Authorization: Bearer <access_token>" \
    "https://<app_name>.scm.azurewebsites.net/api/zipdeploy"

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

ARM テンプレートを使用したデプロイ

ZipDeploy ARM テンプレート拡張機能を使用して、.zip ファイルを関数アプリにプッシュできます。

ZipDeploy ARM テンプレートの例

このテンプレートには、運用スロットとステージング スロットの両方が含まれており、いずれか一方にデプロイされます。 通常は、このテンプレートを使用してステージング スロットにデプロイし、スワップして、運用スロットで実行されている新しい zip パッケージを取得します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "appServiceName": {
      "type": "string"
    },
    "deployToProduction": {
      "type": "bool",
      "defaultValue": false
    },
    "slot": {
      "type": "string",
      "defaultValue": "staging"
    },
    "packageUri": {
      "type": "secureString"
    }
  },
  "resources": [
    {
      "condition": "[parameters('deployToProduction')]",
      "type": "Microsoft.Web/sites/extensions",
      "apiVersion": "2021-02-01",
      "name": "[format('{0}/ZipDeploy', parameters('appServiceName'))]",
      "properties": {
        "packageUri": "[parameters('packageUri')]",
        "appOffline": true
      }
    },
    {
      "condition": "[not(parameters('deployToProduction'))]",
      "type": "Microsoft.Web/sites/slots/extensions",
      "apiVersion": "2021-02-01",
      "name": "[format('{0}/{1}/ZipDeploy', parameters('appServiceName'), parameters('slot'))]",
      "properties": {
        "packageUri": "[parameters('packageUri')]",
        "appOffline": true
      }
    }
  ]
}

初期デプロイでは、運用スロットに直接デプロイします。 詳細については、「スロットのデプロイ」を参照してください。

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

展開パッケージのファイルから直接関数を実行することもできます。 この方法では、パッケージから関数アプリの 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」(リポジトリと展開関連の設定) をご覧ください。

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

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 リポジトリを使用して関数アプリを管理している場合は、継続的インテグレーションを使用してアプリをデプロイする必要があります。

次のステップ