Automatisieren der Ressourcenbereitstellung für Ihre Funktions-App in Azure Functions

Sie können eine Bicep-Datei oder eine Azure Resource Manager-Vorlage verwenden, um die Bereitstellung einer Funktions-App für neue oder bestehende Azure-Ressourcen zu automatisieren. Eine solche Automatisierung bietet eine großartige Möglichkeit, Ihre Ressourcenbereitstellungen mit Ihrem Quellcode in DevOps zu integrieren, eine Funktions-App und zugehörige Ressourcen aus einer Sicherung wiederherzustellen oder eine App-Topologie mehrfach bereitzustellen.

In diesem Artikel erfahren Sie, wie Sie die Erstellung von Ressourcen und die Bereitstellung für Azure Functions automatisieren können. Je nach den von Ihren Funktionen verwendeten Triggern und Bindungen müssen Sie möglicherweise weitere Ressourcen bereitstellen. Dies ist jedoch nicht Gegenstand dieses Artikels.

Der spezifische Vorlagencode hängt davon ab, wie Ihre Funktions-App gehostet wird, ob Sie Code oder eine containerisierte Funktions-App bereitstellen und welches Betriebssystem Ihre App verwendet. Dieser Artikel unterstützt die folgenden Hosting-Optionen:

Hostingoption Bereitstellungstyp Weitere Informationen finden Sie unter...
Azure Functions-Nutzungsplan Nur Code Verbrauchstarif
Azure Functions Elastic Premium Plan Code | Container Premium-Plan
Azure Functions Dedicated (App Service) Plan Code | Container Dedizierter Plan
Azure Container Apps Nur Container Container Apps-Hosting von Azure Functions
Azure Arc Code | Container App Service, Funktionen und Logic Apps in Azure Arc (Vorschau)

Erforderliche Ressourcen

Eine gehostete Azure Functions-Bereitstellung besteht in der Regel aus diesen Ressourcen:

Resource Anforderung Syntax- und Eigenschaftenverweis
Ein Speicherkonto Erforderlich Microsoft.Storage/storageAccounts
Eine Application Insights-Komponente Empfohlen Microsoft.Insights/components
Hostingplan Erforderlich1 Microsoft.Web/serverfarms
Eine Funktions-App Erforderlich Microsoft.Web/sites

Eine Azure Functions-Bereitstellung für einen Verbrauchsplan besteht in der Regel aus diesen Ressourcen:

Resource Anforderung Syntax- und Eigenschaftenverweis
Ein Speicherkonto Erforderlich Microsoft.Storage/storageAccounts
Eine Application Insights-Komponente Empfohlen Microsoft.Insights/components
Eine Funktions-App Erforderlich Microsoft.Web/sites

Eine gehostete Azure Container Apps-Bereitstellung besteht in der Regel aus diesen Ressourcen:

Resource Anforderung Syntax- und Eigenschaftenverweis
Ein Speicherkonto Erforderlich Microsoft.Storage/storageAccounts
Eine Application Insights-Komponente Empfohlen Microsoft.Insights/components
Eine verwaltete Umgebung Erforderlich Microsoft.App/managedEnvironments
Eine Funktions-App Erforderlich Microsoft.Web/sites

Eine gehostete Azure Arc-Bereitstellung besteht in der Regel aus diesen Ressourcen:

Resource Anforderung Syntax- und Eigenschaftenverweis
Ein Speicherkonto Erforderlich Microsoft.Storage/storageAccounts
Eine Application Insights-Komponente Empfohlen Microsoft.Insights/components
Eine App Service Kubernetes-Umgebung Erforderlich Microsoft.ExtendedLocation/customLocations
Eine Funktions-App Erforderlich Microsoft.Web/sites

1Es ist kein expliziter Hosting-Plan erforderlich, wenn Sie Ihre Funktions-App in einem Verbrauchsplan hosten möchten.

Wenn Sie mehrere Ressourcen in einer einzigen Bicep-Datei oder ARM-Vorlage bereitstellen, ist die Reihenfolge, in der die Ressourcen erstellt werden, wichtig. Diese Anforderung ergibt sich aus den Abhängigkeiten zwischen den Ressourcen. Stellen Sie bei solchen Abhängigkeiten sicher, dass Sie das Element dependsOn verwenden, um die Abhängigkeit in der abhängigen Ressource zu definieren. Weitere Informationen finden Sie unter Definieren der Reihenfolge für die Bereitstellung von Ressourcen in ARM-Vorlagen oder Ressourcenabhängigkeiten in Bicep.

In diesem Artikel wird davon ausgegangen, dass Sie über ein grundlegendes Verständnis für die Erstellung von Bicep-Dateien oder Azure Resource Manager-Vorlagen verfügen. Die Beispiele werden in einzelnen Abschnitten für bestimmte Ressourcen dargestellt. Eine breite Palette von Beispielen für vollständige Bicep-Dateien und ARM-Vorlagen finden Sie in diesen Beispielen für die Bereitstellung von Funktions-Apps.

Voraussetzungen

Dieser Artikel geht davon aus, dass Sie bereits eine verwaltete Umgebung in Azure Container Apps erstellt haben. Sie benötigen sowohl den Namen als auch die ID der verwalteten Umgebung, um eine auf Container Apps gehostete Funktions-App zu erstellen.

Dieser Artikel geht davon aus, dass Sie bereits einen App Service-fähigen benutzerdefinierten Speicherort auf einem Azure Arc-fähigen Kubernetes-Cluster erstellt haben. Sie benötigen sowohl die benutzerdefinierte Standort-ID als auch die Kubernetes-Umgebungs-ID, um eine Funktions-App zu erstellen, die an einem benutzerdefinierten Azure Arc-Standort gehostet wird.

Speicherkonto erstellen

Alle Funktions-Apps benötigen ein Azure-Speicherkonto. Sie benötigen ein Konto für allgemeine Zwecke, das Blobs, Tabellen, Warteschlangen und Dateien unterstützt. Weitere Informationen finden Sie unter Anforderungen an das Speicherkonto.

Wichtig

Das Speicherkonto wird verwendet, um wichtige App-Daten zu speichern, manchmal einschließlich des Anwendungscodes. Sie sollten den Zugriff von anderen Anwendungen und Benutzer*innen auf das Speicherkonto beschränken.

In diesem Beispielabschnitt wird ein allgemeines Standardspeicherkonto der Version 2 erstellt:

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

Näheres dazu finden Sie in der vollständigen Datei azuredeploy.json im Vorlagen-Repository.

Sie müssen die Verbindungszeichenfolge dieses Speicherkontos als App-Einstellung AzureWebJobsStorage festlegen, die Functions benötigt. Die Vorlagen in diesem Artikel konstruieren diese Verbindungszeichenfolge auf der Grundlage des erstellten Speicherkontos. Dies ist eine bewährte Methode. Weitere Informationen finden Sie unter Konfiguration der Anwendung.

Aktivieren von Speicherprotokollen

Da das Speicherkonto für wichtige Daten der Funktions-App verwendet wird, sollten Sie das Konto auf Änderungen an diesen Inhalten überwachen. Um Ihr Speicherkonto zu überwachen, müssen Sie die Ressourcenprotokolle von Azure Monitor für Azure Storage konfigurieren. In diesem Beispielabschnitt wird ein Log Analytics-Arbeitsbereich mit dem Namen myLogAnalytics als Ziel für diese Protokolle verwendet.

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

Derselbe Arbeitsbereich kann für die später definierte Application Insights-Ressource verwendet werden. Weitere Informationen und wie Sie mit diesen Protokollen arbeiten können, finden Sie unter Überwachen von Azure Storage.

Erstellen von Application Insights

Application Insights wird für die Überwachung der Ausführung Ihrer Funktions-Apps empfohlen. In diesem Beispielabschnitt wird die Ressource Application Insights mit dem Typ Microsoft.Insights/components und der Art web definiert:

{
  "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"
},

Näheres dazu finden Sie in der vollständigen Datei azuredeploy.json im Vorlagen-Repository.

Die Verbindung muss der Funktions-App über die Anwendungseinstellung APPLICATIONINSIGHTS_CONNECTION_STRING zur Verfügung gestellt werden. Weitere Informationen finden Sie unter Anwendungseinstellungen.

Die Beispiele in diesem Artikel liefern den Wert der Verbindungszeichenfolge für die erstellte Instanz. Ältere Versionen verwenden stattdessen möglicherweise APPINSIGHTS_INSTRUMENTATIONKEY, um den Instrumentierungsschlüssel festzulegen. Dies wird nicht mehr empfohlen.

Erstellen des Hostingplans

Für Apps, die in einem Azure Functions Premium Plan oder Dedicated (App Service) Plan gehostet werden, muss der Hostingplan explizit definiert sein.

Der Premium-Tarif bietet die gleiche Skalierung wie der Verbrauchstarif, umfasst jedoch dedizierte Ressourcen und zusätzliche Funktionen. Weitere Informationen finden Sie unter Premium-Tarif für Azure Functions.

Ein Premium-Plan ist eine besondere Art von serverfarm-Ressource. Sie können ihn angeben, indem Sie entweder EP1, EP2 oder EP3 für den Wert der Eigenschaft Name in der Eigenschaft sku verwenden. Die Art und Weise, wie Sie den Funktions-Hostingplan definieren, hängt davon ab, ob Ihre Funktions-App unter Windows oder unter Linux ausgeführt wird. In diesem Beispielabschnitt wird ein EP1 Plan erstellt:

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

Näheres dazu finden Sie in der vollständigen Datei azuredeploy.json im Vorlagen-Repository.

Weitere Informationen zum sku-Objekt finden Sie unter SkuDefinition oder sehen Sie sich die Beispielvorlagen an.

Im Dedicated (App Service) Plan läuft Ihre Funktions-App auf dedizierten VMs auf Basic, Standard und Premium SKUs in App Service Plänen, ähnlich wie bei Web-Apps. Weitere Informationen finden Sie unter Dedizierter Plan.

Ein Beispiel für eine Bicep-Datei/eine Azure Resource Manager-Vorlage finden Sie unter Funktions-App im Azure App Service Plan.

In Functions ist der Dedicated-Plan nur ein regulärer App Service-Plan, der von einer serverfarm-Ressource definiert wird. Sie müssen mindestens einen name-Wert angeben. Eine Liste der Namen der unterstützten Pläne finden Sie in der Einstellung --sku in az appservice plan create in der aktuellen Liste der unterstützten Werte für einen Dedicated Plan.

Die Art und Weise, wie Sie den Hostingplan definieren, hängt davon ab, ob Ihre Funktions-App unter Windows oder unter Linux läuft:

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

Näheres dazu finden Sie in der vollständigen Datei azuredeploy.json im Vorlagen-Repository.

Erstellen des Hostingplans

Für den Verbrauchhostingplan müssen Sie keine Ressource explizit definieren. Wenn Sie diese Ressourcendefinition überspringen, wird automatisch bei der Erstellung der Funktions-App-Ressource selbst ein Plan entweder erstellt oder für die jeweilige Region ausgewählt.

Sie können einen Verbrauchsplan explizit als einen speziellen Typ einer serverfarm-Ressource definieren, den Sie mithilfe des Werts Dynamic für die Eigenschaften computeMode und sku angeben. Dieser Beispielabschnitt zeigt Ihnen, wie Sie einen Verbrauchsplan explizit definieren können. Die Art und Weise, wie Sie einen Hostingplan definieren, hängt davon ab, ob Ihre Funktions-App unter Windows oder unter Linux läuft.

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

Näheres dazu finden Sie in der vollständigen Datei azuredeploy.json im Vorlagen-Repository.

Kubernetes-Umgebung

Azure Functions kann in Azure Arc-fähigen Kubernetes bereitgestellt werden, entweder als Codeprojekt oder als containerisierte Funktions-App.

Um die App und Planressourcen zu erstellen, müssen Sie bereits eine App Service Kubernetes-Umgebung für einen für Azure Arc aktivierten Kubernetes-Cluster erstellt haben. Bei den Beispielen in diesem Artikel wird davon ausgegangen, dass Sie die Ressourcen-ID des benutzerdefinierten Standorts (customLocationId) und der App Service Kubernetes-Umgebung (kubeEnvironmentId), für die Sie die Bereitstellung vornehmen, bereits kennen:

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

Sowohl Sites als auch Pläne müssen über ein extendedLocation-Feld auf den benutzerdefinierten Speicherort verweisen. Wie in diesem abgeschnittenen Beispiel gezeigt, befindet sich extendedLocation außerhalb von properties, als Peer zu kind und location:

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

Die Planressource sollte den Kubernetes (K1) Wert für SKUverwenden, das Feld kind sollte linux,kubernetes sein, und die Eigenschaft reserved sollte true sein, da es sich um eine Linux-Bereitstellung handelt. Sie müssen auch extendedLocation und kubeEnvironmentProfile.id auf die benutzerdefinierte Standort-ID bzw. die Kubernetes-Umgebungs-ID festlegen, die wie in diesem Beispielabschnitt aussehen kann:

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

Erstellen der Funktionen-App

Die Funktions-App-Ressource wird durch eine Ressource vom Typ Microsoft.Web/sites und kind definiert, die mindestens functionapp enthält.

Die Art und Weise, wie Sie eine Funktions-App-Ressource definieren, hängt davon ab, ob Sie auf Windows oder unter Linux hosten:

Eine Liste der Anwendungseinstellungen, die für die Ausführung unter Windows erforderlich sind, finden Sie unter Anwendungskonfiguration. Ein Beispiel für eine Bicep-Datei/eine Azure Resource Manager-Vorlage finden Sie in der Vorlage für eine in einem Windows-Verbrauchsplan gehostete Funktions-App.

Eine Liste der Anwendungseinstellungen, die für die Ausführung unter Windows erforderlich sind, finden Sie unter Anwendungskonfiguration.

Hinweis

Wenn Sie sich dafür entscheiden, Ihren Verbrauchsplan optional zu definieren, müssen Sie die Eigenschaft serverFarmId der App so einstellen, dass sie auf die Ressourcen-ID des Plans zeigt. Stellen Sie sicher, dass die Funktions-App über eine dependsOn-Einstellung verfügt, die auch auf den Plan verweist. Wenn Sie nicht ausdrücklich einen Plan definiert haben, wird einer für Sie erstellt.

Legen Sie die Eigenschaft serverFarmId in der App so fest, dass sie auf die Ressourcen-ID des Plans zeigt. Stellen Sie sicher, dass die Funktions-App über eine dependsOn-Einstellung verfügt, die auch auf den Plan verweist.

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

Ein vollständiges End-to-End-Beispiel finden Sie in dieser azuredeploy.json-Vorlage.

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

Ein vollständiges End-to-End-Beispiel finden Sie in dieser azuredeploy.json-Vorlage.

Bereitstellungsquellen

Ihre Bicep-Datei oder ARM-Vorlage kann optional auch eine Bereitstellung für Ihren Funktionscode definieren, der diese Methoden enthalten könnte:

Bereitstellungsquellen

Ihre Bicep-Datei oder ARM-Vorlage kann optional auch eine Bereitstellung für Ihren Funktionscode definieren, indem Sie ein zip-Bereitstellungspaket verwenden.

Um Ihre Anwendung erfolgreich mithilfe von Azure Resource Manager bereitzustellen, müssen Sie mit der Bereitstellung von Ressourcen in Azure vertraut sein. In den meisten Beispielen werden Konfigurationen auf oberster Ebene mithilfe von siteConfig angewendet. Diese Konfigurationen müssen auf der obersten Ebene festgelegt werden, da sie Informationen für die Laufzeit- und Azure CLI 2.0 Preview von Functions bereitstellen. Informationen auf oberster Ebene werden benötigt, bevor die untergeordnete Ressource sourcecontrols/web angewendet wird. Die Einstellungen könnten zwar auch in der untergeordneten Ressource config/appSettings angewendet werden, in bestimmten Fällen müssen Ihre Funktions-App und die Funktionen jedoch bereitgestellt werden, bevorconfig/appSettings angewendet wird.

zip-Bereitstellungspaket

Die zip-Bereitstellung ist eine empfohlene Methode zum Bereitstellen des Funktions-App-Codes. Standardmäßig werden Funktionen, die zip-Bereitstellung verwenden, im Bereitstellungspaket selbst ausgeführt. Weitere Informationen, einschließlich der Anforderungen für ein Bereitstellungspaket, finden Sie unter zip-Bereitstellung für Azure Functions. Wenn Sie die Automatisierung der Ressourcenbereitstellung verwenden, können Sie auf das zip-Bereitstellungspaket in Ihrer Bicep- oder ARM-Vorlage verweisen.

Wenn Sie die zip-Bereitstellung in Ihrer Vorlage verwenden möchten, legen Sie die Einstellung WEBSITE_RUN_FROM_PACKAGE in der App auf 1 fest und fügen Sie die Ressourcendefinition /zipDeploy ein.

Für einen Verbrauchsplan unter Linux legen Sie stattdessen den URI des Bereitstellungspakets direkt in der Einstellung WEBSITE_RUN_FROM_PACKAGE fest, wie in dieser Beispielvorlagedargestellt.

In diesem Beispiel wird einer vorhandenen App eine zip-Bereitstellungsquelle hinzugefügt:

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

Beachten Sie folgendes, wenn Sie zip-Bereitstellungsressourcen in Ihre Vorlage einschließen:

  • packageUri muss ein Speicherort sein, auf den Functions zugreifen kann. Erwägen Sie die Festlegung von Azure Blob Storage mit einer Shared Access Signature (SAS). Nachdem die SAS abgelaufen ist, kann Functions nicht mehr auf die Freigabe für Bereitstellungen zugreifen. Wenn Sie Ihre SAS neu generieren, denken Sie daran, die Einstellung WEBSITE_RUN_FROM_PACKAGE mit dem neuen URI-Wert zu aktualisieren.

  • Beim Festlegen WEBSITE_RUN_FROM_PACKAGE auf einen URI müssen Sie Auslöser manuell synchronisieren.

  • Stellen Sie beim Hinzufügen oder Aktualisieren von Einstellungen immer alle erforderlichen Anwendungseinstellungen in der Sammlung appSettings fest. Vorhandene Einstellungen, die nicht explizit festgelegt wurden, werden durch das Update entfernt. Weitere Informationen finden Sie unter Konfiguration der Anwendung.

  • Functions unterstützt Web Deploy (msdeploy) für Paketbereitstellungen nicht. Stattdessen müssen Sie die zip-Bereitstellung in Ihren Bereitstellungspipelines und der Automatisierung verwenden. Weitere Informationen finden Sie unter ZIP-Bereitstellung für Azure Functions.

Remotebuilds

Der Bereitstellungsprozess geht von der Annahme aus, dass die zip-Datei, die Sie benutzen, oder eine zip-Bereitstellung eine ausführbare App enthält. Das bedeutet, dass standardmäßig keine Anpassungen ausgeführt werden.

Es gibt jedoch Szenarien, in denen Sie Ihre Anwendung aus der Ferne neu erstellen müssen, z. B. wenn Sie Linux-spezifische Pakete in Python oder Node.js-Anwendungen, die Sie auf einem Windows-Computer entwickelt haben, abrufen müssen. In diesem Fall können Sie Functions so konfigurieren, dass nach der zip-Bereitstellung ein Remotebuild auf Ihrem Code ausgeführt wird.

Die Art und Weise, wie Sie einen Remotebuild anfordern, hängt vom Betriebssystem ab, für das Sie bereitstellen:

Bei der Bereitstellung einer App unter Windows werden sprachspezifische Befehle ausgeführt (z. B. dotnet restore für C#-Apps oder npm install für Node.js-Apps).

Um die gleichen Build-Prozesse wie bei der kontinuierlichen Integration zu aktivieren, fügen Sie SCM_DO_BUILD_DURING_DEPLOYMENT=true zu den Anwendungseinstellungen in Ihrem Bereitstellungscode hinzu und entfernen WEBSITE_RUN_FROM_PACKAGE vollständig.

Linux-Container

Wenn Sie eine containerisierte Funktions-App in einem Azure Functions Premium oder Dedicated Plan bereitstellen, müssen Sie Folgendes tun:

Weitere Informationen finden Sie unter Konfiguration der Anwendung.

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

Bei der Bereitstellung von containerisierten Funktionen in Azure Container Apps muss Ihre Vorlage Folgendes enthalten:

  • Legen Sie das Feld kind auf einen Wert von functionapp,linux,container,azurecontainerapps fest.
  • Legen Sie die Websiteeigenschaft managedEnvironmentId auf den vollqualifizierten URI der Container Apps-Umgebung fest.
  • Fügen Sie eine Ressourcenverknüpfung in der dependsOn-Sammlung der Website hinzu, wenn Sie gleichzeitig mit der Website eine Microsoft.App/managedEnvironments-Ressource erstellen.

Die Definition einer containerisierten Funktions-App, die von einer privaten Container-Registrierung in einer bestehenden Container-Apps-Umgebung bereitgestellt wird, könnte wie folgt aussehen:

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

Bei der Bereitstellung von Funktionen in Azure Arc hängt der Wert, den Sie für das Feld kind der Funktions-App-Ressource festlegen, von der Art der Bereitstellung ab:

Bereitstellungstyp Wert des Felds kind
Reine Codebereitstellung functionapp,linux,kubernetes
Containerbereitstellung functionapp,linux,kubernetes,container

Sie müssen auch die customLocationId wie für die Hostingplanressource festlegen.

Die Definition einer containerisierten Funktions-App unter Verwendung eines .NET 6 Schnellstartimages könnte wie folgt aussehen:

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

Anwendungskonfiguration

Functions bietet die folgenden Optionen für die Konfiguration Ihrer Funktions-App in Azure:

Konfiguration Microsoft.Web/sites-Eigenschaft
Websiteeinstellungen siteConfig
Anwendungseinstellungen siteConfig.appSettings-Sammlung

Für die Eigenschaft siteConfig sind die folgenden Websiteeinstellungen erforderlich:

Diese Anwendungseinstellungen sind für ein bestimmtes Betriebssystem und eine bestimmte Hosting-Option erforderlich (oder empfohlen):

Diese Anwendungseinstellungen sind für die Bereitstellung von Containern erforderlich:

Diese Einstellungen sind nur erforderlich, wenn die Bereitstellung von einer privaten Container-Registrierung aus erfolgt:

Denken Sie an diese Überlegungen, wenn Sie mit Website- und Anwendungseinstellungen unter Verwendung von Bicep-Dateien oder ARM-Vorlagen arbeiten:

  • Es gibt wichtige Überlegungen, wann Sie in einer automatisierten Bereitstellung WEBSITE_CONTENTSHARE festlegen sollten. Ausführliche Anleitungen finden Sie in der WEBSITE_CONTENTSHARE-Referenz.
  • Bei der Bereitstellung von Containern setzen Sie WEBSITES_ENABLE_APP_SERVICE_STORAGE ebenfalls auf false, da der Inhalt Ihrer Anwendung im Container selbst bereitgestellt wird.
  • Sie sollten Ihre Anwendungseinstellungen immer als siteConfig/appSettings-Sammlung der zu erstellenden Microsoft.Web/sites-Ressource definieren, wie es in den Beispielen in diesem Artikel geschieht. Damit stellen Sie sicher, dass die Einstellungen, die Ihre Funktions-App zur Ausführung benötigt, beim ersten Start verfügbar sind.

  • Wenn Sie Anwendungseinstellungen mithilfe von Vorlagen hinzufügen oder aktualisieren, stellen Sie sicher, dass Sie alle vorhandenen Einstellungen in die Aktualisierung einbeziehen. Sie müssen dies tun, weil die zugrunde liegenden REST-API-Aufrufe zur Aktualisierung die gesamte /config/appsettings-Ressource ersetzen. Wenn Sie die vorhandenen Einstellungen entfernen, kann Ihre Funktions-App nicht mehr ausgeführt werden. Einzelne Anwendungseinstellungen können Sie stattdessen programmgesteuert über die Azure CLI, Azure PowerShell oder das Azure-Portal aktualisieren. Weitere Informationen finden Sie unter Verwenden von Anwendungseinstellungen.

Slotbereitstellung

Mit Functions können Sie verschiedene Versionen Ihres Codes für eindeutige Endpunkte in Ihrer Funktions-App bereitstellen. Dies erleichtert die Entwicklung, Überprüfung und Bereitstellung von Funktionsaktualisierungen, ohne die in der Produktion laufenden Funktionen zu beeinträchtigen. Bereitstellungsslots sind eine Funktion von Azure App Service. Die Anzahl der verfügbaren Slots hängt von Ihrem Hostingplan ab. Weitere Informationen finden Sie unter Funktionen der Azure Functions Bereitstellungsslots.

Eine Slot-Ressource wird auf die gleiche Weise definiert wie eine Funktions-App-Ressource (Microsoft.Web/sites), allerdings verwenden Sie stattdessen den Ressourcenbezeichner Microsoft.Web/sites/slots. Ein Beispiel für eine Bereitstellung (sowohl in Bicep- als auch in ARM-Vorlagen), bei der sowohl ein Produktions- als auch ein Staging-Slot in einem Premium-Plan erstellt wird, finden Sie unter Azure Funktions-App mit einem Bereitstellungsslot.

Wie Sie den Tausch mit Hilfe von Vorlagen durchführen können, erfahren Sie unter Automatisieren mit Resource Manager-Vorlagen.

Denken Sie an die folgenden Punkte, wenn Sie mit der Slotbereitstellung arbeiten:

  • Legen Sie die Einstellung WEBSITE_CONTENTSHARE in der Definition des Bereitstellungsslots nicht explizit fest. Diese Einstellung wird beim Erstellen der App im Bereitstellungsslot für Sie generiert.

  • Wenn Sie Slots austauschen, gelten einige Anwendungseinstellungen als „permanent“, d.h. sie bleiben auf dem Slot und nicht auf dem Code, der ausgetauscht wird. Sie können eine solche Sloteinstellung definieren, indem Sie "slotSetting":true in die spezifische Anwendungseinstellungsdefinition in Ihrer Vorlage einschließen. Weitere Informationen finden Sie unter Einstellungen verwalten.

Gesicherte Bereitstellungen

Sie können Ihre Funktions-App in einer Bereitstellung erstellen, in der eine oder mehrere der Ressourcen durch die Integration mit virtuellen Netzwerken gesichert wurden. Die virtuelle Netzwerkintegration für Ihre Funktions-App wird durch eine Microsoft.Web/sites/networkConfig-Ressource definiert. Diese Integration hängt sowohl von der referenzierten Funktions-App als auch von den virtuellen Netzwerkressourcen ab. Ihre Funktions-App kann auch von anderen privaten Netzwerkressourcen abhängen, z. B. von privaten Endpunkten und Routen. Weitere Informationen finden Sie unter Netzwerkoptionen von Azure Functions.

Beim Erstellen einer Bereitstellung, die ein gesichertes Speicherkonto verwendet, müssen Sie die WEBSITE_CONTENTSHARE-Einstellung explizit festlegen und die Dateifreigaberessource erstellen, die in dieser Einstellung genannt ist. Stellen Sie sicher, dass Sie eine Microsoft.Storage/storageAccounts/fileServices/shares Ressource mit dem Wert von WEBSITE_CONTENTSHARE, wie in diesem Beispiel gezeigt (ARM-Vorlage|Bicep-Datei) erstellen. Außerdem müssen Sie die Siteeigenschaft vnetContentShareEnabled auf „true“ festlegen.

Hinweis

Wenn diese Einstellungen nicht Teil einer Bereitstellung sind, die ein gesichertes Speicherkonto verwendet, wird während der Bereitstellungsüberprüfung dieser Fehler angezeigt: Could not access storage account using provided connection string.

Diese Projekte bieten sowohl Bicep- als auch ARM-Vorlagenbeispiele für die Bereitstellung Ihrer Funktions-Apps in einem virtuellen Netzwerk, auch mit Einschränkungen beim Netzwerkzugang:

Eingeschränktes Szenario Beschreibung
Erstellen einer Funktions-App mit Virtual Network-Integration Ihre Funktions-App wird in einem virtuellen Netzwerk mit vollem Zugriff auf die Ressourcen dieses Netzwerks erstellt. Der ein- und ausgehende Zugriff auf Ihre Funktions-App ist nicht eingeschränkt. Weitere Informationen finden Sie unter Integration des virtuellen Netzwerks.
Erstellen einer Funktions-App, die auf ein gesichertes Speicherkonto zugreift Ihre erstellte Funktions-App verwendet ein gesichertes Speicherkonto, auf das Functions mit Hilfe privater Endpunkte zugreift. Weitere Informationen finden Sie unter Einschränken Ihres Speicherkontos auf ein virtuelles Netzwerk.
Erstellen einer Funktions-App und eines Speicherkontos, die beide private Endpunkte verwenden Auf Ihre erstellte Funktions-App kann nur über private Endpunkte zugegriffen werden, und sie verwendet private Endpunkte für den Zugriff auf Speicherressourcen. Weitere Informationen finden Sie unter Private Endpunkte.

Einstellungen für eingeschränkte Netzwerke

Möglicherweise müssen Sie diese Einstellungen auch verwenden, wenn Ihre Funktions-App Netzwerkbeschränkungen unterliegt:

Einstellung Wert Beschreibung
WEBSITE_CONTENTOVERVNET 1 Anwendungseinstellung, die es Ihrer Funktions-App ermöglicht, zu skalieren, wenn das Speicherkonto auf ein virtuelles Netzwerk beschränkt ist. Weitere Informationen finden Sie unter Einschränken Ihres Speicherkontos auf ein virtuelles Netzwerk.
vnetrouteallenabled 1 Website-Einstellung, die den gesamten Datenverkehr der Funktions-App zur Verwendung des virtuellen Netzwerks zwingt. Weitere Informationen finden Sie unter Integration des regionalen virtuellen Netzwerks. Diese Websiteeinstellung ersetzt die Anwendungseinstellung WEBSITE_VNET_ROUTE_ALL.

Überlegungen zu Netzwerkeinschränkungen

Wenn Sie den Zugriff auf das Speicherkonto über die privaten Endpunkte beschränken, können Sie nicht über das Portal oder ein Gerät außerhalb des virtuellen Netzwerks auf das Speicherkonto zugreifen. Sie können den Zugriff auf Ihre gesicherte IP-Adresse oder Ihr virtuelles Netzwerk im Speicherkonto ermöglichen, indem Sie die Standard-Netzwerkzugriffsregel verwalten.

Erstellen der Vorlage

Expert*innen im Umgang mit Bicep- oder ARM-Vorlagen können ihre Bereitstellungen mit einem einfachen Texteditor manuell codieren. Für den Rest von uns gibt es mehrere Möglichkeiten, den Entwicklungsprozess zu vereinfachen:

  • Visual Studio Code: Es gibt Erweiterungen, die Ihnen helfen, sowohl mit Bicep-Dateien als auch mit ARM-Vorlagen zu arbeiten. Sie können diese Tools verwenden, um sicherzustellen, dass Ihr Code korrekt ist, und sie bieten einige grundlegende Validierungsfunktionen.

  • Azure-Portal: Wenn Sie Ihre Funktions-App und die zugehörigen Ressourcen im Portal erstellen, finden Sie auf dem letzten Bildschirm Überprüfen + Erstellen einen Link Vorlage für Automatisierung herunterladen.

    Laden Sie den Vorlagenlink aus dem Azure Functions-Erstellungsprozess im Azure-Portal herunter.

    Dieser Link zeigt Ihnen die ARM-Vorlage, die auf der Grundlage der von Ihnen im Portal gewählten Optionen erstellt wurde. Diese Vorlage kann zwar etwas komplex sein, wenn Sie eine Funktions-App mit vielen neuen Ressourcen erstellen, aber sie kann eine gute Referenz dafür sein, wie Ihre ARM-Vorlage aussehen könnte.

Überprüfen der Vorlage

Wenn Sie Ihre Bereitstellungsvorlagendatei manuell erstellen, ist es wichtig, dass Sie Ihre Vorlage vor der Bereitstellung überprüfen. Alle Bereitstellungsmethoden überprüfen die Syntax Ihrer Vorlage und geben eine validation failed-Fehlermeldung aus, wie im folgenden JSON-formatierten Beispiel gezeigt:

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

Mit den folgenden Methoden können Sie Ihre Vorlage vor der Bereitstellung überprüfen:

Die folgende Aufgabe zur Bereitstellung von Azure-Ressourcengruppen v2 mit deploymentMode: 'Validation' weist Azure Pipelines an, die Vorlage zu validieren.

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

Sie können auch eine Testressourcengruppe erstellen, um Preflight- und Bereitstellungsfehler zu finden.

Bereitstellen der Vorlage

Sie können Ihre Bicep-Datei und -Vorlage mit einer der folgenden Methoden bereitstellen:

Schaltfläche zum Bereitstellen in Azure

Hinweis

Diese Methode bietet zurzeit keine Unterstützung für die Bereitstellung von Bicep-Dateien.

Ersetzen Sie <url-encoded-path-to-azuredeploy-json> durch eine URL-codierte Version des Rohpfads Ihrer Datei azuredeploy.json in GitHub.

Hier ist ein Beispiel unter Verwendung von Markdown:

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

Hier ist ein Beispiel unter Verwendung von 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>

Bereitstellen mit PowerShell

Mit den folgenden PowerShell-Befehlen wird eine Ressourcengruppe erstellt und eine Bicep-Datei/ARM-Vorlage bereitgestellt, über die eine Funktions-App mit ihren erforderlichen Ressourcen erstellt wird. Um diese Befehle lokal ausführen zu können, müssen Sie Azure PowerShell installiert haben. Führen Sie Connect-AzAccount aus, um sich anzumelden.

# 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

Um diese Bereitstellung zu testen, können Sie eine Vorlage wie die folgende verwenden, mit der eine Funktions-App unter Windows in einem Verbrauchsplan erstellt wird.

Nächste Schritte

Machen Sie sich näher mit dem Entwickeln und Konfigurieren von Azure Functions vertraut.