Snabbstart: Skalningstjänster som distribueras med azd Python-webbmallar med Bicep
Med Python-webbmallarna azd
kan du snabbt skapa ett nytt webbprogram och distribuera det till Azure. Mallarna azd
har utformats för att använda azure-tjänstalternativ till låg kostnad. Utan tvekan vill du justera tjänstnivåerna (eller sku:erna) för var och en av de tjänster som definierats i mallen för ditt scenario.
I den här snabbstarten uppdaterar du lämpliga bicep-mallfiler för att skala upp befintliga tjänster och lägga till nya tjänster i distributionen. Sedan kör azd provision
du kommandot och visar den ändring du gjorde i Azure-distributionen.
Förutsättningar
En Azure-prenumeration – Skapa en kostnadsfritt
Du måste ha följande installerat på den lokala datorn:
- Azure Developer CLI
- Docker Desktop
- Visual Studio Code
- Dev Container-tillägg
- Visual Studio Code Bicep Det här tillägget hjälper dig att skapa Bicep-syntax.
Distribuera en mall
Till att börja med behöver du en fungerande azd
distribution. När du har det på plats kan du ändra de Bicep-filer som genereras av mallen azd
.
Följ steg 1 till 7 i snabbstartsartikeln. I steg 2 använder du mallen
azure-django-postgres-flexible-appservice
. Här är hela sekvensen med kommandon som ska utfärdas från kommandoraden för enkelhetens skull:mkdir azdtest cd azdtest azd init --template azure-django-postgres-flexible-appservice azd auth login azd up
När du är
azd up
klar öppnar du Azure-portalen, navigerar till Azure App Service som har distribuerats i din nya resursgrupp och noterar prisplanen för App Service (se apptjänstplanens översiktssida, essentials-avsnittet "Prisplan"-värde).I steg 1 i snabbstartsartikeln instruerades du att skapa mappen azdtest . Öppna mappen i Visual Studio Code.
I fönstret Utforskaren navigerar du till mappen infra . Observera undermapparna och filerna i infra-mappen.
Filen main.bicep samordnar skapandet av alla tjänster som distribueras när du utför en
azd up
ellerazd provision
. Den anropar till andra filer, till exempel db.bicep och web.bicep, som i sin tur anropar till filer som finns i undermappen \core .Undermappen \core är en djupt kapslad mappstruktur som innehåller bicep-mallar för många Azure-tjänster. Några av filerna i undermappen \core refereras till av de tre bicep-filerna på toppnivå (main.bicep, db.bicep och web.bicep) och vissa används inte alls i det här projektet.
Skala en tjänst genom att ändra dess Bicep-egenskaper
Du kan skala en befintlig resurs i distributionen genom att ändra dess SKU. För att demonstrera detta ändrar du App Service-planen från "Basic Service Plan" (som är utformad för appar med lägre trafikkrav och inte behöver avancerade funktioner för automatisk skalning och trafikhantering) till "Standard Service Plan", som är utformad för att köra produktionsarbetsbelastningar.
Kommentar
Det går inte att göra alla SKU-ändringar i efterhand. Viss forskning kan vara nödvändig för att bättre förstå dina skalningsalternativ.
Öppna filen web.bicep och leta upp moduldefinitionen
appService
. I synnerhet letar du efter egenskapsinställningen:sku: { name: 'B1' }
Ändra värdet från
B1
tillS1
enligt följande:sku: { name: 'S1' }
Viktigt!
Som ett resultat av denna förändring kommer priset per timme att öka något. Information om de olika tjänstplanerna och tillhörande kostnader finns på apptjänstens prissida.
Förutsatt att du redan har distribuerat programmet i Azure använder du följande kommando för att distribuera ändringar i infrastrukturen utan att distribuera om själva programkoden.
azd provision
Du bör inte uppmanas att ange en plats och prenumeration. Dessa värden sparas i filen .azure<environment-name.env> där
<environment-name>
är det miljönamn som du angav underazd init
.När
azd provision
det är klart bekräftar du att webbprogrammet fortfarande fungerar. Leta också upp App Service-planen för resursgruppen och bekräfta att prisplanen är inställd på Standard Service Plan (S1).
Lägga till en ny tjänstdefinition med Bicep
Du kan lägga till en ny resurs i distributionen genom att göra större ändringar i Bicep i projektet. För att demonstrera detta lägger du till en instans av Azure Cache for Redis i din befintliga distribution inför en fiktiv ny funktion som du planerar att lägga till vid ett senare tillfälle.
Viktigt!
Som ett resultat av den här ändringen kommer du att betala för en instans av Azure Cache for Redis tills du tar bort resursen i Azure-portalen eller använder azd down
. Information om de olika tjänstplanerna och tillhörande kostnader finns på prissidan för Azure Cache for Redis.
Skapa en ny fil i infra-mappen med namnet redis.bicep. Kopiera och klistra in följande kod i den nya filen:
param name string param location string = resourceGroup().location param tags object = {} param keyVaultName string param connStrKeyName string param passwordKeyName string param primaryKeyKeyName string @allowed([ 'Enabled' 'Disabled' ]) param publicNetworkAccess string = 'Enabled' @allowed([ 'C' 'P' ]) param skuFamily string = 'C' @allowed([ 0 1 2 3 4 5 6 ]) param skuCapacity int = 1 @allowed([ 'Basic' 'Standard' 'Premium' ]) param skuName string = 'Standard' param saveKeysToVault bool = true resource redis 'Microsoft.Cache/redis@2020-12-01' = { name: name location: location properties: { sku: { capacity: skuCapacity family: skuFamily name: skuName } publicNetworkAccess: publicNetworkAccess enableNonSslPort: true } tags: tags } resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = { name: keyVaultName } resource redisKey 'Microsoft.KeyVault/vaults/secrets@2022-07-01' = if (saveKeysToVault) { name: primaryKeyKeyName parent: keyVault properties: { value: redis.listKeys().primaryKey } } resource redisConnStr 'Microsoft.KeyVault/vaults/secrets@2018-02-14' = if (saveKeysToVault) { name: connStrKeyName parent: keyVault properties: { value: '${name}.redis.cache.windows.net,abortConnect=false,ssl=true,password=${redis.listKeys().primaryKey}' } } resource redisPassword 'Microsoft.KeyVault/vaults/secrets@2018-02-14' = if (saveKeysToVault) { name: passwordKeyName parent: keyVault properties: { value: redis.listKeys().primaryKey } } output REDIS_ID string = redis.id output REDIS_HOST string = redis.properties.hostName
Ändra filen main.bicep för att skapa en instans av "redis"-resursen.
I filen main.bicep lägger du till följande kod under de avslutande klammerparenteser som är associerade med webbklientdelen och ovanför avsnittet hemligheter.
// Caching server module redis 'redis.bicep' = { name: 'redis' scope: resourceGroup params: { name: replace('${take(prefix, 19)}-rds', '--', '-') location: location tags: tags keyVaultName: keyVault.outputs.name connStrKeyName: 'RedisConnectionString' passwordKeyName: 'RedisPassword' primaryKeyKeyName: 'RedisPrimaryKey' publicNetworkAccess: 'Enabled' skuFamily: 'C' skuCapacity: 1 skuName: 'Standard' saveKeysToVault: true } }
Lägg till utdatavärden längst ned i filen:
output REDIS_ID string = redis.outputs.REDIS_ID output REDIS_HOST string = redis.outputs.REDIS_HOST
Bekräfta att hela filen main.bicep är identisk med följande kod:
targetScope = 'subscription' @minLength(1) @maxLength(64) @description('Name which is used to generate a short unique hash for each resource') param name string @minLength(1) @description('Primary location for all resources') param location string @secure() @description('DBServer administrator password') param dbserverPassword string @secure() @description('Secret Key') param secretKey string @description('Id of the user or app to assign application roles') param principalId string = '' var resourceToken = toLower(uniqueString(subscription().id, name, location)) var prefix = '${name}-${resourceToken}' var tags = { 'azd-env-name': name } resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = { name: '${name}-rg' location: location tags: tags } // Store secrets in a keyvault module keyVault './core/security/keyvault.bicep' = { name: 'keyvault' scope: resourceGroup params: { name: '${take(replace(prefix, '-', ''), 17)}-vault' location: location tags: tags principalId: principalId } } module db 'db.bicep' = { name: 'db' scope: resourceGroup params: { name: 'dbserver' location: location tags: tags prefix: prefix dbserverDatabaseName: 'relecloud' dbserverPassword: dbserverPassword } } // Monitor application with Azure Monitor module monitoring 'core/monitor/monitoring.bicep' = { name: 'monitoring' scope: resourceGroup params: { location: location tags: tags applicationInsightsDashboardName: '${prefix}-appinsights-dashboard' applicationInsightsName: '${prefix}-appinsights' logAnalyticsName: '${take(prefix, 50)}-loganalytics' // Max 63 chars } } // Web frontend module web 'web.bicep' = { name: 'web' scope: resourceGroup params: { name: replace('${take(prefix, 19)}-appsvc', '--', '-') location: location tags: tags applicationInsightsName: monitoring.outputs.applicationInsightsName keyVaultName: keyVault.outputs.name appCommandLine: 'entrypoint.sh' pythonVersion: '3.12' dbserverDomainName: db.outputs.dbserverDomainName dbserverUser: db.outputs.dbserverUser dbserverDatabaseName: db.outputs.dbserverDatabaseName } } // Caching server module redis 'redis.bicep' = { name: 'redis' scope: resourceGroup params: { name: replace('${take(prefix, 19)}-rds', '--', '-') location: location tags: tags keyVaultName: keyVault.outputs.name connStrKeyName: 'RedisConnectionString' passwordKeyName: 'RedisPassword' primaryKeyKeyName: 'RedisPrimaryKey' publicNetworkAccess: 'Enabled' skuFamily: 'C' skuCapacity: 1 skuName: 'Standard' saveKeysToVault: true } } var secrets = [ { name: 'DBSERVERPASSWORD' value: dbserverPassword } { name: 'SECRETKEY' value: secretKey } ] @batchSize(1) module keyVaultSecrets './core/security/keyvault-secret.bicep' = [for secret in secrets: { name: 'keyvault-secret-${secret.name}' scope: resourceGroup params: { keyVaultName: keyVault.outputs.name name: secret.name secretValue: secret.value } }] output AZURE_LOCATION string = location output AZURE_KEY_VAULT_ENDPOINT string = keyVault.outputs.endpoint output AZURE_KEY_VAULT_NAME string = keyVault.outputs.name output APPLICATIONINSIGHTS_NAME string = monitoring.outputs.applicationInsightsName output BACKEND_URI string = web.outputs.uri output REDIS_ID string = redis.outputs.REDIS_ID output REDIS_HOST string = redis.outputs.REDIS_HOST
Kontrollera att alla ändringar har sparats och använd sedan följande kommando för att uppdatera dina etablerade resurser i Azure:
azd provision
Kommentar
Beroende på många faktorer kan det ta lång tid att lägga till en instans av Azure Cache for Redis i den befintliga distributionen. I testningen upplevde vi körningstider på över 20 minuter. Så länge du inte ser några fel kan du låta processen fortsätta tills den är klar.
När
azd provision
du är klar öppnar du Azure-portalen, navigerar till resursgruppen för distributionen och i listan över tjänster bekräftas att du nu har en instans av Azure Cache for Redis.
Detta avslutar snabbstarten, men det finns många Azure-tjänster som kan hjälpa dig att skapa mer skalbara och produktionsklara program. Ett bra ställe att börja på är att lära dig mer om Azure API Management, Azure Front Door, Azure CDN och Azure Virtual Network för att nämna några.
Rensa resurser
Rensa resurserna som skapas av mallen genom att köra kommandot azd down .
azd down
Kommandot azd down
tar bort Azure-resurserna och GitHub Actions-arbetsflödet. När du uppmanas till det godkänner du att alla resurser som är associerade med resursgruppen tas bort.
Du kan också ta bort mappen azdtest eller använda den som grund för ditt eget program genom att ändra filerna i projektet.
Relaterat innehåll
- Läs mer om Python-webbmallar
azd
- Läs mer om kommandona
azd
. - Lär dig vad var och en av mapparna och filerna i projektet gör och vad du kan redigera eller ta bort?
- Uppdatera Bicep-mallarna för att lägga till eller ta bort Azure-tjänster. Känner du inte Bicep? Prova den här utbildningsvägen: Grunderna i Bicep
- Använd
azd
för att konfigurera en Ci/CD-pipeline för GitHub Actions för omdistribuering vid sammanslagning till huvudgren - Konfigurera övervakning så att du kan övervaka din app med hjälp av Azure Developer CLI