Resource-implementatie automatiseren voor uw functie-app in Azure Functions
U kunt een Bicep-bestand of een Azure Resource Manager-sjabloon gebruiken om het proces van het implementeren van een functie-app naar nieuwe of bestaande Azure-resources te automatiseren. Dergelijke automatisering biedt een uitstekende manier om uw resource-implementaties te integreren met uw broncode in DevOps, een functie-app en gerelateerde resources te herstellen vanuit een back-up of meerdere keren een app-topologie te implementeren.
In dit artikel leest u hoe u het maken van resources en implementatie voor Azure Functions automatiseert. Afhankelijk van de triggers en bindingen die door uw functies worden gebruikt, moet u mogelijk andere resources implementeren, die buiten het bereik van dit artikel vallen.
De specifieke sjablooncode is afhankelijk van hoe uw functie-app wordt gehost, ongeacht of u code of een containerfunctie-app implementeert en het besturingssysteem dat door uw app wordt gebruikt. Dit artikel ondersteunt de volgende hostingopties:
Hostingoptie | Implementatietype | Zie voor meer informatie... |
---|---|---|
Azure Functions Consumption-abonnement | Alleen code | Verbruiksabonnement |
Azure Functions Elastic Premium-abonnement | Code | Container | Premium-abonnement |
Toegewezen Azure Functions-plan (App Service) | Code | Container | Toegewezen abonnement |
Azure Container Apps | Alleen container | Container Apps hosten van Azure Functions |
Azure Arc | Code | Container | App Service, Functions en Logic Apps in Azure Arc (preview) |
Vereiste resources
Een door Azure Functions gehoste implementatie bestaat doorgaans uit deze resources:
Bron | Vereiste | Naslaginformatie over syntaxis en eigenschappen |
---|---|---|
Een opslagaccount | Vereist | Microsoft.Storage/storageAccounts |
Een Application Insights-onderdeel | Aanbevolen | Microsoft.Insights/components |
Een hostingabonnement | Vereist1 | Microsoft.Web/serverfarms |
Een functie-app | Vereist | Microsoft.Web/sites |
Een Azure Functions-implementatie voor een verbruiksabonnement bestaat doorgaans uit deze resources:
Bron | Vereiste | Naslaginformatie over syntaxis en eigenschappen |
---|---|---|
Een opslagaccount | Vereist | Microsoft.Storage/storageAccounts |
Een Application Insights-onderdeel | Aanbevolen | Microsoft.Insights/components |
Een functie-app | Vereist | Microsoft.Web/sites |
Een door Azure Container Apps gehoste implementatie bestaat doorgaans uit deze resources:
Bron | Vereiste | Naslaginformatie over syntaxis en eigenschappen |
---|---|---|
Een opslagaccount | Vereist | Microsoft.Storage/storageAccounts |
Een Application Insights-onderdeel | Aanbevolen | Microsoft.Insights/components |
Een beheerde omgeving | Vereist | Microsoft.App/managedEnvironments |
Een functie-app | Vereist | Microsoft.Web/sites |
Een door Azure Arc gehoste implementatie bestaat doorgaans uit deze resources:
Bron | Vereiste | Naslaginformatie over syntaxis en eigenschappen |
---|---|---|
Een opslagaccount | Vereist | Microsoft.Storage/storageAccounts |
Een Application Insights-onderdeel | Aanbevolen | Microsoft.Insights/components |
Een App Service Kubernetes-omgeving | Vereist | Microsoft.ExtendedLocation/customLocations |
Een functie-app | Vereist | Microsoft.Web/sites |
1Een expliciet hostingabonnement is niet vereist wanneer u ervoor kiest om uw functie-app te hosten in een verbruiksabonnement.
Wanneer u meerdere resources in één Bicep-bestand of ARM-sjabloon implementeert, is de volgorde waarin resources worden gemaakt belangrijk. Deze vereiste is het gevolg van afhankelijkheden tussen resources. Zorg ervoor dat u voor dergelijke afhankelijkheden het dependsOn
element gebruikt om de afhankelijkheid in de afhankelijke resource te definiëren. Zie de volgorde voor het implementeren van resources in ARM-sjablonen of resourceafhankelijkheden in Bicep voor meer informatie.
In dit artikel wordt ervan uitgegaan dat u basiskennis hebt van het maken van Bicep-bestanden of het ontwerpen van Azure Resource Manager-sjablonen en dat voorbeelden worden weergegeven als afzonderlijke secties voor specifieke resources. Zie deze voorbeelden van de implementatie van functie-apps voor een breed scala aan complete Bicep-bestanden en ARM-sjablonen.
Vereisten
In dit artikel wordt ervan uitgegaan dat u al een beheerde omgeving hebt gemaakt in Azure Container Apps. U hebt zowel de naam als de id van de beheerde omgeving nodig om een functie-app te maken die wordt gehost in Container Apps.
In dit artikel wordt ervan uitgegaan dat u al een aangepaste locatie met App Service hebt gemaakt in een Kubernetes-cluster met Azure Arc. U hebt zowel de aangepaste locatie-id als de Kubernetes-omgevings-id nodig om een functie-app te maken die wordt gehost op een aangepaste Azure Arc-locatie.
Een opslagaccount maken
Voor alle functie-apps is een Azure-opslagaccount vereist. U hebt een account voor algemeen gebruik nodig dat ondersteuning biedt voor blobs, tabellen, wachtrijen en bestanden. Zie de vereisten voor azure Functions-opslagaccounts voor meer informatie.
Belangrijk
Het opslagaccount wordt gebruikt voor het opslaan van belangrijke app-gegevens, soms inclusief de toepassingscode zelf. U moet de toegang van andere apps en gebruikers tot het opslagaccount beperken.
In deze voorbeeldsectie maakt u een v2-opslagaccount voor standaard algemeen gebruik:
"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
}
}
]
Zie het volledige azuredeploy.json-bestand in de opslagplaats met sjablonen voor meer context.
U moet de verbindingsreeks van dit opslagaccount instellen als de AzureWebJobsStorage
app-instelling, waarvoor Functions vereist is. De sjablonen in dit artikel maken deze verbindingsreeks waarde op basis van het gemaakte opslagaccount. Dit is een best practice. Zie Toepassingsconfiguratie voor meer informatie.
Opslaglogboeken inschakelen
Omdat het opslagaccount wordt gebruikt voor belangrijke functie-app-gegevens, moet u het account controleren op wijziging van die inhoud. Als u uw opslagaccount wilt bewaken, moet u Azure Monitor-resourcelogboeken configureren voor Azure Storage. In deze voorbeeldsectie wordt een Log Analytics-werkruimte met de naam myLogAnalytics
gebruikt als de bestemming voor deze logboeken.
"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
}
]
}
}
]
Dezelfde werkruimte kan later worden gebruikt voor de Application Insights-resource die is gedefinieerd. Zie Bewaking van Azure Storage voor meer informatie, waaronder het werken met deze logboeken.
Application Insights maken
Application Insights wordt aanbevolen voor het bewaken van de uitvoeringen van uw functie-app. In dit voorbeeldgedeelte wordt de Application Insights-resource gedefinieerd met het type Microsoft.Insights/components
en het type 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"
},
Zie het volledige azuredeploy.json-bestand in de opslagplaats met sjablonen voor meer context.
De verbinding moet worden opgegeven voor de functie-app met behulp van de APPLICATIONINSIGHTS_CONNECTION_STRING
toepassingsinstelling. Zie Toepassingsinstellingen voor meer informatie.
De voorbeelden in dit artikel verkrijgen de verbindingsreeks waarde voor het gemaakte exemplaar. Oudere versies kunnen in plaats daarvan de APPINSIGHTS_INSTRUMENTATIONKEY
instrumentatiesleutel instellen, wat niet meer wordt aanbevolen.
Het hostingabonnement maken
Apps die worden gehost in een Azure Functions Premium-abonnement of een Dedicated (App Service)-abonnement , moeten expliciet het hostingabonnement hebben gedefinieerd.
Het Premium-abonnement biedt dezelfde schaalaanpassing als het Verbruiksabonnement, maar bevat toegewezen resources en extra mogelijkheden. Zie Het Azure Functions Premium-abonnement voor meer informatie.
Een Premium-abonnement is een speciaal type serverfarm
resource. U kunt deze opgeven met behulp van EP1
, EP2
of EP3
voor de Name
eigenschapswaarde in de sku
eigenschap. De manier waarop u het Functions-hostingabonnement definieert, is afhankelijk van of uw functie-app wordt uitgevoerd in Windows of linux. In deze voorbeeldsectie wordt een EP1
plan gemaakt:
"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
}
}
]
Zie het volledige azuredeploy.json-bestand in de opslagplaats met sjablonen voor meer context.
Zie of bekijk de voorbeeldsjablonen voor meer informatie over het sku
object SkuDefinition
.
In het Toegewezen (App Service)-plan wordt uw functie-app uitgevoerd op toegewezen VM's op Basic-, Standard- en Premium-SKU's in App Service-abonnementen, vergelijkbaar met web-apps. Zie Dedicated-abonnement voor meer informatie.
Zie Functie-app in Azure-app Service-plan voor een voorbeeld van een Bicep-bestand/Azure Resource Manager-sjabloon
In Functions is het Dedicated-plan slechts een gewoon App Service-plan, dat wordt gedefinieerd door een serverfarm
resource. U moet ten minste de name
waarde opgeven. Zie de instelling az appservice plan create
voor de --sku
huidige lijst met ondersteunde waarden voor een Dedicated-plan voor een lijst met ondersteunde abonnementsnamen.
De manier waarop u het hostingabonnement definieert, is afhankelijk van of uw functie-app wordt uitgevoerd in Windows of 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
}
}
]
Zie het volledige azuredeploy.json-bestand in de opslagplaats met sjablonen voor meer context.
Het hostingabonnement maken
U hoeft geen resource voor het hostingabonnement Verbruik expliciet te definiëren. Wanneer u deze resourcedefinitie overslaat, wordt er automatisch een plan gemaakt of geselecteerd per regio wanneer u de resource van de functie-app zelf maakt.
U kunt een verbruiksabonnement expliciet definiëren als een speciaal type resource, dat u opgeeft met behulp van serverfarm
de waarde Dynamic
voor de computeMode
en sku
eigenschappen. In deze voorbeeldsectie ziet u hoe u expliciet een verbruiksabonnement definieert. De manier waarop u een hostingabonnement definieert, is afhankelijk van of uw functie-app wordt uitgevoerd in Windows of 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"
}
}
]
Zie het volledige azuredeploy.json-bestand in de opslagplaats met sjablonen voor meer context.
Kubernetes-omgeving
Azure Functions kan worden geïmplementeerd in Kubernetes met Azure Arc als een codeproject of een containerfunctie-app.
Als u de app- en planbronnen wilt maken, moet u al een App Service Kubernetes-omgeving hebben gemaakt voor een Kubernetes-cluster met Azure Arc. In de voorbeelden in dit artikel wordt ervan uitgegaan dat u de resource-id hebt van de aangepaste locatie (customLocationId
) en de App Service Kubernetes-omgeving (kubeEnvironmentId
) waarop u implementeert, die in dit voorbeeld zijn ingesteld:
"parameters": {
"kubeEnvironmentId" : {
"type": "string"
},
"customLocationId" : {
"type": "string"
}
}
Zowel sites als plannen moeten verwijzen naar de aangepaste locatie via een extendedLocation
veld. Zoals wordt weergegeven in dit afgekapte voorbeeld, bevindt zich buiten properties
, extendedLocation
als peer-to kind
en location
:
{
"type": "Microsoft.Web/serverfarms",
...
{
"extendedLocation": {
"name": "[parameters('customLocationId')]"
},
}
}
De planresource moet de Kubernetes-waarde (K1
) gebruiken voor SKU
, het kind
veld moet zijn linux,kubernetes
en de reserved
eigenschap moet zijn true
, omdat het een Linux-implementatie is. U moet ook de extendedLocation
en kubeEnvironmentProfile.id
de aangepaste locatie-id en de Kubernetes-omgevings-id instellen, die er als volgt uit kunnen zien in deze voorbeeldsectie:
"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
}
}
]
De functie-app maken
De functie-app-resource wordt gedefinieerd door een resource van het type Microsoft.Web/sites
en kind
die minimaal , inclusief functionapp
.
De manier waarop u een functie-app-resource definieert, is afhankelijk van of u host op Linux of in Windows:
Zie Toepassingsconfiguratie voor een lijst met toepassingsinstellingen die vereist zijn bij het uitvoeren in Windows. Zie voor een voorbeeld van een Bicep-bestand/Azure Resource Manager-sjabloon de functie-app die wordt gehost in Windows in een sjabloon voor een verbruiksabonnement .
Zie Toepassingsconfiguratie voor een lijst met toepassingsinstellingen die vereist zijn bij het uitvoeren in Windows.
Notitie
Als u ervoor kiest om uw verbruiksabonnement optioneel te definiëren, moet u de serverFarmId
eigenschap voor de app instellen zodat deze verwijst naar de resource-id van het abonnement. Zorg ervoor dat de functie-app een dependsOn
instelling heeft die ook verwijst naar het plan. Als u een plan niet expliciet hebt gedefinieerd, wordt er een voor u gemaakt.
Stel de serverFarmId
eigenschap in de app in zodat deze verwijst naar de resource-id van het plan. Zorg ervoor dat de functie-app een dependsOn
instelling heeft die ook verwijst naar het plan.
"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"
}
]
}
}
}
]
Zie deze azuredeploy.json sjabloon voor een volledig end-to-end-voorbeeld.
"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"
}
]
}
}
}
]
Zie deze azuredeploy.json sjabloon voor een volledig end-to-end-voorbeeld.
Implementatiebronnen
Uw Bicep-bestand of ARM-sjabloon kan eventueel ook een implementatie definiëren voor uw functiecode, waaronder deze methoden:
Implementatiebronnen
Uw Bicep-bestand of ARM-sjabloon kan eventueel ook een implementatie voor uw functiecode definiëren met behulp van een zip-implementatiepakket.
Als u uw toepassing wilt implementeren met behulp van Azure Resource Manager, is het belangrijk om te begrijpen hoe resources worden geïmplementeerd in Azure. In de meeste voorbeelden worden configuraties op het hoogste niveau toegepast met behulp van siteConfig
. Het is belangrijk om deze configuraties op het hoogste niveau in te stellen, omdat ze informatie overbrengen naar de Functions-runtime en -implementatie-engine. Informatie op het hoogste niveau is vereist voordat de onderliggende sourcecontrols/web
resource wordt toegepast. Hoewel het mogelijk is om deze instellingen te configureren in de resource op onderliggend niveau config/appSettings
, moet uw functie-app in sommige gevallen worden geïmplementeerd voordatconfig/appSettings
deze wordt toegepast.
Zip-implementatiepakket
Zip-implementatie is een aanbevolen manier om uw functie-app-code te implementeren. Standaard worden functies die gebruikmaken van zip-implementatie uitgevoerd in het implementatiepakket zelf. Zie Zip-implementatie voor Azure Functions voor meer informatie, waaronder de vereisten voor een implementatiepakket. Wanneer u resource-implementatieautomatisering gebruikt, kunt u verwijzen naar het .zip-implementatiepakket in uw Bicep- of ARM-sjabloon.
Als u zip-implementatie in uw sjabloon wilt gebruiken, stelt u de WEBSITE_RUN_FROM_PACKAGE
instelling in de app 1
in op en neemt u de /zipDeploy
resourcedefinitie op.
Voor een verbruiksabonnement in Linux stelt u in plaats daarvan de URI van het implementatiepakket rechtstreeks in de WEBSITE_RUN_FROM_PACKAGE
instelling in, zoals wordt weergegeven in deze voorbeeldsjabloon.
In dit voorbeeld wordt een zip-implementatiebron toegevoegd aan een bestaande 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')]"
}
}
]
}
Houd rekening met het volgende bij het opnemen van zip-implementatiebronnen in uw sjabloon:
- Verbruiksabonnementen op Linux bieden geen ondersteuning
WEBSITE_RUN_FROM_PACKAGE = 1
voor . U moet in plaats daarvan de URI van het implementatiepakket rechtstreeks in deWEBSITE_RUN_FROM_PACKAGE
instelling instellen. Zie WEBSITE_RUN_FROM_PACKAGE voor meer informatie. Zie De functie-app die wordt gehost op Linux in een verbruiksabonnement voor een voorbeeldsjabloon.
De
packageUri
locatie moet een locatie zijn die toegankelijk is voor Functions. Overweeg om Azure Blob Storage te gebruiken met een Shared Access Signature (SAS). Nadat de SAS is verlopen, heeft Functions geen toegang meer tot de share voor implementaties. Wanneer u de SAS opnieuw genereert, moet u deWEBSITE_RUN_FROM_PACKAGE
instelling bijwerken met de nieuwe URI-waarde.Wanneer u een
WEBSITE_RUN_FROM_PACKAGE
URI instelt, moet u triggers handmatig synchroniseren.Zorg ervoor dat u altijd alle vereiste toepassingsinstellingen in de
appSettings
verzameling instelt wanneer u instellingen toevoegt of bijwerkt. Bestaande instellingen die niet expliciet zijn ingesteld, worden verwijderd door de update. Zie Toepassingsconfiguratie voor meer informatie.Functions biedt geen ondersteuning voor Web Deploy (msdeploy) voor pakketimplementaties. U moet in plaats daarvan zip-implementatie gebruiken in uw implementatiepijplijnen en automatisering. Zie Zip-implementatie voor Azure Functions voor meer informatie.
Externe builds
Bij het implementatieproces wordt ervan uitgegaan dat het .zip-bestand dat u gebruikt of een zip-implementatie een kant-en-klare app bevat. Dit betekent dat standaard geen aanpassingen worden uitgevoerd.
Er zijn echter scenario's waarin u uw app op afstand opnieuw moet bouwen, bijvoorbeeld wanneer u Linux-specifieke pakketten moet ophalen in Python of Node.js-apps die u hebt ontwikkeld op een Windows-computer. In dit geval kunt u Functions configureren voor het uitvoeren van een externe build op uw code na de zip-implementatie.
De manier waarop u een externe build aanvraagt, is afhankelijk van het besturingssysteem waarop u implementeert:
Wanneer een app wordt geïmplementeerd in Windows, worden taalspecifieke opdrachten (zoals dotnet restore
voor C#-apps of npm install
voor Node.js-apps) uitgevoerd.
Als u dezelfde buildprocessen wilt inschakelen die u krijgt met continue integratie, voegt SCM_DO_BUILD_DURING_DEPLOYMENT=true
u de toepassingsinstellingen toe aan uw implementatiecode en verwijdert u de WEBSITE_RUN_FROM_PACKAGE
volledige procedure.
Linux-containers
Als u een containerfunctie-app implementeert in een Azure Functions Premium- of Dedicated-abonnement, moet u het volgende doen:
- Stel de
linuxFxVersion
site-instelling in met de id van uw containerinstallatiekopieën. - Stel alle vereiste
DOCKER_REGISTRY_SERVER_*
instellingen in bij het verkrijgen van de container uit een privéregister. - Stel
WEBSITES_ENABLE_APP_SERVICE_STORAGE
de toepassingsinstelling in opfalse
.
Zie Toepassingsconfiguratie voor meer informatie.
"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"
}
}
}
]
Bij het implementeren van containerfuncties in Azure Container Apps moet uw sjabloon het volgende doen:
- Stel het
kind
veld in op een waarde vanfunctionapp,linux,container,azurecontainerapps
. - Stel de
managedEnvironmentId
site-eigenschap in op de volledig gekwalificeerde URI van de Container Apps-omgeving. - Voeg een resourcekoppeling toe aan de verzameling van
dependsOn
de site bij het maken van eenMicrosoft.App/managedEnvironments
resource op hetzelfde moment als de site.
De definitie van een containerfunctie-app die is geïmplementeerd vanuit een privécontainerregister naar een bestaande Container Apps-omgeving, kan er als volgt uitzien:
"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')]"
}
}
]
Bij het implementeren van functies in Azure Arc is de waarde die u hebt ingesteld voor het kind
veld van de functie-app-resource afhankelijk van het type implementatie:
Implementatietype | kind veldwaarde |
---|---|
Implementatie met alleen code | functionapp,linux,kubernetes |
Containerimplementatie | functionapp,linux,kubernetes,container |
U moet ook de customLocationId
instellingen instellen zoals u hebt gedaan voor de resource van het hostingplan.
De definitie van een containerfunctie-app, met behulp van een quickstart-installatiekopieën van .NET 6, kan er als volgt uitzien:
"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
}
}
}
]
Toepassingsconfiguratie
Functions biedt de volgende opties voor het configureren van uw functie-app in Azure:
Configuratie | Microsoft.Web/sites Eigenschap |
---|---|
Site-instellingen | siteConfig |
Toepassingsinstellingen | siteConfig.appSettings Collectie |
De volgende site-instellingen zijn vereist voor de siteConfig
eigenschap:
Deze toepassingsinstellingen zijn vereist (of aanbevolen) voor een specifiek besturingssysteem en hostingoptie:
Deze toepassingsinstellingen zijn vereist voor containerimplementaties:
Deze instellingen zijn alleen vereist bij het implementeren vanuit een privécontainerregister:
Houd rekening met deze overwegingen bij het werken met site- en toepassingsinstellingen met bicep-bestanden of ARM-sjablonen:
- Er zijn belangrijke overwegingen voor wanneer u moet instellen
WEBSITE_CONTENTSHARE
in een geautomatiseerde implementatie. Zie deWEBSITE_CONTENTSHARE
naslaginformatie voor gedetailleerde richtlijnen.
- Voor containerimplementaties kunt u ook instellen op
WEBSITES_ENABLE_APP_SERVICE_STORAGE
false
, omdat uw app-inhoud wordt geleverd in de container zelf.
U moet altijd uw toepassingsinstellingen definiëren als een
siteConfig/appSettings
verzameling van deMicrosoft.Web/sites
resource die wordt gemaakt, zoals wordt gedaan in de voorbeelden in dit artikel. Dit zorgt ervoor dat de instellingen die uw functie-app moet uitvoeren, beschikbaar zijn bij het initiële opstarten.Wanneer u toepassingsinstellingen toevoegt of bijwerkt met behulp van sjablonen, moet u ervoor zorgen dat u alle bestaande instellingen bij de update opneemt. U moet dit doen omdat de onderliggende REST API-aanroepen van updates de volledige
/config/appsettings
resource vervangen. Als u de bestaande instellingen verwijdert, wordt uw functie-app niet uitgevoerd. Als u afzonderlijke toepassingsinstellingen programmatisch wilt bijwerken, kunt u in plaats daarvan de Azure CLI, Azure PowerShell of Azure Portal gebruiken om deze wijzigingen aan te brengen. Zie Werken met toepassingsinstellingen voor meer informatie.
Site-implementaties
Met Functions kunt u verschillende versies van uw code implementeren op unieke eindpunten in uw functie-app. Hierdoor kunt u eenvoudiger functies-updates ontwikkelen, valideren en implementeren zonder dat dit van invloed is op functies die in productie worden uitgevoerd. Implementatiesites zijn een functie van Azure-app Service. Het aantal beschikbare sites is afhankelijk van uw hostingabonnement. Zie Functies voor Azure Functions-implementatiesites voor meer informatie.
Een siteresource wordt op dezelfde manier gedefinieerd als een functie-app-resource (Microsoft.Web/sites
), maar in plaats daarvan gebruikt u de Microsoft.Web/sites/slots
resource-id. Voor een voorbeeldimplementatie (in zowel Bicep- als ARM-sjablonen) waarmee zowel een productie- als een staging-site in een Premium-abonnement wordt gemaakt, raadpleegt u de Azure Function-app met een implementatiesite.
Zie Automate met Resource Manager-sjablonen voor meer informatie over het wisselen met behulp van sjablonen.
Houd rekening met de volgende overwegingen bij het werken met site-implementaties:
Stel de instelling niet expliciet in de definitie van de
WEBSITE_CONTENTSHARE
implementatiesite in. Deze instelling wordt voor u gegenereerd wanneer de app wordt gemaakt in de implementatiesite.Wanneer u sites verwisselt, worden sommige toepassingsinstellingen beschouwd als 'plakkerig', omdat ze bij de site blijven en niet met de code die wordt gewisseld. U kunt een dergelijke site-instelling definiëren door deze op te slaan
"slotSetting":true
in de specifieke definitie van de toepassingsinstelling in uw sjabloon. Zie Instellingen beheren voor meer informatie.
Beveiligde implementaties
U kunt uw functie-app maken in een implementatie waarbij een of meer van de resources zijn beveiligd door integratie met virtuele netwerken. Integratie van virtuele netwerken voor uw functie-app wordt gedefinieerd door een Microsoft.Web/sites/networkConfig
resource. Deze integratie is afhankelijk van zowel de functie-app waarnaar wordt verwezen als de resources van het virtuele netwerk. Uw functie-app is mogelijk ook afhankelijk van andere privénetwerkresources, zoals privé-eindpunten en routes. Zie Azure Functions-netwerkopties voor meer informatie.
Wanneer u een implementatie maakt die gebruikmaakt van een beveiligd opslagaccount, moet u zowel de WEBSITE_CONTENTSHARE
instelling expliciet instellen als de bestandsshareresource maken met de naam in deze instelling. Zorg ervoor dat u een Microsoft.Storage/storageAccounts/fileServices/shares
resource maakt met de waarde van WEBSITE_CONTENTSHARE
, zoals wordt weergegeven in dit voorbeeld (ARM-sjabloon|Bicep-bestand). U moet ook de site-eigenschap vnetContentShareEnabled
instellen op waar.
Notitie
Wanneer deze instellingen geen deel uitmaken van een implementatie die gebruikmaakt van een beveiligd opslagaccount, ziet u deze fout tijdens de implementatievalidatie: Could not access storage account using provided connection string
Deze projecten bieden zowel Bicep- als ARM-sjabloonvoorbeelden voor het implementeren van uw functie-apps in een virtueel netwerk, waaronder beperkingen voor netwerktoegang:
Beperkt scenario | Beschrijving |
---|---|
Een functie-app maken met integratie van virtuele netwerken | Uw functie-app wordt gemaakt in een virtueel netwerk met volledige toegang tot resources in dat netwerk. Binnenkomende en uitgaande toegang tot uw functie-app is niet beperkt. Zie Integratie van virtueel netwerk voor meer informatie. |
Een functie-app maken die toegang heeft tot een beveiligd opslagaccount | Uw gemaakte functie-app maakt gebruik van een beveiligd opslagaccount, waartoe Functions toegang heeft met behulp van privé-eindpunten. Zie Uw opslagaccount beperken tot een virtueel netwerk voor meer informatie. |
Een functie-app en opslagaccount maken die beide gebruikmaken van privé-eindpunten | Uw gemaakte functie-app kan alleen worden geopend met behulp van privé-eindpunten en maakt gebruik van privé-eindpunten voor toegang tot opslagbronnen. Zie Privé-eindpunten voor meer informatie. |
Instellingen voor beperkt netwerk
Mogelijk moet u deze instellingen ook gebruiken wanneer uw functie-app netwerkbeperkingen heeft:
Instelling | Weergegeven als | Beschrijving |
---|---|---|
WEBSITE_CONTENTOVERVNET |
1 |
Toepassingsinstelling waarmee uw functie-app kan worden geschaald wanneer het opslagaccount wordt beperkt tot een virtueel netwerk. Zie Uw opslagaccount beperken tot een virtueel netwerk voor meer informatie. |
vnetrouteallenabled |
1 |
Site-instelling die alle verkeer van de functie-app dwingt om het virtuele netwerk te gebruiken. Zie Regionale integratie van virtueel netwerk voor meer informatie. Deze site-instelling vervangt de toepassingsinstelling WEBSITE_VNET_ROUTE_ALL . |
Overwegingen voor netwerkbeperkingen
Wanneer u de toegang tot het opslagaccount beperkt via de privé-eindpunten, hebt u geen toegang tot het opslagaccount via de portal of een apparaat buiten het virtuele netwerk. U kunt toegang verlenen tot uw beveiligde IP-adres of virtueel netwerk in het opslagaccount door de standaardregel voor netwerktoegang te beheren.
Uw sjabloon maken
Experts met Bicep- of ARM-sjablonen kunnen hun implementaties handmatig codeeren met behulp van een eenvoudige teksteditor. Voor de rest zijn er verschillende manieren om het ontwikkelingsproces eenvoudiger te maken:
Visual Studio Code: Er zijn extensies beschikbaar waarmee u kunt werken met zowel Bicep-bestanden als ARM-sjablonen. U kunt deze hulpprogramma's gebruiken om ervoor te zorgen dat uw code juist is en ze bieden enkele basisvalidaties.
Azure Portal: Wanneer u uw functie-app en gerelateerde resources in de portal maakt, bevat het laatste scherm Beoordelen en maken een sjabloon downloaden voor automatiseringskoppeling .
In deze koppeling ziet u de ARM-sjabloon die is gegenereerd op basis van de opties die u hebt gekozen in de portal. Hoewel deze sjabloon een beetje complex kan zijn wanneer u een functie-app met veel nieuwe resources maakt, kan deze een goed overzicht bieden van hoe uw ARM-sjabloon eruit kan zien.
Uw sjabloon valideren
Wanneer u uw implementatiesjabloonbestand handmatig maakt, is het belangrijk om uw sjabloon vóór de implementatie te valideren. Alle implementatiemethoden valideren de syntaxis van uw sjabloon en genereren een validation failed
foutbericht, zoals wordt weergegeven in het volgende voorbeeld met JSON-indeling:
{"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":""}}]}}
De volgende methoden kunnen worden gebruikt om uw sjabloon vóór de implementatie te valideren:
De volgende azure-resourcegroepimplementatie v2-taak met deploymentMode: 'Validation'
instrueert Azure Pipelines om de sjabloon te valideren.
- 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'
U kunt ook een testresourcegroep maken om preflight- en implementatiefouten te vinden.
De sjabloon implementeren
U kunt een van de volgende manieren gebruiken om uw Bicep-bestand en -sjabloon te implementeren:
De knop Implementeren in Azure
Notitie
Deze methode biedt momenteel geen ondersteuning voor het implementeren van Bicep-bestanden.
Vervang <url-encoded-path-to-azuredeploy-json>
door een door URL gecodeerde versie van het onbewerkte pad van uw azuredeploy.json
bestand in GitHub.
Hier volgt een voorbeeld waarin markdown wordt gebruikt:
[![Deploy to Azure](https://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>)
Hier volgt een voorbeeld waarin HTML wordt gebruikt:
<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>
Implementeren met PowerShell
Met de volgende PowerShell-opdrachten maakt u een resourcegroep en implementeert u een Bicep-bestand/ARM-sjabloon waarmee een functie-app met de vereiste resources wordt gemaakt. Als u lokaal wilt uitvoeren, moet Azure PowerShell zijn geïnstalleerd. Uitvoeren Connect-AzAccount
om u aan te melden.
# 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
Als u deze implementatie wilt testen, kunt u een sjabloon zoals deze gebruiken om een functie-app in Windows te maken in een verbruiksabonnement.
Volgende stappen
Meer informatie over het ontwikkelen en configureren van Azure Functions.