在 Azure Functions 中自動化函式應用程式的資源部署

您可以使用 Bicep 檔案或 Azure Resource Manager 範本,將函式應用程式部署至新的或現有的 Azure 資源的程式自動化。 這類自動化提供絕佳的方式,讓您能夠將資源部署與 DevOps 中的原始程式碼整合、從備份還原函式應用程式和相關資源,或多次部署應用程式拓撲。

本文說明如何自動建立 Azure Functions 的資源和部署。 視 函式所使用的觸發程式和系結 而定,您可能需要部署本文範圍以外的其他資源。

特定範本程式代碼取決於您的函式應用程式裝載方式、您要部署程式碼或容器化函式應用程式,以及應用程式所使用的操作系統。 本文支援下列裝載選項:

主控選項 部署類型 若要深入瞭解,請參閱...
Azure Functions 取用方案 僅限程序代碼 取用方案
Azure Functions 彈性 進階版 方案 程序代碼 |容器 進階方案
Azure Functions 專用 (App Service) 方案 程序代碼 |容器 專用方案
Azure 容器應用程式 僅限容器 裝載 Azure Functions 的容器應用程式
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

當您在單一 Bicep 檔案或 ARM 範本中部署多個資源時,建立資源的順序很重要。 這項需求是資源之間相依性的結果。 針對這類相依性,請務必使用 dependsOn 元素在相依資源中定義相依性。 如需詳細資訊,請參閱 定義在ARM範本 中部署資源的順序,或 Bicep 中的資源相依性。

本文假設您已對建立 Bicep 檔案撰寫 Azure Resource Manager 範本有基本瞭解,而範例會顯示為特定資源的個別區段。 如需一組廣泛的完整 Bicep 檔案和 ARM 範例,請參閱 這些函式應用程式部署範例

必要條件

本文假設您已在 Azure Container Apps 中建立 受控環境 。 您需要受控環境的名稱和標識碼,才能建立裝載於 Container Apps 上的函式應用程式。

本文假設您已在已啟用 Azure Arc 的 Kubernetes 叢集上建立已啟用 App Service 的自定義位置 您需要自定義位置標識碼和 Kubernetes 環境識別碼,才能建立裝載在 Azure Arc 自定義位置中的函式應用程式。

建立儲存體帳戶

所有函式應用程式都需要 Azure 記憶體帳戶。 您需要支援 Blob、數據表、佇列和檔案的一般用途帳戶。 如需詳細資訊,請參閱 Azure Functions 儲存器帳戶需求

重要

儲存體帳戶可用來儲存重要的應用程式資料,有時還包含應用程式的程式碼本身。 您應該限制其他應用程式和使用者存取儲存體帳戶。

此範例區段會建立標準一般用途 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 儲存體 的 Azure 監視器資源記錄。 在此範例區段中,名為 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
          }
        ]
    }
  }
]

這個相同的工作區可用於稍後定義的ApplicationInsights資源。 如需詳細資訊,包括如何使用這些記錄,請參閱監視 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 進階版 方案專用 (App Service) 方案中的應用程式必須明確定義主控方案。

進階版 方案提供與取用方案相同的調整,但包含專用資源和額外功能。 若要深入瞭解,請參閱 Azure Functions 進階版 方案

進階版 方案是一種特殊的資源類型serverfarm。 您可以針對屬性中的sku屬性值使用EP1EP2EP3Name 來指定它。 您定義 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) 方案中,您的函式應用程式會在 App Service 方案中的基本、標準和 進階版 SKU 上的專用 VM 上執行,類似於 Web 應用程式。 如需詳細資訊,請參閱 專用方案

如需範例 Bicep 檔案/Azure Resource Manager 範本,請參閱 Azure App 服務 方案上的函式應用程式

在 Functions 中,專用方案只是由資源定義的 serverfarm 一般 App Service 方案。 您必須至少 name 提供 值。 如需支援的方案名稱清單,請參閱 --skuaz appservice plan create 針對專用方案目前支援的值清單設定。

您定義主控方案的方式取決於您的函式應用程式是在 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資源,您可以使用 和 sku 屬性的值DynamiccomputeMode來指定。 此範例區段說明如何明確定義取用方案。 您定義主控方案的方式取決於您的函式應用程式是在 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 環境 。 本文中的範例假設您有您要部署的自定義位置 () 和 App Service Kubernetes 環境的資源customLocationIdkubeEnvironmentId識別符,而此範例會設定:

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

網站和方案都必須透過 extendedLocation 欄位參考自定義位置。 如這個截斷的範例所示,extendedLocation位於 外部properties,做為 和 location的對等kind

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

計劃資源應該使用的 Kubernetes (K1) 值 SKUkind 欄位應該是 linux,kubernetes,而且 reserved 屬性應該是 true,因為它是 Linux 部署。 您也必須分別將 和 kubeEnvironmentProfile.id 設定extendedLocation為自定義位置識別碼和 Kubernetes 環境識別碼,這看起來可能像下列範例一節:

"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
    }
  }
]

建立函數應用程式

函式應用程式資源是由 型Microsoft.Web/siteskind別的資源所定義,且至少包含 functionapp

您定義函式應用程式資源的方式取決於您要在 Linux 或 Windows 上裝載:

如需在 Windows 上執行時所需的應用程式設定清單,請參閱 應用程式組態。 如需範例 Bicep 檔案/Azure Resource Manager 範本,請參閱 取用方案 範本中裝載於 Windows 上的函式應用程式。

如需在 Windows 上執行時所需的應用程式設定清單,請參閱 應用程式組態

注意

如果您選擇選擇性地定義取用方案,您必須在應用程式上設定 serverFarmId 屬性,使其指向方案的資源識別碼。 請確定函式應用程式具有也 dependsOn 參考方案的設定。 如果您未明確定義方案,就會為您建立一個方案。

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 部署,請將應用程式中1的 設定設為 WEBSITE_RUN_FROM_PACKAGE ,並包含/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 部署資源時,請記住下列事項:

  • Linux 上的取用方案不支援 WEBSITE_RUN_FROM_PACKAGE = 1。 您必須改為直接在設定中設定部署套件的 WEBSITE_RUN_FROM_PACKAGE URI。 如需詳細資訊,請參閱 WEBSITE_RUN_FROM_PACKAGE。 如需範例範本,請參閱 取用方案中裝載於Linux上的函式應用程式。
  • packageUri必須是 Functions 可以存取的位置。 請考慮搭配共用存取簽章使用 Azure Blob 記憶體(SAS)。 SAS 到期之後,Functions 就無法再存取部署的共用。 當您重新產生 SAS 時,請記得使用新的 URI 值來更新 WEBSITE_RUN_FROM_PACKAGE 設定。

  • 設定 WEBSITE_RUN_FROM_PACKAGE 為 URI 時,您必須 手動同步觸發程式

  • 新增或更新設定時,請務必一律在集合中 appSettings 設定所有必要的應用程式設定。 更新會移除未明確設定的現有設定。 如需詳細資訊,請參閱 應用程式組態

  • Functions 不支援套件部署的 Web Deploy (msdeploy)。 您必須改為在部署管線和自動化中使用 zip 部署。 如需詳細資訊,請參閱 Azure Functions 的 Zip 部署。

遠端組建

部署程序假設您使用的 .zip 檔案或 zip 部署包含現成執行的應用程式。 這表示預設不會執行任何自定義專案。

不過,在某些情況下,您必須從遠端重建應用程式,例如當您需要在 Python 或 windows 電腦上開發的Node.js應用程式中提取 Linux 特定套件時。 在此情況下,您可以將 Functions 設定為在 zip 部署之後,在您的程式代碼上執行遠端組建。

您要求遠端組建的方式取決於您要部署的作業系統:

將應用程式部署至 Windows 時,會執行特定語言命令(例如 dotnet restore C# 應用程式或 npm install Node.js 應用程式)。

若要開啟與持續整合相同的建置程式,請在部署程式代碼中新增 SCM_DO_BUILD_DURING_DEPLOYMENT=true 至應用程式設定,並完全移除 WEBSITE_RUN_FROM_PACKAGE

Linux 容器

如果您要將容器化函式應用程式部署到 Azure Functions 進階版 或專用方案,您必須:

如需詳細資訊,請參閱 應用程式組態

"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 參考。
  • 您應該一律將應用程式設定 siteConfig/appSettings 定義為所建立資源的集合 Microsoft.Web/sites ,如本文範例所示。 這可確保您的函式應用程式必須執行的設定可在初始啟動時使用。

  • 使用範本新增或更新應用程式設定時,請確定您包含所有現有的設定與更新。 您必須這樣做,因為基礎更新 REST API 呼叫會取代整個 /config/appsettings 資源。 如果您移除現有的設定,您的函式應用程式將不會執行。 若要以程式設計方式更新個別的應用程式設定,您可以改用 Azure CLI、Azure PowerShell 或 Azure 入口網站 來進行這些變更。 如需詳細資訊,請參閱 使用應用程式設定

位置部署

Functions 可讓您將不同版本的程式代碼部署到函式應用程式中的唯一端點。 這可讓您更輕鬆地開發、驗證及部署函式更新,而不會影響在生產環境中執行的函式。 部署位置是 Azure App 服務的功能。 可用的 位置數目取決於您的裝載方案。 如需詳細資訊,請參閱 Azure Functions 部署位置函式

位置資源的定義方式與函式應用程式資源相同,Microsoft.Web/sites但改為使用 Microsoft.Web/sites/slots 資源標識符。 如需在 進階版 方案中建立生產位置和預備位置的範例部署(在 Bicep 和 ARM 範本中),請參閱具有部署位置的 Azure 函式應用程式。

若要瞭解如何使用範本執行交換,請參閱 使用 Resource Manager 範本自動化。

使用位置部署時,請記住下列考慮:

  • 請勿在部署位置定義中明確設定 WEBSITE_CONTENTSHARE 設定。 這個設定會在部署位置中建立應用程式時為您產生。

  • 當您交換位置時,某些應用程式設定會被視為「黏性」,因為它們會與位置保持一起,而不是交換程序代碼。 您可以在樣本中的特定應用程式設定定義中包含這類位置設定"slotSetting":true。 如需詳細資訊,請參閱 管理設定

安全部署

您可以在部署中建立函式應用程式,其中一或多個資源已透過與虛擬網路整合來保護。 函式應用程式的虛擬網路整合是由 Microsoft.Web/sites/networkConfig 資源所定義。 這項整合取決於參考的函式應用程式和虛擬網路資源。 您的函式應用程式也可能相依於其他專用網資源,例如私人端點和路由。 如需詳細資訊,請參閱 Azure Functions 網路選項

建立使用安全記憶體帳戶的部署時,您必須明確設定 WEBSITE_CONTENTSHARE 設定,並在此設定中建立名為 的檔案分享資源。 請務必使用 的值建立資源,如本範例所示(ARM 範本|Bicep 檔案)。Microsoft.Storage/storageAccounts/fileServices/sharesWEBSITE_CONTENTSHARE 您也必須將網站屬性 vnetContentShareEnabled 設定為 true。

注意

當這些設定不屬於使用安全記憶體帳戶的部署時,您會在部署驗證期間看到此錯誤: Could not access storage account using provided connection string

這些專案同時提供 Bicep 和 ARM 範例,說明如何在虛擬網路中部署函式應用程式,包括網路存取限制:

受限制的案例 描述
使用虛擬網路整合建立函式應用程式 您的函式應用程式會在虛擬網路中建立,且具有該網路中資源的完整存取權。 對函式應用程式的輸入和輸出存取不受限制。 如需詳細資訊,請參閱虛擬網路整合 \(部分機器翻譯\)。
建立可存取安全記憶體帳戶的函式應用程式 您建立的函式應用程式會使用安全的記憶體帳戶,函式會使用私人端點進行存取。 如需詳細資訊,請參閱將儲存體帳戶限定於虛擬網路
建立同時使用私人端點的函式應用程式和記憶體帳戶 您建立的函式應用程式只能使用私人端點來存取,並使用私人端點來存取記憶體資源。 如需詳細資訊,請參閱 私人端點

受限制的網路設定

當您的函式應用程式有網路限制時,您可能也需要使用這些設定:

設定 Description
WEBSITE_CONTENTOVERVNET 1 當記憶體帳戶限制為虛擬網路時,可讓函式應用程式調整的應用程式設定。 如需詳細資訊,請參閱將儲存體帳戶限定於虛擬網路
vnetrouteallenabled 1 強制來自函式應用程式的所有流量使用虛擬網路的月台設定。 如需詳細資訊,請參閱 區域虛擬網路整合。 這個網站設定會取代應用程式設定 WEBSITE_VNET_ROUTE_ALL

網路限制的考慮

當您限制透過私人端點存取記憶體帳戶時,您無法透過入口網站或虛擬網路以外的任何裝置存取記憶體帳戶。 您可以藉由 管理預設網路存取規則,授與記憶體帳戶中安全IP位址或虛擬網路的存取權。

建立範本

Bicep 或 ARM 範本的專家可以使用簡單的文字編輯器手動撰寫部署程式代碼。 對於我們其他人來說,有數種方式可以簡化開發程式:

  • Visual Studio Code:有擴充功能可協助您同時使用 Bicep 檔案ARM 範本。 您可以使用這些工具來協助確定程式代碼正確無誤,並提供一些 基本身份驗證

  • Azure 入口網站:當您在入口網站中建立函式應用程式和相關資源時,最終的 [檢閱 + 建立] 畫面具有 [下載自動化範本] 連結。

    從 Azure 入口網站 中的 Azure Functions 建立程式下載範本連結。

    此連結會顯示根據您在入口網站中選擇的選項所產生的ARM範本。 雖然當您使用許多新資源建立函式應用程式時,此範本可能有點複雜,但它可以提供ARM範本外觀的良好參考。

驗證範本

當您手動建立部署範本檔案時,請務必在部署之前先驗證範本。 所有部署方法都會驗證您的範本語法,並引發 validation failed 錯誤訊息,如下列 JSON 格式範例所示:

{"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 編碼版本。

以下是使用 Markdown 的範例:

[![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。