Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel verwenden Sie Bicep, um eine Funktions-App in einem Flex-Verbrauchsplan in Azure zusammen mit den erforderlichen Azure-Ressourcen zu erstellen. Die Funktions-App stellt einen serverlosen Ausführungskontext für Ihre Funktionscodeausführungen bereit. Die App verwendet Microsoft Entra-ID mit verwalteten Identitäten, um eine Verbindung mit anderen Azure-Ressourcen herzustellen.
Im Rahmen dieser Schnellstartanleitung fallen in Ihrem Azure-Konto ggf. geringfügige Kosten im Centbereich an.
Bicep ist eine domänenspezifische Sprache (Domain-Specific Language, DSL), die eine deklarative Syntax zur Bereitstellung von Azure-Ressourcen verwendet. Sie bietet eine präzise Syntax, zuverlässige Typsicherheit und Unterstützung für die Wiederverwendung von Code. Bicep bietet die beste Form der Erstellung für Ihre Infrastructure-as-Code-Lösungen in Azure.
Nachdem Sie die Funktions-App erstellt haben, können Sie Ihren Azure Functions-Projektcode in dieser App bereitstellen. Ein abschließender Codebereitstellungsschritt liegt außerhalb des Umfangs dieses Schnellstartartikels.
Voraussetzungen
Azure-Konto
Bevor Sie beginnen, müssen Sie über ein Azure-Konto mit einem aktiven Abonnement verfügen. Sie können kostenlos ein Konto erstellen.
Überprüfen der Bicep-Datei
Die in dieser Schnellstartanleitung verwendete Bicep-Datei stammt aus einer Azure-Schnellstartvorlage.
/* This Bicep file creates a function app running in a Flex Consumption plan
that connects to Azure Storage by using managed identities with Microsoft Entra ID. */
//********************************************
// Parameters
//********************************************
@description('Primary region for all Azure resources.')
@minLength(1)
param location string = resourceGroup().location
@description('Language runtime used by the function app.')
@allowed(['dotnet-isolated','python','java', 'node', 'powerShell'])
param functionAppRuntime string = 'dotnet-isolated' //Defaults to .NET isolated worker
@description('Target language version used by the function app.')
@allowed(['3.10','3.11', '7.4', '8.0', '9.0', '10', '11', '17', '20'])
param functionAppRuntimeVersion string = '8.0' //Defaults to .NET 8.
@description('The maximum scale-out instance count limit for the app.')
@minValue(40)
@maxValue(1000)
param maximumInstanceCount int = 100
@description('The memory size of instances used by the app.')
@allowed([2048,4096])
param instanceMemoryMB int = 2048
@description('A unique token used for resource name generation.')
@minLength(3)
param resourceToken string = toLower(uniqueString(subscription().id, location))
@description('A globally unique name for your deployed function app.')
param appName string = 'func-${resourceToken}'
//********************************************
// Variables
//********************************************
// Generates a unique container name for deployments.
var deploymentStorageContainerName = 'app-package-${take(appName, 32)}-${take(resourceToken, 7)}'
// Key access to the storage account is disabled by default
var storageAccountAllowSharedKeyAccess = false
// Define the IDs of the roles we need to assign to our managed identities.
var storageBlobDataOwnerRoleId = 'b7e6dc6d-f1e8-4753-8033-0f276bb0955b'
var storageBlobDataContributorRoleId = 'ba92f5b4-2d11-453d-a403-e96b0029c9fe'
var storageQueueDataContributorId = '974c5e8b-45b9-4653-ba55-5f855dd0fb88'
var storageTableDataContributorId = '0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3'
var monitoringMetricsPublisherId = '3913510d-42f4-4e42-8a64-420c390055eb'
//********************************************
// Azure resources required by your function app.
//********************************************
resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2023-09-01' = {
name: 'log-${resourceToken}'
location: location
properties: any({
retentionInDays: 30
features: {
searchVersion: 1
}
sku: {
name: 'PerGB2018'
}
})
}
resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
name: 'appi-${resourceToken}'
location: location
kind: 'web'
properties: {
Application_Type: 'web'
WorkspaceResourceId: logAnalytics.id
DisableLocalAuth: true
}
}
resource storage 'Microsoft.Storage/storageAccounts@2023-05-01' = {
name: 'st${resourceToken}'
location: location
kind: 'StorageV2'
sku: { name: 'Standard_LRS' }
properties: {
accessTier: 'Hot'
allowBlobPublicAccess: false
allowSharedKeyAccess: storageAccountAllowSharedKeyAccess
dnsEndpointType: 'Standard'
minimumTlsVersion: 'TLS1_2'
networkAcls: {
bypass: 'AzureServices'
defaultAction: 'Allow'
}
publicNetworkAccess: 'Enabled'
}
resource blobServices 'blobServices' = {
name: 'default'
properties: {
deleteRetentionPolicy: {}
}
resource deploymentContainer 'containers' = {
name: deploymentStorageContainerName
properties: {
publicAccess: 'None'
}
}
}
}
resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
name: 'uai-data-owner-${resourceToken}'
location: location
}
resource roleAssignmentBlobDataOwner 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(subscription().id, storage.id, userAssignedIdentity.id, 'Storage Blob Data Owner')
scope: storage
properties: {
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', storageBlobDataOwnerRoleId)
principalId: userAssignedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
resource roleAssignmentBlob 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(subscription().id, storage.id, userAssignedIdentity.id, 'Storage Blob Data Contributor')
scope: storage
properties: {
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', storageBlobDataContributorRoleId)
principalId: userAssignedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
resource roleAssignmentQueueStorage 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(subscription().id, storage.id, userAssignedIdentity.id, 'Storage Queue Data Contributor')
scope: storage
properties: {
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', storageQueueDataContributorId)
principalId: userAssignedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
resource roleAssignmentTableStorage 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(subscription().id, storage.id, userAssignedIdentity.id, 'Storage Table Data Contributor')
scope: storage
properties: {
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', storageTableDataContributorId)
principalId: userAssignedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
resource roleAssignmentAppInsights 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(subscription().id, applicationInsights.id, userAssignedIdentity.id, 'Monitoring Metrics Publisher')
scope: applicationInsights
properties: {
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', monitoringMetricsPublisherId)
principalId: userAssignedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
//********************************************
// Function app and Flex Consumption plan definitions
//********************************************
resource appServicePlan 'Microsoft.Web/serverfarms@2024-04-01' = {
name: 'plan-${resourceToken}'
location: location
kind: 'functionapp'
sku: {
tier: 'FlexConsumption'
name: 'FC1'
}
properties: {
reserved: true
}
}
resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
name: appName
location: location
kind: 'functionapp,linux'
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${userAssignedIdentity.id}':{}
}
}
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
siteConfig: {
minTlsVersion: '1.2'
}
functionAppConfig: {
deployment: {
storage: {
type: 'blobContainer'
value: '${storage.properties.primaryEndpoints.blob}${deploymentStorageContainerName}'
authentication: {
type: 'UserAssignedIdentity'
userAssignedIdentityResourceId: userAssignedIdentity.id
}
}
}
scaleAndConcurrency: {
maximumInstanceCount: maximumInstanceCount
instanceMemoryMB: instanceMemoryMB
}
runtime: {
name: functionAppRuntime
version: functionAppRuntimeVersion
}
}
}
resource configAppSettings 'config' = {
name: 'appsettings'
properties: {
AzureWebJobsStorage__accountName: storage.name
AzureWebJobsStorage__credential : 'managedidentity'
AzureWebJobsStorage__clientId: userAssignedIdentity.properties.clientId
APPINSIGHTS_INSTRUMENTATIONKEY: applicationInsights.properties.InstrumentationKey
APPLICATIONINSIGHTS_AUTHENTICATION_STRING: 'ClientId=${userAssignedIdentity.properties.clientId};Authorization=AAD'
}
}
}
Diese Bereitstellungsdatei erstellt diese Azure-Ressourcen, die von einer Funktions-App benötigt werden, die sicher eine Verbindung mit Azure-Diensten herstellt:
- Microsoft.Web/sites: erstellt Ihre Funktions-App.
- Microsoft.Web/serverfarms: erstellt einen serverlosen Flex-Verbrauch-Hostingplan für Ihre App.
- Microsoft.Storage/storageAccounts: erstellt ein Azure Storage-Konto, das von Funktionen benötigt wird.
- Microsoft.Insights/Components: Erstellt eine Application Insights-Instanz für die Überwachung Ihrer App.
- Microsoft.OperationalInsights/workspaces: Erstellt einen Arbeitsbereich, der von Application Insights benötigt wird.
- Microsoft.ManagedIdentity/userAssignedIdentities: Erstellt eine vom Benutzer zugewiesene verwaltete Identität, die von der App verwendet wird, um sich mit anderen Azure-Diensten mithilfe von Microsoft Entra zu authentifizieren.
- Microsoft.Authorization/roleAssignments: Erstellt Rollenzuweisungen für die vom Benutzer zugewiesene verwaltete Identität, die der App beim Herstellen einer Verbindung mit anderen Azure-Diensten den Zugriff mit den geringsten Berechtigungen ermöglicht.
Überlegungen zur Bereitstellung:
- Das Speicherkonto wird verwendet, um wichtige App-Daten zu speichern, einschließlich des Anwendungscodebereitstellungspakets. Diese Bereitstellung erstellt ein Speicherkonto, auf das mithilfe der Microsoft Entra ID-Authentifizierung und verwalteten Identitäten zugegriffen wird. Der Identitätszugriff wird gemäß dem Prinzip der minimalen Zugriffsrechte gewährt.
- Die Bicep-Datei erstellt standardmäßig eine C#-App, die .NET 8 in einem isolierten Prozess verwendet. Verwenden Sie für andere Sprachen die
functionAppRuntimeundfunctionAppRuntimeVersionDie Parameter, um die spezifische Sprache und Version anzugeben, für die Ihre App ausgeführt werden soll. Stellen Sie sicher, dass Sie ihre Programmiersprache oben im Artikel auswählen.
Bereitstellen der Bicep-Datei
Speichern Sie die Bicep-Datei als main.bicep auf Ihrem lokalen Computer.
Stellen Sie die Bicep-Datei entweder mit Azure CLI oder mit Azure PowerShell bereit.
az group create --name exampleRG --location <SUPPORTED_REGION> az deployment group create --resource-group exampleRG --template-file main.bicep --parameters functionAppRuntime=dotnet-isolated functionAppRuntimeVersion=8.0az group create --name exampleRG --location <SUPPORTED_REGION> az deployment group create --resource-group exampleRG --template-file main.bicep --parameters functionAppRuntime=java functionAppRuntimeVersion=17az group create --name exampleRG --location <SUPPORTED_REGION> az deployment group create --resource-group exampleRG --template-file main.bicep --parameters functionAppRuntime=node functionAppRuntimeVersion=20az group create --name exampleRG --location <SUPPORTED_REGION> az deployment group create --resource-group exampleRG --template-file main.bicep --parameters functionAppRuntime=python functionAppRuntimeVersion=3.11az group create --name exampleRG --location <SUPPORTED_REGION> az deployment group create --resource-group exampleRG --template-file main.bicep --parameters functionAppRuntime=powerShell functionAppRuntimeVersion=7.4Ersetzen Sie
<SUPPORTED_REGION>in diesem Beispiel durch eine Region, die den Flex-Verbrauchsplan unterstützt.Nach Abschluss der Bereitstellung sollte eine Meldung mit dem Hinweis angezeigt werden, dass die Bereitstellung erfolgreich war.
Überprüfen der Bereitstellung
Verwenden Sie die Azure CLI oder Azure PowerShell, um die Bereitstellung zu überprüfen.
az resource list --resource-group exampleRG
Aufrufen der Willkommensseite der Funktions-App
Verwenden Sie die Ausgabe aus dem vorherigen Überprüfungsschritt, um den eindeutigen Namen abzurufen, der für Ihre Funktions-App erstellt wurde.
Öffnen Sie einen Browser, und geben Sie die folgende URL ein: <https://< appName.azurewebsites.net>. Stellen Sie sicher, dass <\appName> durch den eindeutigen Namen ersetzt wird, der für Ihre Funktions-App erstellt wurde.
Wenn Sie die URL aufrufen, sollte eine Seite wie die Folgende angezeigt werden:
Bereinigen von Ressourcen
Nachdem Sie nun eine Funktions-App und zugehörige Ressourcen für Azure bereitgestellt haben, können Sie den nächsten Schritt des Veröffentlichens von Projektcode in Ihrer App fortsetzen. Verwenden Sie andernfalls diese Befehle, um die Ressourcen zu löschen, wenn Sie sie nicht mehr benötigen.
az group delete --name exampleRG
Sie können Ressourcen auch über das Azure-Portal entfernen.
Nächste Schritte
Sie können jetzt ein Codeprojekt für die Funktionen-App-Ressourcen bereitstellen, die Sie in Azure erstellt haben.
Sie können ein Codeprojekt aus diesen lokalen Umgebungen in Ihrer neuen Funktions-App erstellen, überprüfen und bereitstellen: