Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questo articolo, si utilizza Bicep per creare un'app per le funzioni in un piano Flex Consumption di Azure, insieme alle risorse Azure necessarie. L'app per le funzioni fornisce un contesto di esecuzione serverless per le esecuzioni del codice della funzione. L'app usa l'ID Microsoft Entra con identità gestite per connettersi ad altre risorse di Azure.
Le procedure illustrate in questa guida di avvio rapido comportano l'addebito di qualche centesimo (USD) o meno nell'account Azure.
Bicep è un linguaggio specifico del dominio (DSL) che usa la sintassi dichiarativa per distribuire le risorse di Azure. Offre sintassi concisa, sicurezza dei tipi affidabile e supporto per il riutilizzo del codice. Bicep offre la migliore esperienza di creazione per le soluzioni di infrastruttura come codice in Azure.
Dopo aver creato l'app per le funzioni, è possibile distribuire il codice del progetto di Funzioni di Azure in tale app. Un passaggio finale della distribuzione del codice non rientra nell'ambito di questo articolo di avvio rapido.
Prerequisiti
Account Azure
Prima di iniziare, è necessario disporre di un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
Esaminare il file Bicep
Il file Bicep usato in questa guida introduttiva proviene da un modello di avvio rapido di Azure.
/* 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'
}
}
}
Questo file di distribuzione crea queste risorse di Azure necessarie per un'app per le funzioni che si connette in modo sicuro ai servizi di Azure:
- Microsoft.Web/sites: crea l'app per le funzioni.
- Microsoft.Web/serverfarms: crea un piano di hosting Flex Consumption serverless per l'app.
- Microsoft.Storage/storageAccounts: crea un account di archiviazione di Azure, richiesto da Funzioni.
- Microsoft.Insights/components: crea un'istanza di Application Insights per il monitoraggio dell'app.
- Microsoft.OperationalInsights/workspaces: crea un'area di lavoro richiesta da Application Insights.
- Microsoft.ManagedIdentity/userAssignedIdentities: crea un'identità gestita assegnata dall'utente usata dall'app per l'autenticazione con altri servizi di Azure tramite Microsoft Entra.
- Microsoft.Authorization/roleAssignments: crea assegnazioni di ruolo all'identità gestita assegnata dall'utente, che forniscono all'app l'accesso con privilegi minimi durante la connessione ad altri servizi di Azure.
Considerazioni sulla distribuzione:
- L'account di archiviazione viene usato per archiviare dati importanti dell'app, incluso il pacchetto di distribuzione del codice dell'applicazione. Questa distribuzione crea un account di archiviazione a cui si accede usando l'autenticazione e le identità gestite di Microsoft Entra ID. L'accesso alle identità viene concesso in base alle autorizzazioni minime.
- Per impostazione predefinita, il file Bicep crea un'app C# che usa .NET 8 in un processo isolato. Per altre lingue, usare i
functionAppRuntimeparametri efunctionAppRuntimeVersionper specificare la lingua e la versione specifiche in cui eseguire l'app. Assicurarsi di selezionare il linguaggio di programmazione nella parte superiore dell'articolo.
Distribuire il file Bicep
Salvare il file Bicep come main.bicep nel computer locale.
Distribuire il file Bicep usando l'interfaccia della riga di comando di Azure o Azure PowerShell.
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.4In questo esempio sostituire
<SUPPORTED_REGION>con un'area che supporta il piano Flex Consumption.Al termine della distribuzione, visualizzerai un messaggio che indica che la distribuzione è stata completata.
Convalidare la distribuzione
Usare l'interfaccia della riga di comando di Azure o Azure PowerShell per convalidare la distribuzione.
az resource list --resource-group exampleRG
Visitare la pagina iniziale dell'app per le funzioni
Usare l'output del passaggio di convalida precedente per recuperare il nome univoco creato per l'app per le funzioni.
Aprire un browser e immettere l'URL seguente: <https://<appName.azurewebsites.net>. Assicurarsi di sostituire <\appName> con il nome univoco creato per l'app per le funzioni.
Quando si visita l'URL, verrà visualizzata una pagina simile alla seguente:
Pulire le risorse
Ora che è stata distribuita un'app per le funzioni e le risorse correlate in Azure, è possibile continuare con il passaggio successivo della pubblicazione del codice del progetto nell'app. In caso contrario, usare questi comandi per eliminare le risorse, quando non sono più necessarie.
az group delete --name exampleRG
È anche possibile rimuovere le risorse usando il portale di Azure.
Passaggi successivi
È ora possibile distribuire un progetto di codice nelle risorse dell'app per le funzioni create in Azure.
È possibile creare, verificare e distribuire un progetto di codice nella nuova app per le funzioni da questi ambienti locali: