Azure Functions の関数アプリのリソース デプロイを自動化

Bicep ファイルまたは Azure Resource Manager テンプレートを使用して、新規または既存の Azure リソースへの関数アプリのデプロイ プロセスを自動化できます。 このような自動化には、DevOps でリソースのデプロイをソース コードと統合したり、関数アプリと関連リソースをバックアップから復元したり、アプリのトポロジを複数回デプロイしたりできる素晴らしい方法が用意されています。

この記事では、Azure Functions のリソース作成とデプロイを自動化する方法を紹介します。 関数で使用されるトリガーとバインドによっては、他のリソースをデプロイする必要がある場合もありますが、その内容はこの記事では触れていません。

具体的なテンプレート コードは、関数アプリがどのようにホストされているか、コードがデプロイされているかコンテナー化された関数アプリであるか、アプリで使用されているオペレーティング システムなどによって異なります。 この記事では、次のホスティング オプションをサポートしています。

ホスティング オプション デプロイの種類 詳細については、次を参照してください。
Azure Functions 従量課金プラン コードのみ 従量課金プラン
Azure Functions の Elastic Premium プラン コード | コンテナー Premium プラン
Azure Functions 専用 (App Service) プラン コード | コンテナー 専用プラン
Azure Container Apps コンテナーのみ Azure Functions の Container Apps ホスティング
Azure Arc コード | コンテナー Azure Arc の App Service、Functions、および Logic Apps (プレビュー)

必要なリソース

Azure Functions でホストされているデプロイは通常、次のリソースで構成されています。

リソース 要件 構文とプロパティの参照
ストレージ アカウント 必須 Microsoft.Storage/storageAccounts
Application Insights コンポーネント 推奨 Microsoft.Insights/components
ホスティング プラン 必須1 Microsoft.Web/serverfarms
関数アプリ 必須 Microsoft.Web/sites

重要課金プラン向けの Azure Functions のデプロイは通常、次のリソースで構成されています。

リソース 要件 構文とプロパティの参照
ストレージ アカウント 必須 Microsoft.Storage/storageAccounts
Application Insights コンポーネント 推奨 Microsoft.Insights/components
関数アプリ 必須 Microsoft.Web/sites

Azure Container Apps でホストされているデプロイは通常、次のリソースで構成されています。

リソース 要件 構文とプロパティの参照
ストレージ アカウント 必須 Microsoft.Storage/storageAccounts
Application Insights コンポーネント 推奨 Microsoft.Insights/components
マネージド環境 必須 Microsoft.App/managedEnvironments
関数アプリ 必須 Microsoft.Web/sites

Azure Arc でホストされているデプロイは通常、次のリソースで構成されています。

リソース 要件 構文とプロパティの参照
ストレージ アカウント 必須 Microsoft.Storage/storageAccounts
Application Insights コンポーネント 推奨 Microsoft.Insights/components
App Service Kubernetes 環境 必須 Microsoft.ExtendedLocation/customLocations
関数アプリ 必須 Microsoft.Web/sites

1関数アプリを従量課金プランでホストすることを選択した場合、明示的なホスティング プランは必要ありません。

1 つの Bicep ファイルまたは ARM テンプレートに複数のリソースをデプロイする場合、リソースの作成順序が重要です。 この要件は、リソース間の依存関係の結果です。 このような依存関係では、必ず dependsOn 要素を使用して依存リソースの依存関係を定義してください。 詳細については、「ARM テンプレートでのリソース デプロイ順序の定義」または「Bicep でのリソース依存関係」を参照してください。

この記事では、Bicep ファイルの作成または Azure Resource Manager テンプレートの作成に関する基本的な理解があることを前提としており、特定のリソース向けの個別セクションとして例を示しています。 完全な Bicep ファイルと ARM テンプレートの幅広い例については、これらの関数アプリのデプロイ例に関する記事を参照してください。

前提条件

この記事では、Azure Container Apps でマネージド環境を既に作成していることを前提としています。 Container Apps でホストされる関数アプリを作成するには、マネージド環境の名前と ID の両方が必要です。

この記事では、App Service 対応のカスタムの場所Azure Arc 対応 Kubernetes クラスター上に既に作成していることを前提としています。 Azure Arc のカスタムの場所でホストされる関数アプリを作成するには、カスタムの場所 ID と Kubernetes 環境 ID の両方が必要です。

ストレージ アカウントの作成

すべての関数アプリに Azure ストレージ アカウントが必要です。 必要なのは BLOB、テーブル、キュー、およびファイルをサポートする汎用アカウントです。 詳細については、Azure Functions ストレージ アカウント要件に関するページをご覧ください。

重要

ストレージ アカウントは、アプリケーション コード自体を含む重要なアプリ データを格納するために使用されます。 他のアプリやユーザーからのアクセスをストレージ アカウントに制限する必要があります。

次の例のセクションでは、Standard 汎用 v2 ストレージ アカウントを作成しています。

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2022-05-01",
    "name": "[parameters('storageAccountName')]",
    "location": "[parameters('location')]",
    "kind": "StorageV2",
    "sku": {
      "name": "[parameters('storageAccountType')]"
    },
    "properties": {
      "supportsHttpsTrafficOnly": true,
      "defaultToOAuthAuthentication": true
    }
  }
]

詳細な内容については、テンプレート リポジトリの完全な azuredeploy.json ファイルを参照してください。

このストレージ アカウントの接続文字列を AzureWebJobsStorage アプリ設定として設定する必要があります。これは Functions で必要です。 この記事のテンプレートでは、作成したストレージ アカウントに基づいてこの接続文字列の値を作成します。これがベスト プラクティスです。 詳細については、アプリケーションの構成 に関する記事をご覧ください。

ストレージ ログを有効にする

ストレージ アカウントは重要な関数アプリ データに使用されるため、そのコンテンツが変更されているかアカウントを監視する必要があります。 ストレージ アカウントを監視するには、Azure Storage の Azure Monitor リソース ログを構成する必要があります。 この例のセクションでは、myLogAnalytics という名前の Log Analytics ワークスペースがこれらのログの宛先として使用されています。

"resources": [
  {
    "type": "Microsoft.Insights/diagnosticSettings",
    "apiVersion": "2021-05-01-preview",
    "scope": "[format('Microsoft.Storage/storageAccounts/{0}/blobServices/default', parameters('storageAccountName'))]",
    "name": "[parameters('storageDataPlaneLogsName')]",
    "properties": {
        "workspaceId": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('myLogAnalytics'))]",
        "logs": [
          {
            "category": "StorageWrite",
            "enabled": true
          }
        ],
        "metrics": [
          {
            "category": "Transaction",
            "enabled": true
          }
        ]
    }
  }
]

この同じワークスペースは、後で定義する Application Insights リソースに使用できます。 これらのログの操作方法などの詳細については、「Azure ストレージの監視」を参照してください。

Application Insights の作成

Application Insights は、関数アプリの実行を監視するために推奨されます。 次の例のセクションでは、Application Insights リソースは、タイプが Microsoft.Insights/components、サブタイプが web で定義されます。

{
  "type": "Microsoft.Insights/components",
  "apiVersion": "2020-02-02",
  "name": "[variables('applicationInsightsName')]",
  "location": "[parameters('appInsightsLocation')]",
  "tags": {
    "[format('hidden-link:{0}', resourceId('Microsoft.Web/sites', parameters('functionAppName')))]": "Resource"
  },
  "properties": {
    "Application_Type": "web"
  },
  "kind": "web"
},

詳細な内容については、テンプレート リポジトリの完全な azuredeploy.json ファイルを参照してください。

接続は、APPLICATIONINSIGHTS_CONNECTION_STRING アプリケーション設定を使用して関数アプリに指定する必要があります。 詳細については、アプリケーション設定に関する記事を参照してください。

この記事の例では、作成したインスタンスの接続文字列の値を取得します。 以前のバージョンでは、代わりに APPINSIGHTS_INSTRUMENTATIONKEY を使用してインストルメンテーション キーを設定する場合がありますが、これは推奨されません。

ホスティング プランの作成

Azure Functions の Premium プランまたは 専用 (App Service) プランでホストされるアプリでは、ホスティング プランを明示的に定義する必要があります。

Premium プランでは、従量課金プランと同じスケーリングが提供されますが、専用リソースとその他の機能が含まれています。 詳細については、「Azure Functions の Premium プラン」を参照してください。

Premium プランは、特殊なタイプの serverfarm リソースです。 これは、sku プロパティで Name プロパティの EP1EP2EP3 のいずれかの値を使用して指定できます。 Functions ホスティング プランを定義する方法は、関数アプリを Windows 上または Linux 上で実行する場合によって異なります。 次の例のセクションでは EP1 プランを作成します。

"resources": [
  {
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2022-03-01",
    "name": "[parameters('hostingPlanName')]",
    "location": "[parameters('location')]",
    "sku": {
      "name": "EP1",
      "tier": "ElasticPremium",
      "family": "EP"
    },
    "kind": "elastic",
    "properties": {
      "maximumElasticWorkerCount": 20
    }
  }
]

詳細な内容については、テンプレート リポジトリの完全な azuredeploy.json ファイルを参照してください。

sku オブジェクトに関する詳細については、SkuDefinition を参照するか、テンプレートの例を確認してください。

専用 (App Service) プランでは、関数アプリは、Web アプリと同様に、App Service プランの Basic、Standard、および Premium SKU の専用 VM 上で実行されます。 詳細については、専用プランに関するページを参照してください。

Bicep ファイルおよび Azure Resource Manager テンプレートのサンプルについては、Azure App Service プランの関数アプリに関するページをご覧ください

Functions では、Dedicated プランは、serverfarm リソースによって定義される通常の App Service プランです。 少なくとも name 個の値を指定する必要があります。 サポートされているプラン名の一覧については、専用プランで現在サポートされている値の一覧で az appservice plan create--sku 設定を参照してください。

ホスティング プランを定義する方法は、関数アプリを Windows 上または Linux 上で実行する場合によって異なります。

"resources": [
  {
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2022-03-01",
    "name": "[parameters('hostingPlanName')]",
    "location": "[parameters('location')]",
    "sku": {
      "tier": "Standard",
      "name": "S1",
      "size": "S1",
      "family": "S",
      "capacity": 1
    }
  }
]

詳細な内容については、テンプレート リポジトリの完全な azuredeploy.json ファイルを参照してください。

ホスティング プランの作成

従量課金ホスティング プランのリソースを明示的に定義する必要はありません。 このリソース定義をスキップする場合は、関数アプリのリソース自体を作成したときに、プランがリージョンごとに自動的に作成または選択されます。

serverfarm リソースの特別なタイプとして従量課金プランを明示的に定義できます。これには、computeMode プロパティと sku プロパティ向けの値 Dynamic を使用して指定します。 このセクションの例は、従量課金プランを明示的に定義する方法を示しています。 ホスティング プランを定義する方法は、関数アプリを Windows 上または Linux 上で実行する場合によって異なります。

"resources": [
  {
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2022-03-01",
    "name": "[parameters('hostingPlanName')]",
    "location": "[parameters('location')]",
    "sku": {
      "name": "Y1",
      "tier": "Dynamic",
      "size": "Y1",
      "family": "Y",
      "capacity": 0
    },
    "properties": {
      "computeMode": "Dynamic"
    }
  }
]

詳細な内容については、テンプレート リポジトリの完全な azuredeploy.json ファイルを参照してください。

Kubernetes 環境

Azure Functions は、コード プロジェクトまたはコンテナー化された関数アプリとして Azure Arc 対応 Kubernetes にデプロイできます。

アプリを作成し、リソースを計画するには、Azure Arc 対応 Kubernetes クラスター用の App Service Kubernetes 環境 をあらかじめ作成しておく必要があります。 この記事の例では、デプロイ先のカスタムの場所 (customLocationId) と App Service Kubernetes 環境 (kubeEnvironmentId) のリソース ID があることを前提としています。これは、次の例の設定です。

"parameters": {
  "kubeEnvironmentId" : {
    "type": "string"
  },
  "customLocationId" : {
    "type": "string"
  }
}

サイトとプランの両方で、extendedLocation フィールドを使用してカスタムの場所を参照する必要があります。 次の抜粋した例で示すように、extendedLocationproperties の外側に位置し、kindlocation のピアになります。

{
  "type": "Microsoft.Web/serverfarms",
  ...
  {
    "extendedLocation": {
      "name": "[parameters('customLocationId')]"
    },
  }
}

プラン リソースは Linux デプロイであるため、SKU に Kubernetes (K1) の値を使用し、kind フィールドは linux,kubernetes に、reserved プロパティは true にする必要があります。 また、extendedLocationkubeEnvironmentProfile.id をそれぞれカスタムの場所 ID と Kubernetes 環境 ID に設定する必要があります。これらは、次の例のセクションのように見えます。

"resources": [
  {
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2022-03-01",
    "name": "[parameters('hostingPlanName')]",
    "location": "[parameters('location')]",
    "kind": "linux,kubernetes",
    "sku": {
      "name": "K1",
      "tier": "Kubernetes"
    },
    "extendedLocation": {
      "name": "[parameters('customLocationId')]"
    },
    "properties": {
      "kubeEnvironmentProfile": {
        "id": "[parameters('kubeEnvironmentId')]"
      },
      "reserved": true
    }
  }
]

Function App の作成

関数アプリ リソースは、少なくとも functionapp を含むタイプ Microsoft.Web/sites とタイプ kind のリソースによって定義されます。

関数アプリ リソースを定義する方法は、Linux 上または Windows 上でホストする場合によって異なります。

Windows 上で実行する場合に必要なアプリケーション設定の一覧については、「アプリケーションの構成」を参照してください。 Bicep ファイルおよび Azure Resource Manager テンプレートのサンプルについては、「従量課金プランの Windows でホストされる関数アプリ」テンプレートを参照してください。

Windows 上で実行する場合に必要なアプリケーション設定の一覧については、「アプリケーションの構成」を参照してください。

Note

従量課金プランをオプションで定義することを選択する場合は、アプリで serverFarmId プロパティを設定して、それがプランのリソース ID を指すようにする必要があります。 同様に、そのプランを参照する dependsOn 設定が関数アプリに含まれていることを確認してください。 明示的にプランを定義していない場合は、ユーザー向けのプランが作成されます。

プランのリソース ID を参照するようにアプリの serverFarmId プロパティを設定します。 同様に、そのプランを参照する dependsOn 設定が関数アプリに含まれていることを確認してください。

"resources": [
  {
    "type": "Microsoft.Web/sites",
    "apiVersion": "2022-03-01",
    "name": "[parameters('functionAppName')]",
    "location": "[parameters('location')]",
    "kind": "functionapp",
    "dependsOn": [
      "[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
      "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    ],
    "properties": {
      "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "siteConfig": {
        "appSettings": [
          {
            "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
            "value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
          },
          {
            "name": "AzureWebJobsStorage",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "WEBSITE_CONTENTSHARE",
            "value": "[toLower(parameters('functionAppName'))]"
          },
          {
            "name": "FUNCTIONS_EXTENSION_VERSION",
            "value": "~4"
          },
          {
            "name": "FUNCTIONS_WORKER_RUNTIME",
            "value": "node"
          },
          {
            "name": "WEBSITE_NODE_DEFAULT_VERSION",
            "value": "~14"
          }
        ]
      }
    }
  }
]

完全なエンドツーエンドの例については、この azuredeploy.json テンプレートを参照してください。

"resources": [
  {
    "type": "Microsoft.Web/sites",
    "apiVersion": "2022-03-01",
    "name": "[parameters('functionAppName')]",
    "location": "[parameters('location')]",
    "kind": "functionapp",
    "dependsOn": [
      "[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
      "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    ],
    "properties": {
      "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "siteConfig": {
        "alwaysOn": true,
        "appSettings": [
          {
            "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
            "value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
          },
          {
            "name": "AzureWebJobsStorage",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "FUNCTIONS_EXTENSION_VERSION",
            "value": "~4"
          },
          {
            "name": "FUNCTIONS_WORKER_RUNTIME",
            "value": "node"
          },
          {
            "name": "WEBSITE_NODE_DEFAULT_VERSION",
            "value": "~14"
          }
        ]
      }
    }
  }
]

完全なエンドツーエンドの例については、この azuredeploy.json テンプレートを参照してください。

デプロイ ソース

Bicep ファイルまたは ARM テンプレートは、オプションで、次のメソッドを含む関数のコードのデプロイを定義することもできます。

デプロイ ソース

Bicep ファイルまたは ARM テンプレートは、オプションで、zip 展開パッケージを使用した関数のコードのデプロイを定義することもできます。

Azure Resource Manager を使用して、アプリケーションを適切にデプロイするには、リソースが Azure でどのようにデプロイされているかを理解することが重要です。 ほとんどの例で、最上位レベルの構成は siteConfig を使用して適用されます。 この構成は、情報を Functions ランタイムとデプロイ エンジンに提供するため、最上位レベルで設定することが重要です。 sourcecontrols/web 子リソースが適用される前に、最上位の情報が必要です。 これらの設定は、子レベルの config/appSettings リソースで構成できますが、場合によっては、関数アプリを、config/appSettings が適用される "" にデプロイする必要があります。

zip 展開パッケージ

zip 展開は、関数アプリのコードをデプロイするために推奨される方法です。 既定では、zip 展開を使用する関数は展開パッケージ自体で実行されます。 展開パッケージの要件などの詳細については、Azure Functions 向け zip 展開を参照してください。 リソースのデプロイの自動化を使用する場合、Bicep テンプレートまたは ARM テンプレートで .zip 展開パッケージを参照できます。

テンプレートで zip 展開を使用するには、アプリの WEBSITE_RUN_FROM_PACKAGE 設定を 1 に設定し、/zipDeploy リソース定義を含めます。

Linux の従量課金プランでは、このテンプレート例に示すように、WEBSITE_RUN_FROM_PACKAGE 設定で展開パッケージの URI を直接設定します。

次の例では、既存のアプリに zip 展開ソースを追加します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "functionAppName": {
      "type": "string",
      "metadata": {
        "description": "The name of the Azure Function app."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "The location into which the resources should be deployed."
      }
    },
    "packageUri": {
      "type": "string",
      "metadata": {
        "description": "The zip content url."
      }
    }
  },
  "resources": [
    {
      "name": "[concat(parameters('functionAppName'), '/ZipDeploy')]",
      "type": "Microsoft.Web/sites/extensions",
      "apiVersion": "2021-02-01",
      "location": "[parameters('location')]",
      "properties": {
        "packageUri": "[parameters('packageUri')]"
      }
    }
  ]
}

テンプレートに zip 展開リソースを含める場合は、次の点に注意してください。

  • packageUri は、Functions でアクセスできる場所である必要があります。 Shared Access Signature (SAS) を使用した Azure Blob Storage の使用を検討してください。 SAS の有効期限が切れると、Functions はデプロイのために共有にアクセスできなくなります。 SAS を再生成する場合は、WEBSITE_RUN_FROM_PACKAGE 設定を新しい URI 値で更新することを忘れないでください。

  • WEBSITE_RUN_FROM_PACKAGE を URI に設定する場合は、トリガーを手動で同期する必要があります。

  • 設定を追加または更新する場合は、常に appSettings コレクションに必要なアプリケーション設定をすべて設定してください。 明示的に設定されていない既存の設定は、更新によって削除されます。 詳細については、アプリケーションの構成 に関する記事をご覧ください。

  • Functions はパッケージのデプロイの Web デプロイ (msdeploy) をサポートしていません。 代わりに、デプロイ パイプラインと自動化で zip 展開を使用する必要があります。 詳細については、「Azure Functions の zip デプロイ」を参照してください。

リモート ビルド

展開プロセスでは、使用または zip 展開する .zip ファイルにはすぐに実行できる状態のアプリが含まれるものと想定されています。 つまり、既定では、カスタマイズは実行されません。

ただし、Python や Windows コンピューターで開発した Node.js アプリで Linux 固有のパッケージをプルする必要がある場合など、リモートでアプリを再構築する必要があるシナリオもあります。 この場合、zip 展開後にコードのリモート構築を実行するように Functions を構成できます。

リモート ビルドを要求する方法は、デプロイ先のオペレーティング システムによって異なります。

アプリが Windows にデプロイされると、言語固有のコマンド (C# アプリの場合は dotnet restore、Node.js アプリの場合は npm install など) が実行されます。

継続的インテグレーションで取得するものと同じビルド プロセスを有効にするには、アプリケーションの設定に SCM_DO_BUILD_DURING_DEPLOYMENT=true を追加し、WEBSITE_RUN_FROM_PACKAGE を完全に削除します。

Linux コンテナー

コンテナー化された関数アプリを Azure Functions Premium プランまたは専用プランにデプロイする場合、次の手順が必要です。

詳細については、アプリケーションの構成 に関する記事をご覧ください。

"resources": [
  {
    "type": "Microsoft.Web/sites",
    "apiVersion": "2022-03-01",
    "name": "[parameters('functionAppName')]",
    "location": "[parameters('location')]",
    "kind": "functionapp",
    "dependsOn": [
      "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    ],
    "properties": {
      "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "siteConfig": {
        "appSettings": [
          {
            "name": "AzureWebJobsStorage",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "FUNCTIONS_WORKER_RUNTIME",
            "value": "node"
          },
          {
            "name": "WEBSITE_NODE_DEFAULT_VERSION",
            "value": "~14"
          },
          {
            "name": "FUNCTIONS_EXTENSION_VERSION",
            "value": "~4"
          },
          {
            "name": "DOCKER_REGISTRY_SERVER_URL",
            "value": "[parameters('dockerRegistryUrl')]"
          },
          {
            "name": "DOCKER_REGISTRY_SERVER_USERNAME",
            "value": "[parameters('dockerRegistryUsername')]"
          },
          {
            "name": "DOCKER_REGISTRY_SERVER_PASSWORD",
            "value": "[parameters('dockerRegistryPassword')]"
          },
          {
            "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
            "value": "false"
          }
        ],
        "linuxFxVersion": "DOCKER|myacr.azurecr.io/myimage:mytag"
      }
    }
  }
]

コンテナー化された関数を Azure Container Apps にデプロイする場合は、次のテンプレートが必要です。

  • kind フィールドを functionapp,linux,container,azurecontainerapps の値に設定します。
  • managedEnvironmentId サイト プロパティに、Container Apps 環境の完全修飾 URI を設定します。
  • サイトと同時に Microsoft.App/managedEnvironments リソースを作成する場合、サイトの dependsOn コレクションにリソース リンクを追加します。

プライベート コンテナー レジストリから既存の Container Apps 環境にデプロイされるコンテナー化関数アプリの定義は、次の例のようになります。

"resources": [
  {
    "type": "Microsoft.Web/sites",
    "apiVersion": "2022-03-01",
    "name": "[parameters('functionAppName')]",
    "kind": "functionapp,linux,container,azurecontainerapps",
    "location": "[parameters('location')]",
    "dependsOn": [
      "[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
      "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    ],
    "properties": {
      "serverFarmId": "[parameters('hostingPlanName')]",
      "siteConfig": {
        "linuxFxVersion": "DOCKER|myacr.azurecr.io/myimage:mytag",
        "appSettings": [
          {
            "name": "FUNCTIONS_EXTENSION_VERSION",
            "value": "~4"
          },
          {
            "name": "AzureWebJobsStorage",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
            "value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
          }
        ],
      },
      "managedEnvironmentId": "[parameters('managedEnvironmentId')]"
    }
  }
]

Azure Arc に関数をデプロイする場合、関数アプリ リソースの kind フィールドに設定する値は、デプロイのタイプによって異なります。

デプロイの種類 kind フィールド値
コードのみのデプロイ functionapp,linux,kubernetes
コンテナーのデプロイ functionapp,linux,kubernetes,container

ホスティング プラン リソースで行ったように、customLocationId も設定する必要があります。

.NET 6 クイックスタート イメージを使用してコンテナー化された関数アプリの定義は、次の例のようになります。

"resources": [
  {
    "type": "Microsoft.Web/sites",
    "apiVersion": "2022-03-01",
    "name": "[parameters('functionAppName')]",
    "kind": "kubernetes,functionapp,linux,container",
    "location": "[parameters('location')]",
    "extendedLocation": {
      "name": "[parameters('customLocationId')]"
    },
    "dependsOn": [
      "[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
      "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    ],
    "properties": {
      "serverFarmId": "[parameters('hostingPlanName')]",
      "siteConfig": {
        "linuxFxVersion": "DOCKER|mcr.microsoft.com/azure-functions/4-dotnet-isolated6.0-appservice-quickstart",
        "appSettings": [
          {
            "name": "FUNCTIONS_EXTENSION_VERSION",
            "value": "~4"
          },
          {
            "name": "AzureWebJobsStorage",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
            "value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
          }
        ],
        "alwaysOn": true
      }
    }
  }
]

アプリケーション構成

Functions には、Azure で関数アプリを構成するための次のようなオプションがあります。

構成 Microsoft.Web/sites プロパティ
サイトの設定 siteConfig
アプリケーションの設定 siteConfig.appSettings コレクション

siteConfig プロパティには、次のサイト設定が必要です。

これらのアプリケーション設定は、特定のオペレーティング システムとホスティング オプションに必須 (または推奨) です。

次のアプリケーション設定は、コンテナーのデプロイに必要です。

次の設定は、プライベート コンテナー レジストリからデプロイする場合にのみ必要です。

Bicep ファイルや ARM テンプレートを使用してサイトやアプリケーションの設定を行う場合は、次の点に注意してください。

  • 自動デプロイで WEBSITE_CONTENTSHARE を使用する必要がある場合に重要な考慮事項があります。 詳しいガイダンスについては、WEBSITE_CONTENTSHARE リファレンスを参照してください。
  • コンテナー デプロイの場合、アプリのコンテンツはコンテナー自体で提供されるため、WEBSITES_ENABLE_APP_SERVICE_STORAGEfalse にも設定します。
  • この記事の例で実行されているように、アプリケーション設定は常に、作成される Microsoft.Web/sites リソースの siteConfig/appSettings コレクションとして定義する必要があります。 これにより、関数アプリの実行に必要な設定が初期起動時に利用できるようになります。

  • テンプレートを使用してアプリケーション設定を追加または更新する場合は、既存のすべての設定を更新に含めるようにしてください。 基礎となる更新 REST API 呼び出しは /config/appsettings リソース全体を置き換えるため、これを行う必要があります。 既存の設定を削除すると、関数アプリは実行されません。 個々のアプリケーション設定をプログラムを使用して更新するには、代わりに Azure CLI、Azure PowerShell、Azure portal を使用してこれらを変更できます。 詳細については、アプリケーション設定の操作に関する記事を参照してください。

スロットのデプロイ

Functions を使用すると、異なるバージョンのコードを関数アプリ内の固有のエンドポイントにデプロイできます。 これにより、運用環境で実行中の関数に影響を与えることなく、関数の更新の開発、検証、デプロイが簡略化されます。 デプロイ スロットは、Azure App Service の機能です。 使用できるスロットの数は、ホスティング プランによって異なります。 詳細については、「Azure Functions のデプロイ スロット」関数を参照してください。

スロット リソースは関数アプリ リソース (Microsoft.Web/sites) と同じように定義しますが、代わりに Microsoft.Web/sites/slots リソース識別子を使用します。 Premium プランに運用環境スロットとステージング スロットの両方を作成するデプロイの例 (Bicep と ARM のテンプレートの両方) については、「デプロイ スロットを使用した Azure Function App」を参照してください。

テンプレートを使用してスワップを実行する方法については、「Resource Manager テンプレートで自動化する」を参照してください。

スロットのデプロイをを行う場合は、次の考慮事項に留意してください。

  • デプロイ スロットの定義で WEBSITE_CONTENTSHARE 設定を明示的に設定しないでください。 この設定は、アプリがデプロイ スロットで作成されると自動的に生成されます。

  • スロットを入れ替えると、いくつかのアプリケーション設定は "粘着性" とみなされ、入れ替えるコードではなくスロットに保持されます。 このような "スロット設定" は、テンプレートの特定のアプリケーション設定定義に "slotSetting":true を含めることで定義できます。 詳細については、設定の管理に関するページを参照してください。

セキュリティで保護された展開

仮想ネットワークと統合することで、1 つ以上のリソースがセキュリティ保護されたデプロイで関数アプリを作成できます。 関数アプリの仮想ネットワーク統合は、Microsoft.Web/sites/networkConfig リソースで定義されます。 この統合は、参照される関数アプリと仮想ネットワーク リソースの両方に依存します。 お使いの関数アプリが、プライベート エンドポイントやルートなど、他のプライベート ネットワーク リソースに依存する場合もあります。 詳細については、「Azure Functions のネットワーク オプション」をご覧ください。

セキュリティ保護されたストレージ アカウントを使用するデプロイを作成するとき、WEBSITE_CONTENTSHARE 設定を明示的に設定し、かつ、この設定で指定されたファイル共有リソースを作成する必要があります。 この例 (ARM テンプレート|Bicep ファイル) で示すように、必ず WEBSITE_CONTENTSHARE の値を使用して Microsoft.Storage/storageAccounts/fileServices/shares リソースを作成します。 また、サイト プロパティ vnetContentShareEnabled を true に設定する必要があります。

Note

これらの設定が、セキュリティで保護されたストレージ アカウントを使用するデプロイに含まれていない場合は、デプロイの検証中に次のエラーが表示されます: Could not access storage account using provided connection string

これらのプロジェクトは、ネットワーク アクセス制限などの仮想ネットワークで関数アプリをデプロイする方法の Bicep と ARM の両方のテンプレートを例示しています。

制限付きシナリオ 説明
仮想ネットワーク統合を使用した関数アプリの作成 関数アプリは仮想ネットワーク内に作成され、そのネットワーク内のリソースにフル アクセスできます。 関数アプリの受信アクセスや送信アクセスは制限されません。 詳細については、仮想ネットワーク統合に関する記事を参照してください。
セキュリティで保護されたストレージ アカウントにアクセスする関数アプリの作成 作成した関数アプリは、セキュリティで保護されたストレージ アカウントを使用します。これは、プライベート エンドポイントを使用して Functions でアクセスします。 詳細については、「ストレージ アカウントを仮想ネットワークに制限する」を参照してください。
いずれもプライベート エンドポイントを使用する関数アプリとストレージ アカウントの作成 作成した関数アプリは、プライベート エンドポイントを使用することでのみアクセスでき、プライベート エンドポイントを使用してストレージ リソースにアクセスします。 詳細については、プライベート エンドポイントに関する記事を参照してください。

制限付きネットワーク設定

関数アプリにネットワーク制限がある場合にも、次のような設定が必要になる場合があります。

設定 説明
WEBSITE_CONTENTOVERVNET 1 ストレージ アカウントを仮想ネットワークに制限している場合に、関数アプリをスケーリングできるアプリケーション設定。 詳細については、「ストレージ アカウントを仮想ネットワークに制限する」を参照してください。
vnetrouteallenabled 1 関数アプリからのすべてのトラフィックに強制的に仮想ネットワークを使用させるサイト設定。 詳細については、リージョン仮想ネットワーク統合に関する記事を参照してください。 このサイト設定は、アプリケーション設定 WEBSITE_VNET_ROUTE_ALL に優先します。

ネットワークの制限に対する考慮事項

プライベート エンドポイントを通じてストレージ アカウントへのアクセスを制限している場合、ポータルや仮想ネットワーク外のデバイスからストレージ アカウントにアクセスすることはできません。 既定のネットワーク アクセス ルールを管理することで、セキュリティで保護された IP アドレスまたはストレージ アカウントの仮想ネットワークにアクセス権を付与できます。

テンプレートを作成する

Bicep または ARM のテンプレートを持つ専門家は、シンプルなテキスト エディターを使用してデプロイを手動でコード化できます。 それ以外の人には、次のように開発プロセスを簡略化する方法があります。

  • Visual Studio Code: Bicep ファイルARM テンプレートの両方で作業するのに役立つ拡張機能を利用できます。 これらのツールを使用することで、コードが正しいかどうかを確認することができ、基本検証を行うことができます。

  • Azure portal: ポータルで関数アプリと関連リソースを作成する場合、最後の [確認と作成] 画面には、[オートメーション用のテンプレートをダウンロードする] リンクがあります。

    Azure portal の Azure Functions 作成プロセスからテンプレート リンクをダウンロードします。

    このリンクには、ポータルで選択したオプションに基づいて生成された ARM テンプレートが表示されます。 多くの新しいリソースを含む関数アプリを作成する場合、このテンプレートは少し複雑になりますが、ARM テンプレートの外観に関する優れた参照になります。

テンプレートを検証する

展開テンプレート ファイルを手動で作成する場合、デプロイ前にテンプレートを検証することが重要です。 すべてのデプロイ手法でテンプレートの構文を検証し、次の JSON 形式の例に示すように validation failed エラー メッセージが発生します。

{"error":{"code":"InvalidTemplate","message":"Deployment template validation failed: 'The resource 'Microsoft.Web/sites/func-xyz' is not defined in the template. Please see https://aka.ms/arm-template for usage details.'.","additionalInfo":[{"type":"TemplateViolation","info":{"lineNumber":0,"linePosition":0,"path":""}}]}}

デプロイ前にテンプレートを検証するには、次の手法を使用できます。

次の Azure リソース グループのデプロイ v2 タスクdeploymentMode: 'Validation' は、Azure Pipelines にテンプレートの検証を指示します。

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    subscriptionId: # Required subscription ID
    action: 'Create Or Update Resource Group'
    resourceGroupName: # Required resource group name
    location: # Required when action == Create Or Update Resource Group
    templateLocation: 'Linked artifact'
    csmFile: # Required when  TemplateLocation == Linked Artifact
    csmParametersFile: # Optional
    deploymentMode: 'Validation'

プレフライトデプロイのエラーを検出するためにテスト リソース グループを作成することもできます。

テンプレートをデプロイする

次のいずれかの方法を使用して、Bicep ファイルおよびテンプレートをデプロイできます。

[Azure にデプロイ] ボタン

注意

この方法では、現在 Bicep ファイルのデプロイはサポートされていません。

<url-encoded-path-to-azuredeploy-json> を、GitHub の azuredeploy.json ファイルの生のパスのエンコードされた URL で置き換えます。

マークダウンを使用する例を次に示します。

[![Deploy to Azure](https://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>)

HTML を使用する例を次に示します。

<a href="https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>" target="_blank"><img src="https://azuredeploy.net/deploybutton.png"></a>

PowerShell を使用したデプロイ

次の PowerShell コマンドを実行すると、リソース グループが作成され、必要なリソースを使って関数アプリを作成する Bicep ファイルおよび ARM テンプレートがデプロイされます。 ローカルで実行するには、Azure PowerShell がインストールされている必要があります。 Connect-AzAccount を実行してサインインします。

# Register Resource Providers if they're not already registered
Register-AzResourceProvider -ProviderNamespace "microsoft.web"
Register-AzResourceProvider -ProviderNamespace "microsoft.storage"

# Create a resource group for the function app
New-AzResourceGroup -Name "MyResourceGroup" -Location 'West Europe'

# Deploy the template
New-AzResourceGroupDeployment -ResourceGroupName "MyResourceGroup" -TemplateFile azuredeploy.json  -Verbose

このデプロイをテストするには、従量課金プランで Windows 上に関数アプリを作成するこのようなテンプレートを使用できます。

次のステップ

Azure Functions を開発および構成する方法について学習します。