分享方式:


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

可以使用 Bicep 檔案或 Azure Resource Manager (ARM) 範本來自動執行函數應用程式的部署程序。 在部署期間中,您可以使用現有的 Azure 資源或建立新資源。 自動化可以協助您解決下列這些案例:

  • 將您的資源部署與您在 Azure Pipelines 和 GitHub Actions 型部署中的原始程式碼進行整合。
  • 從備份還原函數應用程式和相關資源。
  • 多次部署應用程式拓撲。

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

所需的範本程式碼取決於您函數應用程式所需的主控選項。 本文支援下列裝載選項:

主控選項 部署類型 若要深入了解,請參閱...
Azure Functions 取用方案 僅限程式碼 取用方案
Azure Functions Flex Consumption 方案 僅限程式碼 Flex 使用量方案
Azure Functions 彈性進階方案 程式碼 | 容器 進階方案
Azure Functions 專用 (App Service) 方案 程式碼 | 容器 專用方案
Azure 容器應用程式 僅限容器 Azure Functions 的容器應用程式裝載
Azure Arc 程式碼 | 容器 Azure Arc 上的 App Service、Functions 和 Logic Apps (預覽)

重要

Flex 使用量方案目前為預覽狀態。

使用本文時,請留意下列這些考量:

  • 範例顯示為特定資源的個別區段。

所需資源

您必須為 Azure Functions 託管的部署建立或設定這些資源:

資源 需求 語法和屬性參考
儲存體帳戶 必要 Microsoft.Storage/storageAccounts
Application Insights 元件 建議需求 Microsoft.Insights/components*
主控方案 必要 Microsoft.Web/serverfarms
函式應用程式 必要 Microsoft.Web/sites

您必須為 Azure Functions 託管的部署建立或設定這些資源:

資源 需求 語法和屬性參考
儲存體帳戶 必要 Microsoft.Storage/storageAccounts
Application Insights 元件 建議需求 Microsoft.Insights/components*
函式應用程式 必要 Microsoft.Web/sites

Azure 容器應用程式裝載的部署通常包含下列資源:

資源 需求 語法和屬性參考
儲存體帳戶 必要 Microsoft.Storage/storageAccounts
Application Insights 元件 建議需求 Microsoft.Insights/components*
受控環境 必要 Microsoft.App/managedEnvironments
函式應用程式 必要 Microsoft.Web/sites

Azure Arc 裝載的部署通常包含下列資源:

資源 需求 語法和屬性參考
儲存體帳戶 必要 Microsoft.Storage/storageAccounts
Application Insights 元件 建議需求 Microsoft.Insights/components1
App Service Kubernetes 環境 必要 Microsoft.ExtendedLocation/customLocations
函式應用程式 必要 Microsoft.Web/sites

*如果您還沒有準備好可供 Application Insights 執行個體使用的 Log Analytics 工作區,則還需要建立此資源。

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

必要條件

  • 這些範例設計在現有資源群組的內容中執行。
  • Application Insights 和儲存體記錄都要求您擁有現有的 Azure Log Analytics 工作區。 工作區可以在服務之間共用,而且作為經驗法則,您應該在每個地理區域建立一個工作區以提高效能。 若需如何建立 Log Analytics 工作區的範例,請參閱建立 Log Analytics 工作區。 您可以在 Azure 入口網站的工作區頁面中的 [設定]>[屬性]>[資源識別碼] 中找到完整的工作區資源識別碼。
  • 本文假設您已在 Azure 容器應用程式中建立受控環境。 您需要受控環境的名稱和識別碼,才能建立裝載於容器應用程式上的函式應用程式。

建立儲存體帳戶

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

重要

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

此範例章節會建立標準的一般用途 v2 儲存體帳戶:

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
  properties: {
    supportsHttpsTrafficOnly: true
    defaultToOAuthAuthentication: true
    allowBlobPublicAccess: false
  }
}

如需詳細內容,請參閱範本存放庫中的完整 main.bicep 檔案。

如需更多內容,請參閱範例存放庫中的完整 storage-account.bicep 檔案。

您必須將此儲存體帳戶的連接字串設定為 Functions 需要的 AzureWebJobsStorage 應用程式設定。 本文中的範本會根據所建立的儲存體帳戶來建構此連接字串值,這是最佳做法。 如需詳細資訊,請參閱應用程式設定

部署容器

部署到在彈性使用量方案中執行的應用程式需要 Azure Blob 儲存體中的容器作為部署來源。 您可以使用預設儲存體帳戶,也可以指定單獨的儲存體帳戶。 如需詳細資訊,請參閱設定部署設定

建立您的應用程式時必須已設定此部署帳戶,包括用於部署的特定容器。 若要深入了解設定部署,請參閱部署來源

此範例顯示如何在儲存體帳戶中建立容器:

resource blobServices 'blobServices' = if (!empty(containers)) {
  name: 'default'
  properties: {
    deleteRetentionPolicy: deleteRetentionPolicy
  }
  resource container 'containers' = [for container in containers: {
    name: container.name
    properties: {
      publicAccess: contains(container, 'publicAccess') ? container.publicAccess : 'None'
    }
  }]
}

有關內容中的程式碼片段,請參閱此部署範例

其他部署設定由應用程式本身設定

啟用儲存體記錄

因為儲存體帳戶會用於重要的函式應用程式資料,因此請監視帳戶以了解該內容是否有修改。 若要監視儲存體帳戶,您必須為 Azure 儲存體設定 Azure 監視器資源記錄。 在此範例章節中,名為 myLogAnalytics 的 Log Analytics 工作區會作為這些記錄的目的地。

resource blobService 'Microsoft.Storage/storageAccounts/blobServices@2021-09-01' existing = {
  name:'default'
  parent:storageAccountName
}

resource storageDataPlaneLogs 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
  name: '${storageAccountName}-logs'
  scope: blobService
  properties: {
    workspaceId: myLogAnalytics.id
    logs: [
      {
        category: 'StorageWrite'
        enabled: true
      }
    ]
    metrics: [
      {
        category: 'Transaction'
        enabled: true
      }
    ]
  }
}

這個相同的工作區可用於稍後定義的 Application Insights 資源。 如需詳細資訊,包括如何使用這些記錄,請參閱監視 Azure 儲存體

建立 Application Insights

您應該使用 Application Insights 來監視函數應用程式的執行情況。 Application Insights 現在需要可共用的 Azure Log Analytics 工作區。 這些範例假設您正在使用現有工作區並擁有該工作區的完整資源識別碼。 如需詳細資訊,請參閱 Azure Log Analytics 工作區

在此範例章節中,Application Insights 資源會使用 Microsoft.Insights/components 類型和 web 種類來定義:

resource applicationInsight 'Microsoft.Insights/components@2020-02-02' = {
  name: applicationInsightsName
  location: appInsightsLocation
  tags: tags
  kind: 'web'
  properties: {
    Application_Type: 'web'
    WorkspaceResourceId: '<FULLY_QUALIFIED_RESOURCE_ID>'
  }
}

如需詳細內容,請參閱範本存放庫中的完整 main.bicep 檔案。

您必須使用 APPLICATIONINSIGHTS_CONNECTION_STRING 應用程式設定,將連線提供給函式應用程式。 如需詳細資訊,請參閱應用程式設定

本文中的範例會取得所建立執行個體的連接字串值。 較舊的版本可能會改用 APPINSIGHTS_INSTRUMENTATIONKEY 來設定檢測金鑰,但不再建議這麼做。

建立裝載方案

裝載在 Azure Functions 彈性使用量方案進階版方案專用 (App Service) 方案中的應用程式必須明確定義主控方案。

Flex Consumption 是以 Linux 為基礎的主控方案,是依照使用量計費,按使用量付費的無伺服器計費模型。 方案支援私人網路、執行個體記憶體大小選取範圍和改進的受控識別支援。

彈性使用量方案是一種特殊的 serverfarm 資源類型。 您可以透過使用 FC1 作為 sku 屬性中的 Name 屬性值 (其中 tier 值為 FlexConsumption) 來加以指定。

此範例章節建立彈性使用量方案:

resource flexFuncPlan 'Microsoft.Web/serverfarms@2023-12-01' = {
  name: planName
  location: location
  tags: tags
  kind: 'functionapp'
  sku: {
    tier: 'FlexConsumption'
    name: 'FC1'
  }
  properties: {
    reserved: true
  }
}

如需更多內容,請參閱彈性使用量方案範例存放庫中的完整 function.bicep 檔案。

由於彈性使用量方案目前僅支援 Linux,因此您也必須將 reserved 屬性設為 true

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

進階方案是一種特殊的 serverfarm 資源類型。 您可以針對 sku 屬性中的 Name 屬性值,使用 EP1EP2EP3 加以指定。 Functions 裝載方案的定義方式取決於函式應用程式是在 Windows 還是 Linux 上執行。 此範例章節會建立 EP1 方案:

resource hostingPlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: hostingPlanName
  location: location
  sku: {
    name: 'EP1'
    tier: 'ElasticPremium'
    family: 'EP'
  }
  kind: 'elastic'
  properties: {
    maximumElasticWorkerCount: 20
  }
}

如需詳細內容,請參閱範本存放庫中的完整 main.bicep 檔案。

如需 sku 物件的詳細資訊,請參閱 SkuDefinition 或檢閱範例範本。

在專用 (App Service) 方案中,函式應用程式會在 App Service 方案中的基本、標準或進階 SKU 上的專用 VM 上執行,就像 Web 應用程式一樣。 如需詳細資訊,請參閱專用方案

如需範例 Bicep 檔案/Azure Resource Manager 範本,請參閱採用 Azure App Service 方案的函式應用程式 (英文)

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

裝載方案的定義方式取決於函式應用程式是在 Windows 還是 Linux 上執行:

resource hostingPlanName 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: hostingPlanName
  location: location
  sku: {
    tier: 'Standard'
    name: 'S1'
    size: 'S1'
    family: 'S'
    capacity: 1
  }
}

如需詳細內容,請參閱範本存放庫中的完整 main.bicep 檔案。

建立裝載方案

您不需要明確定義使用量裝載方案的資源。 若您略過此資源定義,當您建立函式應用程式資源本身時,系統會根據區域自動建立或選取方案。

您可以明確地將使用量方案定義為特殊類型的 serverfarm 資源,若要指定,請針對 computeModesku 屬性使用 Dynamic 值。 此範例章節說明如何明確定義使用量方案。 裝載方案的定義方式取決於函式應用程式是在 Windows 還是 Linux 上執行。

resource hostingPlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: hostingPlanName
  location: location
  sku: {
    name: 'Y1'
    tier: 'Dynamic'
    size: 'Y1'
    family: 'Y'
    capacity: 0
  }
  properties: {
    computeMode: 'Dynamic'
  }
}

如需詳細內容,請參閱範本存放庫中的完整 main.bicep 檔案。

Kubernetes 環境

Azure Functions 可以部署至已啟用 Azure Arc 的 Kubernetes 來作為程式碼專案或容器化的函式應用程式。

若要建立應用程式和方案資源,您必須已經針對已啟用 Azure Arc 的 Kubernetes 叢集建立 App Service Kubernetes 環境。 本文中的範例假設您有作為部署目的地自訂位置 (customLocationId) 和 App Service Kubernetes 環境 (kubeEnvironmentId) 的資源識別碼,以在此範例中設定:

param kubeEnvironmentId string
param customLocationId string

網站和方案都必須透過 extendedLocation 欄位來參考自訂位置。 如這個截斷的範例所示,extendedLocation 位於 properties 外部,以作為 kindlocation 的同儕節點:

resource hostingPlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  ...
  {
    extendedLocation: {
      name: customLocationId
    }
  }
}

方案資源應該針對 SKU 使用 Kubernetes (K1) 值,kind 欄位應該是 linux,kubernetes,而且 reserved 屬性應該是 true,因為這是 Linux 部署。 您也必須分別將 extendedLocationkubeEnvironmentProfile.id 設定為自訂位置識別碼和 Kubernetes 環境識別碼,這看起來可能像下列範例章節:

resource hostingPlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: hostingPlanName
  location: location
  kind: 'linux,kubernetes'
  sku: {
    name: 'K1'
    tier: 'Kubernetes'
  }
  extendedLocation: {
    name: customLocationId
  }
  properties: {
    kubeEnvironmentProfile: {
      id: kubeEnvironmentId
    }
    reserved: true
  }
}

建立函數應用程式

函式應用程式資源至少要由 Microsoft.Web/sites 類型的資源和包含 functionappkind 來定義。

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

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

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

彈性使用量取代 Bicep 和 ARM 範本部署中使用的許多標準應用程式設定和網站設定屬性。 如需詳細資訊,請參閱應用程式設定

resource flexFuncApp 'Microsoft.Web/sites@2023-12-01' = {
  name: appName
  location: location
  tags: tags
  kind: 'functionapp,linux'
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    serverFarmId: flexFuncPlan.id
    siteConfig: {
      appSettings: [
        {
          name: 'AzureWebJobsStorage__accountName'
          value: storage.name
        }
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: appInsights.properties.ConnectionString
        }
      ]
    }
    functionAppConfig: {
      deployment: {
        storage: {
          type: 'blobContainer'
          value: '${storage.properties.primaryEndpoints.blob}${deploymentStorageContainerName}'
          authentication: {
            type: 'SystemAssignedIdentity'
          }
        }
      }
      scaleAndConcurrency: {
        maximumInstanceCount: maximumInstanceCount
        instanceMemoryMB: instanceMemoryMB
      }
      runtime: { 
        name: functionAppRuntime
        version: functionAppRuntimeVersion
      }
    }
  }
}

如需更多內容,請參閱彈性使用量方案範例存放庫中的完整 function.bicep 檔案。

注意

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

在應用程式上設定 serverFarmId 屬性,使其指向方案的資源識別碼。 請確定函數應用程式具有也會參考方案的 dependsOn 設定。

resource functionAppName_resource 'Microsoft.Web/sites@2022-03-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    serverFarmId: hostingPlanName.id
    siteConfig: {
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsightsName.properties.ConnectionString
        }
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'WEBSITE_CONTENTSHARE'
          value: toLower(functionAppName)
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: 'node'
        }
        {
          name: 'WEBSITE_NODE_DEFAULT_VERSION'
          value: '~14'
        }
      ]
    }
  }
}

如需完整的端對端範例,請參閱此 main.bicep 檔案

resource functionApp 'Microsoft.Web/sites@2022-03-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    serverFarmId: hostingPlan.id
    siteConfig: {
      alwaysOn: true
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsightsName.properties.ConnectionString
        }
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: 'node'
        }
        {
          name: 'WEBSITE_NODE_DEFAULT_VERSION'
          value: '~14'
        }
      ]
    }
  }
}

如需完整的端對端範例,請參閱此 main.bicep 檔案

部署來源

您的 Bicep 檔案或 ARM 範本也可以選擇性地定義函式程式碼的部署,其中可能包含下列方法:

部署來源

在彈性使用量方案中,您的專案程式碼是從發佈到 Blob 儲存體容器的 ZIP 套件中進行部署。 如需相關資訊,請參閱部署。 用於部署的特定儲存體帳戶和容器、驗證方法和認證是在網站的 propertiesfunctionAppConfig.deployment.storage 元素中進行設定。 在建立應用程式時,容器和任何應用程式設定都必須存在。 如需如何建立儲存體容器的範例,請參閱部署容器

此範例使用系統已指派的受控識別來存取指定的 Blob 儲存體容器,該容器是在部署中的其他位置進行建立:

deployment: {
  storage: {
    type: 'blobContainer'
    value: '${storage.properties.primaryEndpoints.blob}${deploymentStorageContainerName}'
    authentication: {
      type: 'SystemAssignedIdentity'
    }
  }
}

使用受控識別時,還必須允許函數應用程式使用該識別存取儲存體帳戶,如本範例所示:

// Allow access from function app to storage account using a managed identity
resource storageRoleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
  name: guid(storage.id, storageRoleDefinitionId)
  scope: storage
  properties: {
    roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', storageRoleDefinitionId)
    principalId: flexFuncApp.identity.principalId
    principalType: 'ServicePrincipal'
  }
}

如需完整的參考範例,請參閱此 Bicep 檔案

使用連接字串而不是受控識別碼時,您需要將 authentication.type 設定為 StorageAccountConnectionString,並將 authentication.storageAccountConnectionStringName 設定為包含部署儲存體帳戶連接字串的應用程式設定名稱。

部署來源

您的 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 部署來源新增至現有應用程式:

@description('The name of the function app.')
param functionAppName string

@description('The location into which the resources should be deployed.')
param location string = resourceGroup().location

@description('The zip content url.')
param packageUri string

resource functionAppName_ZipDeploy 'Microsoft.Web/sites/extensions@2021-02-01' = {
  name: '${functionAppName}/ZipDeploy'
  location: location
  properties: {
    packageUri: packageUri
  }
}

在範本中包含 ZIP 部署資源時,請記住下列事項:

  • 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 部署包含已可執行的應用程式。 這表示預設不會執行任何自訂。

有些情況需要您遠端重建應用程式。 一個這樣的範例是當您需要在 Windows 電腦上開發的 Python 或 Node.js 應用程式中包含在特定 Linux 套件時。 在此情況下,您可以將 Functions 設定為會在 ZIP 部署後,於您的程式碼上執行遠端組建。

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

當應用程式部署至 Windows 時,系統會執行語言專用的命令 (例如,C# 應用程式會執行 dotnet restore,Node.js 應用程式則會執行 npm install)。

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

Linux 容器

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

如果遺漏某些設定,應用程式佈建可能會失敗,並出現此 HTTP/500 錯誤:

Function app provisioning failed.

如需詳細資訊,請參閱應用程式設定

resource functionApp 'Microsoft.Web/sites@2022-03-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    serverFarmId: hostingPlan.id
    siteConfig: {
      appSettings: [
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().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: dockerRegistryUrl
        }
        {
          name: 'DOCKER_REGISTRY_SERVER_USERNAME'
          value: dockerRegistryUsername
        }
        {
          name: 'DOCKER_REGISTRY_SERVER_PASSWORD'
          value: dockerRegistryPassword
        }
        {
          name: 'WEBSITES_ENABLE_APP_SERVICE_STORAGE'
          value: 'false'
        }
      ]
      linuxFxVersion: 'DOCKER|myacr.azurecr.io/myimage:mytag'
    }
  }
  dependsOn: [
    storageAccount
  ]
}

在進行從容器化函式到 Azure 容器應用程式的部署時,您的範本必須:

  • kind 欄位設定為 functionapp,linux,container,azurecontainerapps 的值。
  • managedEnvironmentId 網站屬性設定為容器應用程式環境的完整 URI。
  • 在與網站同時建立 Microsoft.App/managedEnvironments 資源時,請在網站的 dependsOn 集合中新增資源連結。

從私人容器登錄部署至現有容器應用程式環境的容器化函式應用程式,其定義看起來可能像下列範例:

resource functionApp 'Microsoft.Web/sites@2022-03-01' = {
  name: functionAppName
  kind: 'functionapp,linux,container,azurecontainerapps'
  location: location
  properties: {
    serverFarmId: hostingPlanName
    siteConfig: {
      linuxFxVersion: 'DOCKER|myacr.azurecr.io/myimage:mytag'
      appSettings: [
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsightsName.properties.ConnectionString
        }
      ]
    }
    managedEnvironmentId: managedEnvironmentId
  }
  dependsOn: [
    storageAccount
    hostingPlan
  ]
}

將函式部署至 Azure Arc 時,您為函式應用程式資源的 kind 欄位設定的值取決於部署類型:

部署類型 kind 欄位值
僅限程式碼部署 functionapp,linux,kubernetes
容器部署 functionapp,linux,kubernetes,container

您也必須使用和裝載方案資源一樣的方式來設定 customLocationId

使用 .NET 6 快速入門映像的容器化函式應用程式,其定義看起來可能像下列範例:

resource functionApp 'Microsoft.Web/sites@2022-03-01' = {
  name: functionAppName
  kind: 'kubernetes,functionapp,linux,container'
  location: location
  extendedLocation: {
    name: customLocationId
  }
  properties: {
    serverFarmId: 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: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsightsName.properties.ConnectionString
        }
      ]
      alwaysOn: true
    }
  }
  dependsOn: [
    storageAccount
    hostingPlan
  ]
}

應用程式設定

在彈性使用量方案中,您可以使用兩種類型的屬性在 Azure 中設定函數應用程式:

組態 Microsoft.Web/sites 屬性
應用程式設定 functionAppConfig
應用程式設定 siteConfig.appSettings 集合

這些應用程式組態會在 functionAppConfig 中維護:

行為 functionAppConfig 中設定
隨時待命執行個體 scaleAndConcurrency.alwaysReady
部署來源 deployment
執行個體記憶體大小 scaleAndConcurrency.instanceMemoryMB
HTTP 觸發程序並行 scaleAndConcurrency.triggers.http.perInstanceConcurrency
語言執行階段 runtime.name
Language version (語言版本) runtime.version
最大執行個體計數 scaleAndConcurrency.maximumInstanceCount

彈性使用量方案還支援下列應用程式設定:

Functions 會提供下列選項供您在 Azure 中設定函式應用程式:

組態 Microsoft.Web/sites 屬性
網站設定 siteConfig
應用程式設定 siteConfig.appSettings 集合

siteConfig 屬性需要這些網站設定:

特定作業系統和裝載選項需要 (或建議使用) 下列應用程式設定:

容器部署需要下列應用程式設定:

只有在從私人容器登錄部署時,才需要下列設定:

使用 Bicep 檔案或 ARM 範本來處理網站和應用程式設定時,請記住下列考量:

  • 選用的 alwaysReady 設定包含一或多個 {name,instanceCount} 物件的陣列,每個 個別函式調整群組各一個。 這些是用於進行隨時待命調整決策的調整群組。 本範例會同時設定 http 群組和名為 helloworld 的單一函式的隨時待命計數,該函式屬於非群組觸發程序類型:
      alwaysReady: [
        {
          name: 'http'
          instanceCount: 2
        }
        {
          name: 'function:helloworld'
          instanceCount: 1
        }
      ]
    
  • 針對在自動化部署中設定 WEBSITE_CONTENTSHARE 的時機有重要考量。 如需詳細指導,請參閱 WEBSITE_CONTENTSHARE 參考。
  • 請一律將應用程式設定定義為所建立 Microsoft.Web/sites 資源的 siteConfig/appSettings 集合,如本文範例的做法。 此定義保證函數應用程式執行所需的設定在初始啟動時可以使用。

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

位置部署

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

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

若要了解如何使用範本來交換位置,請參閱使用 Resource Manager 範本來進行自動化

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

  • 請勿在部署位置定義中明確設定 WEBSITE_CONTENTSHARE 設定。 在部署位置中建立應用程式時,便會產生此設定。

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

受保護的部署

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

下列專案會提供如何在虛擬網路中部署函數應用程式的 Bicep 型範例 (包括網路存取限制):

在建立使用受保護儲存體帳戶的部署時,必須明確設定 WEBSITE_CONTENTSHARE 設定,並建立此設定中指名的檔案共用資源。 請務必使用 WEBSITE_CONTENTSHARE 的值建立 Microsoft.Storage/storageAccounts/fileServices/shares 資源,如本範例所示 (ARM 範本|Bicep 檔案)。 您還需要將網站屬性 vnetContentShareEnabled 設為 true。

注意

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

下列專案會提供如何在虛擬網路中部署函式應用程式的 Bicep 範例和 ARM 範本範例 (包括網路存取限制):

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

受限制的網路設定

當函式應用程式有網路限制時,您可能還需要使用下列設定:

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

網路限制的考量

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

函式存取金鑰

主機層級函數存取金鑰定義為 Azure 資源。 這代表著您可以在 ARM 範本和 Bicep 檔案中建立和管理主機金鑰。 主機金鑰定義為類型 Microsoft.Web/sites/host/functionKeys 的資源。 此範例在建立函數應用程式時建立一個名為 my_custom_key 的主機層級存取金鑰:

resource functionKey 'Microsoft.Web/sites/host/functionKeys@2022-09-01' = {
  name: '${parameters('name')}/default/my_custom_key'
  properties: {
    name: 'my_custom_key'
  }
  dependsOn: [
    resourceId('Microsoft.Web/Sites', parameters('name'))
  ]
}

在此範例中,name 參數是新函數應用程式的名稱。 您必須包含 dependsOn 設定以確保金鑰是使用新函數應用程式所建立。 最後,主機金鑰的 properties 物件還可以包含可用於設定特定金鑰的 value 屬性。

如果您不設定 value 屬性,Functions 會在建立資源時自動為您產生一個新金鑰 (建議這樣做)。 若要深入了解存取金鑰,包括使用存取金鑰的安全性最佳做法,請參閱在 Azure Functions 中使用存取金鑰

建立您自己的範本

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

下列方法可用來先驗證範本再進行部署:

使用 deploymentMode: 'Validation' 的下列 Azure 資源群組部署 v2 工作會指示 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 檔案。

以 GitHub 中 azuredeploy.json 檔案的原始路徑 URL 編碼版本取代 <url-encoded-path-to-azuredeploy-json>

以下是使用 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 main.bicep  -Verbose

若要測試此部署,您可以使用類似此範本,在取用方案中於 Windows 上建立函數應用程式。

下一步

深入了解如何開發並設定 Azure Functions。