Automatisera resursdistributionen för funktionsappen i Azure Functions

Du kan använda en Bicep-fil eller en Azure Resource Manager-mall för att automatisera distributionen av en funktionsapp till nya eller befintliga Azure-resurser. Sådan automatisering är ett bra sätt att integrera dina resursdistributioner med källkoden i DevOps, återställa en funktionsapp och relaterade resurser från en säkerhetskopia eller distribuera en apptopologi flera gånger.

Den här artikeln visar hur du automatiserar skapandet av resurser och distribution för Azure Functions. Beroende på vilka utlösare och bindningar som används av dina funktioner kan du behöva distribuera andra resurser som ligger utanför omfånget för den här artikeln.

Den specifika mallkoden beror på hur din funktionsapp hanteras, oavsett om du distribuerar kod eller en containerbaserad funktionsapp och det operativsystem som används av din app. Den här artikeln stöder följande värdalternativ:

Värdalternativ Distributionstyp Mer information finns i...
Förbrukningsplan för Azure Functions Endast kod Förbrukningsplan
Azure Functions Elastic Premium-plan Kod | Behållare Premium-plan
Azure Functions Dedicated-plan (App Service) Kod | Behållare Dedikerad plan
Azure Container Apps Endast container Container Apps-värd för Azure Functions
Azure Arc Kod | Behållare App Service, Functions och Logic Apps i Azure Arc (förhandsversion)

Nödvändiga resurser

En Azure Functions-värdbaserad distribution består vanligtvis av följande resurser:

Resurs Krav Referens för syntax och egenskaper
Ett lagringskonto Obligatoriskt Microsoft.Storage/storageAccounts
En Application Insights-komponent Rekommenderat Microsoft.Insights/components
En värdplan Obligatoriskt1 Microsoft.Web/serverfarms
En funktionsapp Obligatoriskt Microsoft.Web/sites

En Azure Functions-distribution för en förbrukningsplan består vanligtvis av följande resurser:

Resurs Krav Referens för syntax och egenskaper
Ett lagringskonto Obligatoriskt Microsoft.Storage/storageAccounts
En Application Insights-komponent Rekommenderat Microsoft.Insights/components
En funktionsapp Obligatoriskt Microsoft.Web/sites

En Azure Container Apps-värdbaserad distribution består vanligtvis av följande resurser:

Resurs Krav Referens för syntax och egenskaper
Ett lagringskonto Obligatoriskt Microsoft.Storage/storageAccounts
En Application Insights-komponent Rekommenderat Microsoft.Insights/components
En hanterad miljö Obligatoriskt Microsoft.App/managedEnvironments
En funktionsapp Obligatoriskt Microsoft.Web/sites

En Azure Arc-värdbaserad distribution består vanligtvis av följande resurser:

Resurs Krav Referens för syntax och egenskaper
Ett lagringskonto Obligatoriskt Microsoft.Storage/storageAccounts
En Application Insights-komponent Rekommenderat Microsoft.Insights/components
En App Service Kubernetes-miljö Obligatoriskt Microsoft.ExtendedLocation/customLocations
En funktionsapp Obligatoriskt Microsoft.Web/sites

1En explicit värdplan krävs inte när du väljer att vara värd för din funktionsapp i en förbrukningsplan.

När du distribuerar flera resurser i en enda Bicep-fil eller ARM-mall är det viktigt i vilken ordning resurserna skapas. Det här kravet är ett resultat av beroenden mellan resurser. För sådana beroenden måste du använda elementet dependsOn för att definiera beroendet i den beroende resursen. Mer information finns i Definiera ordningen för att distribuera resurser i ARM-mallar eller Resursberoenden i Bicep.

Den här artikeln förutsätter att du har en grundläggande förståelse för hur du skapar Bicep-filer eller redigerar Azure Resource Manager-mallar, och exempel visas som enskilda avsnitt för specifika resurser. En bred uppsättning kompletta Bicep-fil- och ARM-mallexempel finns i dessa exempel på funktionsappdistribution.

Förutsättningar

Den här artikeln förutsätter att du redan har skapat en hanterad miljö i Azure Container Apps. Du behöver både namnet och ID:t för den hanterade miljön för att skapa en funktionsapp som finns i Container Apps.

Den här artikeln förutsätter att du redan har skapat en App Service-aktiverad anpassad plats i ett Azure Arc-aktiverat Kubernetes-kluster. Du behöver både det anpassade plats-ID:t och Kubernetes-miljö-ID:t för att skapa en funktionsapp som finns på en anpassad Azure Arc-plats.

Skapa lagringskonto

Alla funktionsappar kräver ett Azure-lagringskonto. Du behöver ett konto för generell användning som stöder blobar, tabeller, köer och filer. Mer information finns i Krav för Azure Functions-lagringskonto.

Viktigt!

Lagringskontot används för att lagra viktiga appdata, ibland inklusive själva programkoden. Du bör begränsa åtkomsten från andra appar och användare till lagringskontot.

Det här exempelavsnittet skapar ett standardlagringskonto för generell användning 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
    }
  }
]

Mer kontext finns i den fullständiga azuredeploy.json filen i malllagringsplatsen.

Du måste ange anslutningssträng för det här lagringskontot som AzureWebJobsStorage appinställning, som Functions kräver. Mallarna i den här artikeln konstruerar det här anslutningssträng värdet baserat på det skapade lagringskontot, vilket är bästa praxis. Mer information finns i Programkonfiguration.

Aktivera lagringsloggar

Eftersom lagringskontot används för viktiga funktionsappdata bör du övervaka kontot för ändring av innehållet. Om du vill övervaka ditt lagringskonto måste du konfigurera Azure Monitor-resursloggar för Azure Storage. I det här exempelavsnittet används en Log Analytics-arbetsyta med namnet myLogAnalytics som mål för dessa loggar.

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

Samma arbetsyta kan användas för Application Insights-resursen som definieras senare. Mer information, inklusive hur du arbetar med dessa loggar, finns i Övervaka Azure Storage.

Skapa Application Insights

Application Insights rekommenderas för övervakning av funktionsappkörningar. I det här exempelavsnittet definieras Application Insights-resursen med typen Microsoft.Insights/components och typen 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"
},

Mer kontext finns i den fullständiga azuredeploy.json filen i malllagringsplatsen.

Anslutningen måste anges till funktionsappen med hjälp av programinställningen APPLICATIONINSIGHTS_CONNECTION_STRING . Mer information finns i Programinställningar.

Exemplen i den här artikeln hämtar värdet anslutningssträng för den skapade instansen. Äldre versioner kan i stället använda APPINSIGHTS_INSTRUMENTATIONKEY för att ange instrumentationsnyckeln, vilket inte längre rekommenderas.

Skapa värdplanen

Appar som finns i en Azure Functions Premium-plan eller dedikerad (App Service)-plan måste ha värdplanen explicit definierad.

Premium-planen erbjuder samma skalning som förbrukningsplanen, men innehåller dedikerade resurser och extra funktioner. Mer information finns i Azure Functions Premium-plan.

En Premium-plan är en särskild typ av serverfarm resurs. Du kan ange det med antingen EP1, EP2eller EP3 för egenskapsvärdet Name i sku egenskapen. Hur du definierar functions-värdplanen beror på om din funktionsapp körs i Windows eller i Linux. I det här exempelavsnittet skapas en EP1 plan:

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

Mer kontext finns i den fullständiga azuredeploy.json filen i malllagringsplatsen.

Mer information om objektet SkuDefinition finns i sku eller granska exempelmallarna.

I den dedikerade planen (App Service) körs din funktionsapp på dedikerade virtuella datorer på Basic-, Standard- och Premium-SKU:er i App Service-planer, liknande webbappar. Mer information finns i Dedikerad plan.

Ett exempel på en Bicep-fil/Azure Resource Manager-mall finns i Funktionsapp i Azure App Service-plan

I Functions är den dedikerade planen bara en vanlig App Service-plan, som definieras av en serverfarm resurs. Du måste ange minst värdet name . En lista över plannamn --sku som stöds finns i inställningen i az appservice plan create för den aktuella listan över värden som stöds för en dedikerad plan.

Hur du definierar värdplanen beror på om din funktionsapp körs i Windows eller i 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
    }
  }
]

Mer kontext finns i den fullständiga azuredeploy.json filen i malllagringsplatsen.

Skapa värdplanen

Du behöver inte uttryckligen definiera en förbrukningsvärdplansresurs. När du hoppar över den här resursdefinitionen skapas eller väljs en plan automatiskt per region när du skapar själva funktionsappresursen.

Du kan uttryckligen definiera en förbrukningsplan som en särskild typ av resurs, som du anger med hjälp av serverfarm värdet Dynamic för computeMode egenskaperna och sku . Det här exempelavsnittet visar hur du uttryckligen definierar en förbrukningsplan. Hur du definierar en värdplan beror på om din funktionsapp körs i Windows eller i 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"
    }
  }
]

Mer kontext finns i den fullständiga azuredeploy.json filen i malllagringsplatsen.

Kubernetes-miljö

Azure Functions kan distribueras till Azure Arc-aktiverade Kubernetes antingen som ett kodprojekt eller en containerbaserad funktionsapp.

Om du vill skapa app- och planresurserna måste du redan ha skapat en App Service Kubernetes-miljö för ett Azure Arc-aktiverat Kubernetes-kluster. Exemplen i den här artikeln förutsätter att du har resurs-ID för den anpassade platsen (customLocationId) och App Service Kubernetes-miljön (kubeEnvironmentId) som du distribuerar till, som anges i det här exemplet:

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

Både platser och planer måste referera till den anpassade platsen via ett extendedLocation fält. Som du ser i det här trunkerade exemplet extendedLocation ligger utanför properties, som en peer till kind och location:

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

Planresursen bör använda Kubernetes-värdet (K1) för SKU, kind fältet ska vara linux,kubernetes, och reserved egenskapen ska vara true, eftersom det är en Linux-distribution. Du måste också ange extendedLocation och kubeEnvironmentProfile.id till det anpassade plats-ID:t respektive Kubernetes-miljö-ID:t, vilket kan se ut som i det här exempelavsnittet:

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

Skapa funktionsappen

Funktionsappresursen definieras av en resurs av typen Microsoft.Web/sites och kind som innehåller functionapp, som minst.

Hur du definierar en funktionsappresurs beror på om du är värd för Linux eller Windows:

En lista över programinställningar som krävs vid körning i Windows finns i Programkonfiguration. En Bicep-exempelfil/Azure Resource Manager-mall finns i funktionsappen som finns i Windows i en mall för förbrukningsplan .

En lista över programinställningar som krävs vid körning i Windows finns i Programkonfiguration.

Kommentar

Om du väljer att definiera din förbrukningsplan måste du ange serverFarmId egenskapen i appen så att den pekar på resurs-ID:t för planen. Kontrollera att funktionsappen har en dependsOn inställning som även refererar till planen. Om du inte uttryckligen har definierat en plan skapas en åt dig.

serverFarmId Ange egenskapen i appen så att den pekar på resurs-ID:t för planen. Kontrollera att funktionsappen har en dependsOn inställning som även refererar till planen.

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

Ett fullständigt exempel från slutpunkt till slutpunkt finns i den här azuredeploy.json mallen.

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

Ett fullständigt exempel från slutpunkt till slutpunkt finns i den här azuredeploy.json mallen.

Distributionskällor

Din Bicep-fil eller ARM-mall kan också definiera en distribution för funktionskoden, som kan innehålla följande metoder:

Distributionskällor

Din Bicep-fil eller ARM-mall kan också definiera en distribution för funktionskoden med hjälp av ett zip-distributionspaket.

För att distribuera ditt program med hjälp av Azure Resource Manager är det viktigt att förstå hur resurser distribueras i Azure. I de flesta exempel används konfigurationer på den översta nivån med hjälp siteConfigav . Det är viktigt att ställa in dessa konfigurationer på en toppnivå eftersom de förmedlar information till Functions-körnings- och distributionsmotorn. Information på den översta nivån krävs innan den underordnade sourcecontrols/web resursen tillämpas. Även om det är möjligt att konfigurera de här inställningarna i resursen på undernivå config/appSettings måste funktionsappen i vissa fall distribueras innanconfig/appSettings den tillämpas.

Zip-distributionspaket

Zip-distribution är ett rekommenderat sätt att distribuera funktionsappkoden. Som standard körs funktioner som använder zip-distribution i själva distributionspaketet. Mer information, inklusive kraven för ett distributionspaket, finns i Zip-distribution för Azure Functions. När du använder automatisering av resursdistribution kan du referera till .zip distributionspaketet i din Bicep- eller ARM-mall.

Om du vill använda zip-distribution i mallen WEBSITE_RUN_FROM_PACKAGE anger du inställningen i appen till 1 och inkluderar resursdefinitionen /zipDeploy .

För en förbrukningsplan i Linux anger du i stället URI för distributionspaketet direkt i WEBSITE_RUN_FROM_PACKAGE inställningen, som du ser i den här exempelmallen.

Det här exemplet lägger till en zip-distributionskälla i en befintlig app:

{
  "$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')]"
      }
    }
  ]
}

Tänk på följande när du inkluderar zip-distributionsresurser i mallen:

  • packageUri Måste vara en plats som kan nås av Functions. Överväg att använda Azure Blob Storage med en signatur för delad åtkomst (SAS). När SAS upphör att gälla kan Functions inte längre komma åt resursen för distributioner. När du återskapar din SAS ska du komma ihåg att uppdatera WEBSITE_RUN_FROM_PACKAGE inställningen med det nya URI-värdet.

  • När du ställer in WEBSITE_RUN_FROM_PACKAGE på en URI måste du synkronisera utlösare manuellt.

  • Se till att alltid ange alla nödvändiga programinställningar i appSettings samlingen när du lägger till eller uppdaterar inställningar. Befintliga inställningar som inte uttryckligen anges tas bort av uppdateringen. Mer information finns i Programkonfiguration.

  • Functions stöder inte webbdistribution (msdeploy) för paketdistributioner. Du måste i stället använda zip-distribution i dina distributionspipelines och automatisering. Mer information finns i Zip-distribution för Azure Functions.

Fjärrversioner

Distributionsprocessen förutsätter att den .zip fil som du använder eller en zip-distribution innehåller en färdig app. Det innebär att inga anpassningar körs som standard.

Det finns dock scenarier som kräver att du återskapar appen via fjärranslutning, till exempel när du behöver hämta Linux-specifika paket i Python eller Node.js appar som du har utvecklat på en Windows-dator. I det här fallet kan du konfigurera Functions för att utföra en fjärrversion av koden efter zip-distributionen.

Hur du begär en fjärrversion beror på vilket operativsystem du distribuerar till:

När en app distribueras till Windows körs språkspecifika kommandon (till exempel dotnet restore för C#-appar eller npm install för Node.js appar).

Om du vill aktivera samma byggprocesser som du får med kontinuerlig integrering lägger du till SCM_DO_BUILD_DURING_DEPLOYMENT=true i dina programinställningar i distributionskoden och tar bort helt WEBSITE_RUN_FROM_PACKAGE och hållet.

Linux-containrar

Om du distribuerar en containerbaserad funktionsapp till en Azure Functions Premium- eller Dedicated-plan måste du:

Mer information finns i Programkonfiguration.

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

När du distribuerar containerbaserade funktioner till Azure Container Apps måste mallen:

  • Ange fältet kind till värdet functionapp,linux,container,azurecontainerapps.
  • Ange webbplatsegenskapen managedEnvironmentId till den fullständigt kvalificerade URI:n för Container Apps-miljön.
  • Lägg till en resurslänk i webbplatsens dependsOn samling när du skapar en Microsoft.App/managedEnvironments resurs samtidigt som webbplatsen.

Definitionen av en containerbaserad funktionsapp som distribueras från ett privat containerregister till en befintlig Container Apps-miljö kan se ut så här:

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

När du distribuerar funktioner till Azure Arc beror värdet som du anger för fältet för kind funktionsappresursen på typen av distribution:

Distributionstyp kind fältvärde
Kodbaserad distribution functionapp,linux,kubernetes
Containerdistribution functionapp,linux,kubernetes,container

Du måste också ange som customLocationId du gjorde för värdplansresursen.

Definitionen av en containerbaserad funktionsapp med hjälp av en .NET 6-snabbstartsavbildning kan se ut så här:

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

Tillämpningskonfiguration

Functions innehåller följande alternativ för att konfigurera funktionsappen i Azure:

Konfiguration Microsoft.Web/sites Egenskapen
Webbplatsinställningar siteConfig
Programinställningar siteConfig.appSettings Samling

Följande webbplatsinställningar krävs för egenskapen siteConfig :

Dessa programinställningar krävs (eller rekommenderas) för ett specifikt operativsystem och värdalternativ:

Dessa programinställningar krävs för containerdistributioner:

De här inställningarna krävs bara när du distribuerar från ett privat containerregister:

Tänk på följande när du arbetar med webbplats- och programinställningar med hjälp av Bicep-filer eller ARM-mallar:

  • Det finns viktiga saker att tänka på när du bör ange WEBSITE_CONTENTSHARE i en automatiserad distribution. Detaljerad vägledning finns i referensen WEBSITE_CONTENTSHARE .
  • Du bör alltid definiera dina programinställningar som en siteConfig/appSettings samling av resursen Microsoft.Web/sites som skapas, som du gör i exemplen i den här artikeln. Detta säkerställer att de inställningar som funktionsappen behöver köra är tillgängliga vid den första starten.

  • När du lägger till eller uppdaterar programinställningar med hjälp av mallar måste du inkludera alla befintliga inställningar med uppdateringen. Du måste göra detta eftersom rest-API-anropen för den underliggande uppdateringen ersätter hela /config/appsettings resursen. Om du tar bort de befintliga inställningarna körs inte funktionsappen. Om du vill uppdatera enskilda programinställningar programmatiskt kan du i stället använda Azure CLI, Azure PowerShell eller Azure-portalen för att göra dessa ändringar. Mer information finns i Arbeta med programinställningar.

Distributioner av fack

Med Functions kan du distribuera olika versioner av koden till unika slutpunkter i funktionsappen. Detta gör det enklare att utveckla, validera och distribuera funktionsuppdateringar utan att påverka funktioner som körs i produktion. Distributionsplatser är en funktion i Azure App Service. Antalet tillgängliga platser beror på din värdplan. Mer information finns i Funktioner för Distributionsfack i Azure Functions.

En fackresurs definieras på samma sätt som en funktionsappresurs (Microsoft.Web/sites), men i stället använder du resursidentifieraren Microsoft.Web/sites/slots . En exempeldistribution (i både Bicep- och ARM-mallar) som skapar både en produktion och en mellanlagringsplats i en Premium-plan finns i Azure Function App with a Deployment Slot (Azure Function App with a Deployment Slot).

Mer information om hur du utför växlingen med hjälp av mallar finns i Automatisera med Resource Manager-mallar.

Tänk på följande när du arbetar med distributioner av fack:

  • Ange inte uttryckligen WEBSITE_CONTENTSHARE inställningen i distributionsfackdefinitionen. Den här inställningen genereras åt dig när appen skapas i distributionsfacket.

  • När du byter fack anses vissa programinställningar vara "klibbiga", eftersom de stannar kvar i facket och inte med koden som byts ut. Du kan definiera en sådan platsinställning genom att inkludera "slotSetting":true i den specifika programinställningsdefinitionen i mallen. Mer information finns i Hantera inställningar.

Skyddade distributioner

Du kan skapa din funktionsapp i en distribution där en eller flera av resurserna har skyddats genom integrering med virtuella nätverk. Integrering av virtuella nätverk för funktionsappen definieras av en Microsoft.Web/sites/networkConfig resurs. Den här integreringen beror på både den refererade funktionsappen och virtuella nätverksresurser. Din funktionsapp kan också vara beroende av andra privata nätverksresurser, till exempel privata slutpunkter och vägar. Mer information finns i Nätverksalternativ för Azure Functions.

När du skapar en distribution som använder ett skyddat lagringskonto måste du både uttryckligen WEBSITE_CONTENTSHARE ange inställningen och skapa filresursen med namnet i den här inställningen. Se till att du skapar en Microsoft.Storage/storageAccounts/fileServices/shares resurs med värdet WEBSITE_CONTENTSHARE, som du ser i det här exemplet (ARM-mallens|Bicep-fil). Du måste också ange webbplatsegenskapen vnetContentShareEnabled till true.

Kommentar

När de här inställningarna inte ingår i en distribution som använder ett skyddat lagringskonto visas det här felet under distributionsverifieringen: Could not access storage account using provided connection string.

Dessa projekt innehåller både Bicep- och ARM-mallexempel på hur du distribuerar dina funktionsappar i ett virtuellt nätverk, inklusive med begränsningar för nätverksåtkomst:

Begränsat scenario beskrivning
Skapa en funktionsapp med integrering av virtuella nätverk Din funktionsapp skapas i ett virtuellt nätverk med fullständig åtkomst till resurser i nätverket. Inkommande och utgående åtkomst till funktionsappen är inte begränsad. Mer information finns i Integrering av virtuellt nätverk.
Skapa en funktionsapp som har åtkomst till ett skyddat lagringskonto Den skapade funktionsappen använder ett skyddat lagringskonto som Functions kommer åt med hjälp av privata slutpunkter. Mer information finns i Begränsa ett lagringskonto till ett virtuellt nätverk.
Skapa en funktionsapp och ett lagringskonto som båda använder privata slutpunkter Din skapade funktionsapp kan bara nås med hjälp av privata slutpunkter och den använder privata slutpunkter för att komma åt lagringsresurser. Mer information finns i Privata slutpunkter.

Begränsade nätverksinställningar

Du kan också behöva använda de här inställningarna när funktionsappen har nätverksbegränsningar:

Inställning Värde beskrivning
WEBSITE_CONTENTOVERVNET 1 Programinställning som gör att funktionsappen kan skalas när lagringskontot är begränsat till ett virtuellt nätverk. Mer information finns i Begränsa ett lagringskonto till ett virtuellt nätverk.
vnetrouteallenabled 1 Webbplatsinställning som tvingar all trafik från funktionsappen att använda det virtuella nätverket. Mer information finns i Regional integrering av virtuella nätverk. Den här webbplatsinställningen ersätter programinställningen WEBSITE_VNET_ROUTE_ALL.

Överväganden för nätverksbegränsningar

När du begränsar åtkomsten till lagringskontot via de privata slutpunkterna kan du inte komma åt lagringskontot via portalen eller någon enhet utanför det virtuella nätverket. Du kan ge åtkomst till din skyddade IP-adress eller virtuella nätverk i lagringskontot genom att hantera standardregeln för nätverksåtkomst.

Skapa mallen

Experter med Bicep- eller ARM-mallar kan koda sina distributioner manuellt med hjälp av en enkel textredigerare. För oss andra finns det flera sätt att göra utvecklingsprocessen enklare:

Verifiera mallen

När du skapar distributionsmallfilen manuellt är det viktigt att verifiera mallen före distributionen. Alla distributionsmetoder validerar mallsyntaxen och skapar ett validation failed felmeddelande som visas i följande JSON-formaterade exempel:

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

Följande metoder kan användas för att verifiera mallen före distributionen:

Följande Azure-resursgruppsdistribution v2-uppgift med deploymentMode: 'Validation' instruerar Azure Pipelines att verifiera mallen.

- 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'

Du kan också skapa en testresursgrupp för att hitta preflight - och distributionsfel .

Distribuera mallen

Du kan använda något av följande sätt att distribuera Bicep-filen och mallen:

Distribuera till Azure (knapp)

Kommentar

Den här metoden stöder inte distribution av Bicep-filer för närvarande.

Ersätt <url-encoded-path-to-azuredeploy-json> med en URL-kodad version av filens råsökväg azuredeploy.json i GitHub.

Här är ett exempel som använder markdown:

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

Här är ett exempel som använder 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>

Distribuera med hjälp av PowerShell

Följande PowerShell-kommandon skapar en resursgrupp och distribuerar en Bicep-fil/ARM-mall som skapar en funktionsapp med nödvändiga resurser. Om du vill köra lokalt måste du ha Azure PowerShell installerat. Kör Connect-AzAccount för att logga in.

# 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

Om du vill testa den här distributionen kan du använda en mall som den här som skapar en funktionsapp i Windows i en förbrukningsplan.

Nästa steg

Läs mer om hur du utvecklar och konfigurerar Azure Functions.