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 (預覽) |
使用本文時,請留意下列這些考量:
沒有標準的方式來建構 ARM 範本。
Bicep 部署可以模組化為多個 Bicep 檔案。
本文假設您對建立 Bicep 檔案或製作 Azure Resource Manager 範本有基本的了解。
- 範例顯示為特定資源的個別區段。 如需一組廣泛且完整的 Bicep 檔案和 ARM 範本範例,請參閱這些函式應用程式部署範例。
- 範例顯示為特定資源的個別區段。 如需一組廣泛且完整的 Bicep 檔案和 ARM 範本範例,請參閱這些彈性使用量應用程式部署範例。
- 範例顯示為特定資源的個別區段。
所需資源
您必須為 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 裝載的部署通常包含下列資源:
*如果您還沒有準備好可供 Application Insights 執行個體使用的 Log Analytics 工作區,則還需要建立此資源。
當您在單一 Bicep 檔案或 ARM 範本中部署多個資源時,資源的建立順序很重要。 有此需求是資源間的相依性所導致。 針對這類相依性,請務必使用 dependsOn
元素在相依資源中定義相依性。 如需詳細資訊,請參閱定義在 ARM 範本中部署資源的順序或 Bicep 中的資源相依性。
必要條件
- 這些範例設計在現有資源群組的內容中執行。
- Application Insights 和儲存體記錄都要求您擁有現有的 Azure Log Analytics 工作區。 工作區可以在服務之間共用,而且作為經驗法則,您應該在每個地理區域建立一個工作區以提高效能。 若需如何建立 Log Analytics 工作區的範例,請參閱建立 Log Analytics 工作區。 您可以在 Azure 入口網站的工作區頁面中的 [設定]>[屬性]>[資源識別碼] 中找到完整的工作區資源識別碼。
- 本文假設您已在 Azure 容器應用程式中建立受控環境。 您需要受控環境的名稱和識別碼,才能建立裝載於容器應用程式上的函式應用程式。
- 本文假設您已在已啟用 Azure Arc 的 Kubernetes 叢集上建立已啟用 App Service 的自訂位置。 您需要自訂位置識別碼和 Kubernetes 環境識別碼,才能建立裝載在 Azure Arc 自訂位置中的函式應用程式。
建立儲存體帳戶
所有函式應用程式都需要 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
屬性值,使用 EP1
、EP2
或 EP3
加以指定。 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
資源,若要指定,請針對 computeMode
和 sku
屬性使用 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
) 的資源識別碼,以在此範例中設定:
網站和方案都必須透過 extendedLocation
欄位來參考自訂位置。 如這個截斷的範例所示,extendedLocation
位於 properties
外部,以作為 kind
和 location
的同儕節點:
resource hostingPlan 'Microsoft.Web/serverfarms@2022-03-01' = {
...
{
extendedLocation: {
name: customLocationId
}
}
}
方案資源應該針對 SKU
使用 Kubernetes (K1
) 值,kind
欄位應該是 linux,kubernetes
,而且 reserved
屬性應該是 true
,因為這是 Linux 部署。 您也必須分別將 extendedLocation
和 kubeEnvironmentProfile.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
類型的資源和包含 functionapp
的 kind
來定義。
函式應用程式資源的定義方式取決於您要裝載在 Linux 還是 Windows 上:
如需在 Windows 上執行時所需的應用程式設定清單,請參閱應用程式設定。 如需範例 Bicep 檔案/Azure Resource Manager 範本,請參閱裝載在使用量方案中 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 檔案。
部署來源
您可以使用月台 linuxFxVersion
設定,要求在建立特定 Linux 容器時部署至您的應用程式。 需要更多設定才能存取私人存放庫中的映像。 如需詳細資訊,請參閱應用程式設定。
重要
在建立自己的容器時,必須讓容器的基礎映像持續更新為最新的受支援基礎映像。 Azure Functions 的受支援基礎映像為語言特定,可在 Azure Functions 基礎映像存放庫中找到。
Functions 小組致力於發佈這些基礎映像的每月更新。 一般更新包括 Functions 執行階段和語言的最新次要版本更新與安全性修正。 您應該定期從最新的基礎映像更新容器,並重新部署更新後的容器版本。
在彈性使用量方案中,您的專案程式碼是從發佈到 Blob 儲存體容器的 ZIP 套件中進行部署。 如需相關資訊,請參閱部署。 用於部署的特定儲存體帳戶和容器、驗證方法和認證是在網站的 properties
的 functionAppConfig.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 部署資源時,請記住下列事項:
- 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 部署包含已可執行的應用程式。 這表示預設不會執行任何自訂。
有些情況需要您遠端重建應用程式。 一個這樣的範例是當您需要在 Windows 電腦上開發的 Python 或 Node.js 應用程式中包含在特定 Linux 套件時。 在此情況下,您可以將 Functions 設定為會在 ZIP 部署後,於您的程式碼上執行遠端組建。
您要求遠端組建的方式取決於您要作為部署目的地的作業系統:
Linux 容器
如果您要將容器化的函式應用程式部署至 Azure Functions 進階方案或專用方案,則必須:
- 使用容器映像的識別碼來設定
linuxFxVersion
網站設定。 - 從私人登錄取得容器時,請設定任何必要的
DOCKER_REGISTRY_SERVER_*
設定。 - 將
WEBSITES_ENABLE_APP_SERVICE_STORAGE
應用程式設定設為false
。
如果遺漏某些設定,應用程式佈建可能會失敗,並出現此 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
屬性需要這些網站設定:
只有在使用受控識別從 Azure Container Registry 實例取得映射時,才需要這些月臺設定:
特定作業系統和裝載選項需要 (或建議使用) 下列應用程式設定:
容器部署需要下列應用程式設定:
只有在從私人容器登錄部署時,才需要下列設定:
使用 Bicep 檔案或 ARM 範本來處理網站和應用程式設定時,請記住下列考量:
- 選用的
alwaysReady
設定包含一或多個{name,instanceCount}
物件的陣列,每個 個別函式調整群組各一個。 這些是用於進行隨時待命調整決策的調整群組。 本範例會同時設定http
群組和名為helloworld
的單一函式的隨時待命計數,該函式屬於非群組觸發程序類型:
- 針對在自動化部署中設定
WEBSITE_CONTENTSHARE
的時機有重要考量。 如需詳細指導,請參閱WEBSITE_CONTENTSHARE
參考。
- 若為容器部署,因為應用程式內容是在容器本身中提供,也請將
WEBSITES_ENABLE_APP_SERVICE_STORAGE
設定為false
。
請一律將應用程式設定定義為所建立
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 型範例 (包括網路存取限制):
- 大規模 HTTP 觸發函數連接到受虛擬網路保護的事件中樞:HTTP 觸發函數 (.NET 隔離式背景工作角色模式) 接受來自任何來源的呼叫,然後將這些 HTTP 呼叫的內文傳送到使用虛擬網路整合以保護在虛擬網路中運作的事件中樞。
- 函數由虛擬網路中保護的服務匯流排佇列所觸發:Python 函數由虛擬網路中保護的服務匯流排佇列所觸發。 使用私人端點在虛擬網路中存取佇列。 虛擬網路中的虛擬機器用於傳送訊息。
在建立使用受保護儲存體帳戶的部署時,必須明確設定 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 入口網站:當您在入口網站中建立函式應用程式和相關資源時,最後的 [檢閱 + 建立] 畫面會有 [下載自動化範本] 連結。
此連結會根據您在入口網站中選擇的選項,向您顯示所產生的 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。