Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ebben a cikkben a Bicep használatával hoz létre függvényalkalmazást az Azure-ban egy Rugalmas Fogyasztási tervben, valamint a szükséges Azure-erőforrásokat. A függvényalkalmazás kiszolgáló nélküli végrehajtási környezetet biztosít a függvénykód végrehajtásához. Az alkalmazás felügyelt identitásokkal rendelkező Microsoft Entra-azonosítót használ más Azure-erőforrásokhoz való csatlakozáshoz.
A rövid útmutató elvégzése néhány cent (USD) vagy még kevesebb költséggel jár az Azure-fiókját illetően.
A Bicep tartományspecifikus nyelv (DSL), amely deklaratív szintaxist használ az Azure-erőforrások üzembe helyezéséhez. Tömör szintaxist és megbízható típusbiztonságot kínál, valamint biztosítja a kódok újrafelhasználhatóságát. A Bicep a legjobb szerzői élményt nyújtja az Azure-beli infrastruktúra-kódmegoldásokhoz.
A függvényalkalmazás létrehozása után üzembe helyezheti az Azure Functions-projektkódot az adott alkalmazásban. A kód utolsó üzembe helyezési lépése kívül esik a rövid útmutatóban szereplő cikk hatókörén.
Előfeltételek
Azure-fiók
Mielőtt hozzákezdene, rendelkeznie kell egy aktív előfizetéssel rendelkező Azure-fiókkal. Fiók ingyenes létrehozása.
A Bicep-fájl áttekintése
Az ebben a rövid útmutatóban használt Bicep-fájl egy Azure Gyorsindítási sablonból származik.
/* 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'
}
}
}
Ez az üzembe helyezési fájl létrehozza a függvényalkalmazás által igényelt Azure-erőforrásokat, amelyek biztonságosan csatlakoznak az Azure-szolgáltatásokhoz:
- Microsoft.Web/sites: létrehozza a függvényalkalmazást.
- Microsoft.Web/serverfarms: létrehoz egy kiszolgáló nélküli Flex Consumption üzemeltetési csomagot az alkalmazáshoz.
- Microsoft.Storage/StorageAccounts: létrehoz egy Azure Storage-fiókot, amelyet a Functions igényel.
- Microsoft.Insights/components: Létrehoz egy Application Insights-példányt az alkalmazás figyeléséhez.
- Microsoft.OperationalInsights/workspaces: létrehoz egy, az Application Insights által igényelt munkaterületet.
- Microsoft.ManagedIdentity/userAssignedIdentities: létrehoz egy felhasználó által hozzárendelt felügyelt identitást, amelyet az alkalmazás más Azure-szolgáltatásokkal való hitelesítésre használ a Microsoft Entra használatával.
- Microsoft.Authorization/roleAssignments: szerepkör-hozzárendeléseket hoz létre a felhasználó által hozzárendelt felügyelt identitáshoz, amelyek minimális jogosultsági hozzáférést biztosítanak az alkalmazásnak más Azure-szolgáltatásokhoz való csatlakozáskor.
Üzembe helyezési szempontok:
- A tárfiók fontos alkalmazásadatok tárolására szolgál, beleértve az alkalmazáskód üzembehelyezési csomagját is. Ez az üzembe helyezés létrehoz egy tárfiókot, amely a Microsoft Entra ID-hitelesítés és a felügyelt identitások használatával érhető el. Az identitáshoz való hozzáférés minimális engedélyekkel történik.
- A Bicep-fájl alapértelmezés szerint egy .NET 8-at használó C#-alkalmazást hoz létre izolált folyamatban. Más nyelvek esetén a
functionAppRuntimeésfunctionAppRuntimeVersionparaméterekkel adja meg az alkalmazás futtatásához használt nyelvet és verziót. Ügyeljen arra, hogy a cikk tetején válassza ki a programozási nyelvet.
A Bicep-fájl üzembe helyezése
Mentse a Bicep-fájlt main.bicep néven a helyi számítógépre.
Telepítse a Bicep-fájlt az Azure CLI vagy az Azure PowerShell használatával.
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.4Ebben a példában cserélje le
<SUPPORTED_REGION>a Flex Consumption csomagot támogató régióra.Amikor az üzembe helyezés befejeződött, egy üzenetnek kell megjelennie, amely jelzi, hogy az üzembe helyezés sikeres volt.
Az üzembe helyezés ellenőrzése
Az üzembe helyezés ellenőrzéséhez használja az Azure CLI-t vagy az Azure PowerShellt.
az resource list --resource-group exampleRG
A függvényalkalmazás kezdőlapjának megtekintése
Az előző ellenőrzési lépés kimenetével kérje le a függvényalkalmazáshoz létrehozott egyedi nevet.
Nyisson meg egy böngészőt, és adja meg a következő URL-címet: <https://< appName.azurewebsites.net>. Mindenképpen cserélje le <az \appName> nevet a függvényalkalmazáshoz létrehozott egyedi névre.
Amikor megtekinti az URL-címet, az alábbihoz hasonló lapnak kell megjelennie:
Az erőforrások eltávolítása
Most, hogy üzembe helyezett egy függvényalkalmazást és a kapcsolódó erőforrásokat az Azure-ban, folytathatja a projektkód alkalmazáson való közzétételének következő lépését. Ellenkező esetben ezekkel a parancsokkal törölheti az erőforrásokat, ha már nincs rájuk szüksége.
az group delete --name exampleRG
Az erőforrásokat az Azure Portalon is eltávolíthatja.
Következő lépések
Mostantól telepíthet egy kódprojektet az Azure-ban létrehozott függvényalkalmazás-erőforrásokra.
Kódprojektet hozhat létre, ellenőrizheti és helyezhet üzembe az új függvényalkalmazásban az alábbi helyi környezetekből: