Sdílet prostřednictvím


Rychlý start: Škálování služeb nasazených pomocí webových šablon Pythonu azd pomocí Bicep

Webové azd šablony Pythonu umožňují rychle vytvořit novou webovou aplikaci a nasadit ji do Azure. Šablony azd byly navrženy tak, aby používaly nízkonákladové možnosti služeb Azure. Nepochybně budete chtít upravit úrovně služeb (nebo skladové položky) pro každou službu definovanou v šabloně pro váš scénář.

V tomto rychlém startu aktualizujete příslušné soubory šablon bicep, abyste vertikálně navýšit kapacitu stávajících služeb a přidali do nasazení nové služby. Pak spustíte azd provision příkaz a zobrazíte změnu, kterou jste provedli v nasazení Azure.

Požadavky

Předplatné Azure – Vytvoření předplatného zdarma

V místním počítači musíte mít nainstalovanou následující:

Nasazení šablony

Abyste mohli začít, potřebujete funkční azd nasazení. Jakmile ho budete mít, budete moct upravit soubory Bicep vygenerované šablonou azd .

  1. Postupujte podle kroků 1 až 7 v článku Rychlý start. V kroku 2 použijte azure-django-postgres-flexible-appservice šablonu. Pro usnadnění vašeho pohodlí tady je celá posloupnost příkazů, které se mají vydat z příkazového řádku:

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

    Po azd up dokončení otevřete Azure Portal, přejděte na službu Aplikace Azure, která byla nasazena ve vaší nové skupině prostředků, a poznamenejte si cenový plán služby App Service (viz stránka Přehled plánu služby App Service, část Základy, hodnota Cenový plán).

  2. V kroku 1 článku Rychlý start jste dostali pokyn, abyste vytvořili složku azdtest . Otevřete složku v editoru Visual Studio Code.

  3. V podokně Průzkumník přejděte do složky infra . Sledujte podsložky a soubory ve složce infra .

    Soubor main.bicep orchestruje vytvoření všech služeb nasazených při provádění nebo azd upazd provision. Volá do jiných souborů, jako je db.bicep a web.bicep, které pak volají soubory obsažené v podsložce \core .

    Podsložka \core je hluboce vnořená struktura složek obsahující šablony bicep pro mnoho služeb Azure. Na některé soubory v podsložce \core se odkazují tři soubory bicep nejvyšší úrovně (main.bicep, db.bicep a web.bicep) a některé se v tomto projektu vůbec nepoužívají.

Škálování služby úpravou vlastností Bicep

Existující prostředek v nasazení můžete škálovat změnou jeho skladové položky. Abyste to mohli předvést, změníte plán služby App Service z plánu Služby Basic (který je navržený pro aplikace s nižšími požadavky na provoz a nepotřebujete pokročilé funkce automatického škálování a správy provozu) na plán služby Standard, který je navržený pro spouštění produkčních úloh.

Poznámka:

Ne všechny změny skladové položky se dají provést po faktu. Některé výzkumy můžou být nezbytné k lepšímu pochopení možností škálování.

  1. Otevřete soubor web.bicep a vyhledejte definici appService modulu. Konkrétně vyhledejte nastavení vlastnosti:

       sku: {
          name: 'B1'
       }
    

    Změňte hodnotu z B1 na S1 následující:

       sku: {
          name: 'S1'
       }
    

    Důležité

    V důsledku této změny se cena za hodinu mírně zvýší. Podrobnosti o různých plánech služeb a souvisejících nákladech najdete na stránce s cenami služby App Service.

  2. Za předpokladu, že už máte aplikaci nasazenou v Azure, pomocí následujícího příkazu nasaďte změny v infrastruktuře, aniž byste znovu nasadili samotný kód aplikace.

    azd provision
    

    Neměli byste být vyzváni k zadání umístění a předplatného. Tyto hodnoty jsou uloženy v souboru .azure<environment-name.env>, kde <environment-name> je název prostředí, který jste zadali během azd init.

  3. Po azd provision dokončení potvrďte, že vaše webová aplikace stále funguje. Vyhledejte také plán služby App Service pro vaši skupinu prostředků a ověřte, že je cenový plán nastavený na plán služby Standard (S1).

Přidání nové definice služby pomocí Bicep

Do nasazení můžete přidat nový prostředek provedením větších změn bicep v projektu. Abyste to mohli předvést, přidáte do stávajícího nasazení instanci Azure Cache for Redis v rámci přípravy na fiktivní novou funkci, kterou plánujete přidat k určitému budoucímu datu.

Důležité

V důsledku této změny budete platit za instanci Azure Cache for Redis, dokud prostředek neodstraníte na webu Azure Portal nebo pomocí azd down. Podrobnosti o různých plánech služeb a souvisejících nákladech najdete na stránce s cenami služby Azure Cache for Redis.

  1. Ve složce infra vytvořte nový soubor s názvem redis.bicep. Zkopírujte a vložte do nového souboru následující kód:

    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. Upravte soubor main.bicep tak, aby vytvořil instanci prostředku "redis".

    Do souboru main.bicep přidejte následující kód pod koncovou složenou závorku přidruženou k části Webový front-end a nad oddíl tajných kódů.

    // 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. Přidejte výstupní hodnoty do dolní části souboru:

    output REDIS_ID string = redis.outputs.REDIS_ID
    output REDIS_HOST string = redis.outputs.REDIS_HOST
    
  4. Ověřte, že celý soubor main.bicep je shodný s následujícím kódem:

    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. Ujistěte se, že jsou všechny vaše změny uložené, a pak pomocí následujícího příkazu aktualizujte zřízené prostředky v Azure:

    azd provision
    

    Poznámka:

    V závislosti na mnoha faktorech může přidání instance Azure Cache for Redis do stávajícího nasazení trvat dlouhou dobu. Při testování jsme zaznamenali dobu provádění přesahující 20 minut. Pokud se nezobrazí žádné chyby, povolte, aby proces pokračoval až do dokončení.

  6. Po azd provision dokončení otevřete Azure Portal, přejděte do skupiny prostředků pro vaše nasazení a v seznamu služeb potvrďte, že teď máte instanci Azure Cache for Redis.

Tím dojde k závěru rychlého startu, ale existuje mnoho služeb Azure, které vám můžou pomoct sestavovat škálovatelné a připravené aplikace pro produkční prostředí. Skvělým místem, kde začít, by bylo seznámit se se službou Azure API Management, Azure Front Door, Azure CDN a službou Azure Virtual Network a pojmenovat několik z nich.

Vyčištění prostředků

Vyčistěte prostředky vytvořené šablonou spuštěním příkazu azd down .

azd down

Příkaz azd down odstraní prostředky Azure a pracovní postup GitHub Actions. Po zobrazení výzvy přijměte souhlas s odstraněním všech prostředků přidružených ke skupině prostředků.

Složku azdtest můžete také odstranit nebo ji použít jako základ pro vlastní aplikaci úpravou souborů projektu.