Delen via


Quickstart: Services schalen die zijn geïmplementeerd met de azd Python-websjablonen met bicep

Met de Python-websjablonen azd kunt u snel een nieuwe webtoepassing maken en deze implementeren in Azure. De azd sjablonen zijn ontworpen voor het gebruik van goedkope Azure-serviceopties. Ongetwijfeld wilt u de serviceniveaus (of SKU's) aanpassen voor elk van de services die in de sjabloon zijn gedefinieerd voor uw scenario.

In deze quickstart werkt u de juiste bicep-sjabloonbestanden bij om bestaande services op te schalen en nieuwe services toe te voegen aan uw implementatie. Vervolgens voert u de azd provision opdracht uit en bekijkt u de wijziging die u hebt aangebracht in de Azure-implementatie.

Vereisten

Een Azure-abonnement - Een gratis abonnement maken

U moet het volgende op uw lokale computer hebben geïnstalleerd:

Een sjabloon implementeren

Om te beginnen hebt u een werkende azd implementatie nodig. Zodra u deze hebt ingesteld, kunt u de Bicep-bestanden wijzigen die door de azd sjabloon zijn gegenereerd.

  1. Volg stap 1 tot en met 7 in het quickstart-artikel. Gebruik in stap 2 de azure-django-postgres-flexible-appservice sjabloon. Voor uw gemak vindt u hier de volledige reeks opdrachten die u vanaf de opdrachtregel kunt uitgeven:

    mkdir azdtest
    cd azdtest
    azd init --template azure-django-postgres-flexible-appservice
    azd auth login
    azd up
    

    Zodra azd up dit is voltooid, opent u Azure Portal, gaat u naar de Azure-app Service die is geïmplementeerd in uw nieuwe resourcegroep en noteert u het App Service-prijsplan (zie de pagina Overzicht van het App Service-plan, de sectie Essentials, de waarde van het prijsplan).

  2. In stap 1 van het quickstart-artikel hebt u de opdracht gekregen om de map azdtest te maken. Open die map in Visual Studio Code.

  3. Navigeer in het deelvenster Explorer naar de inframap . Bekijk de submappen en bestanden in de inframap .

    Het bestand main.bicep organiseert het maken van alle services die zijn geïmplementeerd bij het uitvoeren van een azd up of azd provision. Het roept andere bestanden aan, zoals db.bicep en web.bicep, die op hun beurt worden aangeroepen in bestanden die zijn opgenomen in de submap \core .

    De submap \core is een diep geneste mapstructuur met bicep-sjablonen voor veel Azure-services. Naar sommige bestanden in de submap \core wordt verwezen door de drie bicep-bestanden op het hoogste niveau (main.bicep, db.bicep en web.bicep) en sommige worden helemaal niet gebruikt in dit project.

Een service schalen door de Bicep-eigenschappen te wijzigen

U kunt een bestaande resource in uw implementatie schalen door de bijbehorende SKU te wijzigen. Om dit te laten zien, wijzigt u het App Service-plan van het Basic Service-plan (dat is ontworpen voor apps met lagere verkeersvereisten en hebt u geen geavanceerde functies voor automatisch schalen en verkeersbeheer nodig) in het Standard Service-plan, dat is ontworpen voor het uitvoeren van productieworkloads.

Notitie

Niet alle SKU-wijzigingen kunnen na het feit worden aangebracht. Sommige onderzoeken zijn mogelijk nodig om meer inzicht te krijgen in uw schaalopties.

  1. Open het bestand web.bicep en zoek de appService moduledefinitie. Zoek met name naar de instelling van de eigenschap:

       sku: {
          name: 'B1'
       }
    

    Wijzig de waarde als volgt in B1S1 :

       sku: {
          name: 'S1'
       }
    

    Belangrijk

    Als gevolg van deze wijziging neemt de prijs per uur iets toe. Meer informatie over de verschillende serviceplannen en de bijbehorende kosten vindt u op de pagina met prijzen van App Service.

  2. Als u de toepassing al in Azure hebt geïmplementeerd, gebruikt u de volgende opdracht om wijzigingen in de infrastructuur te implementeren terwijl u de toepassingscode zelf niet opnieuw implementeert.

    azd provision
    

    U wordt niet gevraagd om een locatie en abonnement. Deze waarden worden opgeslagen in het .azure<environment-name.env-bestand>, waar <environment-name> de omgevingsnaam is die u hebt opgegeven tijdens azd init.

  3. Wanneer azd provision dit is voltooid, controleert u of uw webtoepassing nog steeds werkt. Zoek ook het App Service-plan voor uw resourcegroep en controleer of het prijsplan is ingesteld op het Standard Service Plan (S1).

Een nieuwe servicedefinitie toevoegen met Bicep

U kunt een nieuwe resource toevoegen aan uw implementatie door grotere wijzigingen aan te brengen in bicep in het project. Om dit te laten zien, voegt u een exemplaar van Azure Cache voor Redis toe aan uw bestaande implementatie ter voorbereiding op een fictieve nieuwe functie die u op een bepaalde toekomstige datum wilt toevoegen.

Belangrijk

Als gevolg van deze wijziging betaalt u voor een exemplaar van Azure Cache voor Redis totdat u de resource in Azure Portal verwijdert of gebruiktazd down. Meer informatie over de verschillende serviceplannen en de bijbehorende kosten vindt u op de pagina Azure Cache voor Redis prijzen.

  1. Maak een nieuw bestand in de inframap met de naam redis.bicep. Kopieer en plak de volgende code in het nieuwe bestand:

    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
    
  2. Wijzig het bestand main.bicep om een exemplaar van de redis-resource te maken.

    Voeg in het bestand main.bicep de volgende code toe onder de afsluitende accolades die zijn gekoppeld aan de webfront-endsectie en boven de sectie geheimen .

    // 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
      }
    }
    
  3. Uitvoerwaarden toevoegen aan de onderkant van het bestand:

    output REDIS_ID string = redis.outputs.REDIS_ID
    output REDIS_HOST string = redis.outputs.REDIS_HOST
    
  4. Controleer of het volledige bestand main.bicep identiek is aan de volgende code:

    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
    
  5. Zorg ervoor dat al uw wijzigingen zijn opgeslagen en gebruik vervolgens de volgende opdracht om uw ingerichte resources in Azure bij te werken:

    azd provision
    

    Notitie

    Afhankelijk van veel factoren kan het toevoegen van een exemplaar van Azure Cache voor Redis aan de bestaande implementatie lang duren. Tijdens het testen hebben we uitvoeringstijden van meer dan 20 minuten ervaren. Zolang u geen fouten ziet, staat u toe dat het proces wordt voortgezet totdat het is voltooid.

  6. Wanneer azd provision dit is voltooid, opent u Azure Portal, gaat u naar de resourcegroep voor uw implementatie en controleert u in de lijst met services of u nu een exemplaar van Azure Cache voor Redis hebt.

Hiermee wordt de quickstart afgerond, maar er zijn veel Azure-services waarmee u schaalbare en productieklare toepassingen kunt bouwen. Een goede plek om te beginnen is om meer te weten te komen over Azure API Management, Azure Front Door, Azure CDN en Azure Virtual Network, om er een paar te noemen.

Resources opschonen

Schoon de resources op die door de sjabloon zijn gemaakt door de opdracht azd down uit te voeren.

azd down

Met azd down de opdracht worden de Azure-resources en de GitHub Actions-werkstroom verwijderd. Wanneer u hierom wordt gevraagd, gaat u akkoord met het verwijderen van alle resources die zijn gekoppeld aan de resourcegroep.

U kunt ook de map azdtest verwijderen of gebruiken als basis voor uw eigen toepassing door de bestanden van het project te wijzigen.