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 SKU
verwenden, 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:
- Verbrauchspläne unter Linux unterstützen
WEBSITE_RUN_FROM_PACKAGE = 1
nicht. Sie müssen stattdessen den URI des Bereitstellungspakets direkt in der EinstellungWEBSITE_RUN_FROM_PACKAGE
festlegen. Weitere Informationen finden Sie unter WEBSITE_RUN_FROM_PACKAGE. Eine Beispielvorlage finden Sie unter In einem Linux-Verbrauchsplan gehostete Funktions-App.
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 EinstellungWEBSITE_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:
- Legen Sie die Websiteeinstellung
linuxFxVersion
auf den Bezeichner Ihres Containerimages fest. - Legen Sie alle erforderlichen
DOCKER_REGISTRY_SERVER_*
-Einstellungen fest, wenn Sie den Container aus einer privaten Registrierung abrufen. - Legen Sie die Anwendungseinstellung
WEBSITES_ENABLE_APP_SERVICE_STORAGE
auffalse
fest.
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 vonfunctionapp,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 eineMicrosoft.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 derWEBSITE_CONTENTSHARE
-Referenz.
- Bei der Bereitstellung von Containern setzen Sie
WEBSITES_ENABLE_APP_SERVICE_STORAGE
ebenfalls auffalse
, da der Inhalt Ihrer Anwendung im Container selbst bereitgestellt wird.
Sie sollten Ihre Anwendungseinstellungen immer als
siteConfig/appSettings
-Sammlung der zu erstellendenMicrosoft.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.
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.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Tickets als Feedbackmechanismus für Inhalte auslaufen lassen und es durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter:Einreichen und Feedback anzeigen für