Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule, za pomocą Bicep, utworzysz aplikację funkcji na platformie Azure w planie Flex Consumption wraz z niezbędnymi zasobami Azure. Aplikacja funkcji udostępnia kontekst wykonywania bezserwerowego na potrzeby wykonywania kodu funkcji. Aplikacja używa identyfikatora Entra firmy Microsoft z tożsamościami zarządzanymi w celu nawiązania połączenia z innymi zasobami platformy Azure.
Ukończenie tego przewodnika Szybki start wiąże się z naliczeniem niewielkiej opłaty w wysokości kilku centów USD lub mniej na koncie platformy Azure.
Bicep to język specyficzny dla domeny (DSL), który używa składni deklaratywnej do wdrażania zasobów platformy Azure. Zapewnia zwięzłą składnię, niezawodne bezpieczeństwo typów i obsługę ponownego użycia kodu. Bicep oferuje najlepsze środowisko tworzenia rozwiązań infrastruktury jako kodu na platformie Azure.
Po utworzeniu aplikacji funkcji możesz wdrożyć kod projektu usługi Azure Functions w tej aplikacji. Ostatni krok wdrażania kodu leży poza zakresem tego artykułu startowego.
Wymagania wstępne
Konto platformy Azure
Przed rozpoczęciem musisz mieć konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
Przejrzyj plik programu Bicep
Plik Bicep używany w tym przewodniku szybkiego startu pochodzi z szablonu szybkiego startu platformy 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'
}
}
}
Ten plik wdrożenia tworzy te zasoby platformy Azure wymagane przez aplikację funkcji, która bezpiecznie łączy się z usługami platformy Azure:
- Microsoft.Web/sites: tworzy aplikację funkcjonalną.
- Microsoft.Web/serverfarms: tworzy bezserwerowy plan hostingu Flex Consumption dla aplikacji.
- Microsoft.Storage/storageAccounts: tworzy konto usługi Azure Storage, które jest wymagane przez usługę Functions.
- Microsoft.Insights/components: tworzy wystąpienie usługi Application Insights do monitorowania aplikacji.
- Microsoft.OperationalInsights/workspaces: tworzy obszar roboczy wymagany przez usługę Application Insights.
- Microsoft.ManagedIdentity/userAssignedIdentities: tworzy tożsamość zarządzaną przypisaną przez użytkownika, która jest używana przez aplikację do uwierzytelniania w innych usługach platformy Azure przy użyciu usługi Microsoft Entra.
- Microsoft.Authorization/roleAssignments: tworzy przypisania ról do tożsamości zarządzanej przypisanej przez użytkownika, która zapewnia aplikacji dostęp z najniższymi uprawnieniami podczas nawiązywania połączenia z innymi usługami platformy Azure.
Zagadnienia dotyczące wdrażania:
- Konto magazynu służy do przechowywania ważnych danych aplikacji, w tym pakietu wdrażania kodu aplikacji. Wdrożenie to tworzy konto magazynowe, do którego dostęp uzyskuje się za pomocą uwierzytelniania Microsoft Entra ID oraz zarządzanych tożsamości. Dostęp do zasobów jest udzielany zgodnie z zasadą najmniejszych uprawnień.
- Plik Bicep domyślnie tworzy aplikację w języku C#, która używa platformy .NET 8 w izolowanym procesie. W przypadku innych języków użyj parametrów
functionAppRuntimeifunctionAppRuntimeVersion, aby określić konkretny język i wersję, w której ma być uruchamiana aplikacja. Pamiętaj, aby wybrać język programowania w górnej części artykułu.
Wdróż plik Bicep
Zapisz plik Bicep jako main.bicep na komputerze lokalnym.
Wdróż plik Bicep przy użyciu interfejsu wiersza polecenia platformy Azure lub programu 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.4W tym przykładzie zastąp
<SUPPORTED_REGION>regionem, który obsługuje plan Flex Consumption.Po zakończeniu wdrażania powinien zostać wyświetlony komunikat informujący o pomyślnym wdrożeniu.
Weryfikowanie wdrożenia
Użyj interfejsu wiersza polecenia platformy Azure lub programu Azure PowerShell, aby zweryfikować wdrożenie.
az resource list --resource-group exampleRG
Odwiedź stronę powitalną aplikacji funkcjonalnej
Użyj danych wyjściowych z poprzedniego kroku weryfikacji, aby pobrać unikatową nazwę utworzoną dla aplikacji funkcji.
Otwórz przeglądarkę i wprowadź następujący adres URL: <https://< appName.azurewebsites.net>. Upewnij się, że zastąpisz <\appName> unikalną nazwą stworzoną dla swojej aplikacji funkcji.
Podczas odwiedzania adresu URL powinna zostać wyświetlona strona podobna do następującej:
Czyszczenie zasobów
Po wdrożeniu aplikacji funkcji i powiązanych zasobów na platformie Azure możesz przejść do następnego kroku publikowania kodu projektu w aplikacji. W przeciwnym razie użyj tych poleceń, aby usunąć zasoby, gdy nie są już potrzebne.
az group delete --name exampleRG
Zasoby można również usunąć za pomocą portalu Azure.
Następne kroki
Teraz możesz wdrożyć projekt kodu w zasobach aplikacji funkcji utworzonych na platformie Azure.
Możesz utworzyć, zweryfikować i wdrożyć projekt kodu w nowej aplikacji funkcji z następujących środowisk lokalnych:
- Wiersz polecenia
- Visual Studio Code
- w programie Visual Studio