Udostępnij za pośrednictwem


Szybki start: skalowanie usług wdrożonych przy użyciu szablonów internetowych języka Python azd przy użyciu aplikacji Bicep

Szablony internetowe azd języka Python umożliwiają szybkie tworzenie nowej aplikacji internetowej i wdrażanie jej na platformie Azure. Szablony azd zostały zaprojektowane tak, aby korzystały z tanich opcji usługi platformy Azure. Bez wątpienia należy dostosować poziomy usług (lub jednostki SKU) dla każdego z usług zdefiniowanych w szablonie dla danego scenariusza.

W tym przewodniku Szybki start zaktualizujesz odpowiednie pliki szablonów bicep, aby skalować istniejące usługi i dodawać nowe usługi do wdrożenia. Następnie uruchomisz azd provision polecenie i wyświetlisz zmiany wprowadzone we wdrożeniu platformy Azure.

Wymagania wstępne

Subskrypcja platformy Azure — utwórz bezpłatnie

Na komputerze lokalnym muszą być zainstalowane następujące elementy:

Wdrażanie szablonu

Aby rozpocząć, potrzebujesz działającego azd wdrożenia. Gdy już to nastąpi, możesz zmodyfikować pliki Bicep wygenerowane przez azd szablon.

  1. Wykonaj kroki od 1 do 7 w artykule Szybki start. W kroku 2 użyj szablonu azure-django-postgres-flexible-appservice . Dla wygody oto cała sekwencja poleceń do wydania z wiersza polecenia:

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

    Po azd up zakończeniu otwórz witrynę Azure Portal, przejdź do usługi aplikacja systemu Azure, która została wdrożona w nowej grupie zasobów, i zanotuj plan cenowy usługi App Service (zobacz stronę Przegląd planu usługi App Service, sekcję Podstawy, wartość "Plan cenowy").

  2. W kroku 1 artykułu Szybki start został wyświetlony monit o utworzenie folderu azdtest . Otwórz ten folder w programie Visual Studio Code.

  3. W okienku Eksplorator przejdź do folderu infra . Obserwuj podfoldery i pliki w folderze infra .

    Plik main.bicep organizuje tworzenie wszystkich usług wdrożonych podczas wykonywania elementu azd up lub azd provision. Wywołuje on inne pliki, takie jak db.bicep i web.bicep, co z kolei wywołuje pliki zawarte w podfolderze \core.

    Podfolder \core to głęboko zagnieżdżona struktura folderów zawierająca szablony bicep dla wielu usług platformy Azure. Niektóre pliki w podfolderze \core odwołują się do trzech plików bicep najwyższego poziomu (main.bicep, db.bicep i web.bicep), a niektóre nie są używane w ogóle w tym projekcie.

Skalowanie usługi przez zmodyfikowanie jej właściwości Bicep

Istniejący zasób można skalować we wdrożeniu, zmieniając jego jednostkę SKU. Aby to zademonstrować, zmienisz plan usługi App Service z planu "Podstawowa usługa" (który jest przeznaczony dla aplikacji o niższych wymaganiach dotyczących ruchu i nie wymaga zaawansowanych funkcji automatycznego skalowania i zarządzania ruchem) na "Plan usługi Standardowa", który jest przeznaczony do uruchamiania obciążeń produkcyjnych.

Uwaga

Nie wszystkie zmiany jednostki SKU można wprowadzić po fakcie. Niektóre badania mogą być konieczne, aby lepiej zrozumieć opcje skalowania.

  1. Otwórz plik web.bicep i znajdź definicję modułuappService. W szczególności poszukaj ustawienia właściwości:

       sku: {
          name: 'B1'
       }
    

    Zmień wartość z B1 na S1 w następujący sposób:

       sku: {
          name: 'S1'
       }
    

    Ważne

    W wyniku tej zmiany cena za godzinę nieznacznie wzrośnie. Szczegółowe informacje o różnych planach usług i skojarzonych z nimi kosztach można znaleźć na stronie cennika usługi App Service.

  2. Zakładając, że aplikacja została już wdrożona na platformie Azure, użyj następującego polecenia, aby wdrożyć zmiany w infrastrukturze, nie wdrażając samego kodu aplikacji.

    azd provision
    

    Nie należy monitować o lokalizację i subskrypcję. Te wartości są zapisywane w pliku .azure<environment-name.env>, gdzie <environment-name> jest nazwą środowiska podaną podczas azd init.

  3. Po azd provision zakończeniu upewnij się, że aplikacja internetowa nadal działa. Znajdź również plan usługi App Service dla grupy zasobów i upewnij się, że plan cenowy jest ustawiony na plan usługi Standardowa (S1).

Dodawanie nowej definicji usługi za pomocą Bicep

Możesz dodać nowy zasób do wdrożenia, wprowadzając większe zmiany w projekcie Bicep. Aby to zademonstrować, dodasz wystąpienie usługi Azure Cache for Redis do istniejącego wdrożenia w ramach przygotowań do fikcyjnej nowej funkcji, którą planujesz dodać w przyszłości.

Ważne

W wyniku tej zmiany płacisz za wystąpienie usługi Azure Cache for Redis do momentu usunięcia zasobu w witrynie Azure Portal lub przy użyciu polecenia azd down. Szczegółowe informacje o różnych planach usług i skojarzonych z nimi kosztach można znaleźć na stronie cennika usługi Azure Cache for Redis.

  1. Utwórz nowy plik w folderze infra o nazwie redis.bicep. Skopiuj i wklej następujący kod do nowego pliku:

    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. Zmodyfikuj plik main.bicep , aby utworzyć wystąpienie zasobu "redis".

    W pliku main.bicep dodaj następujący kod poniżej końcowych nawiasów klamrowych skojarzonych z sekcją frontonu sieci Web i powyżej sekcji wpisy tajne.

    // 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. Dodaj wartości wyjściowe w dolnej części pliku:

    output REDIS_ID string = redis.outputs.REDIS_ID
    output REDIS_HOST string = redis.outputs.REDIS_HOST
    
  4. Upewnij się, że cały plik main.bicep jest identyczny z następującym kodem:

    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. Upewnij się, że wszystkie zmiany zostały zapisane, a następnie zaktualizuj aprowizowane zasoby na platformie Azure za pomocą następującego polecenia:

    azd provision
    

    Uwaga

    W zależności od wielu czynników dodanie wystąpienia usługi Azure Cache for Redis do istniejącego wdrożenia może zająć dużo czasu. Podczas testowania wystąpiły czasy wykonywania przekraczające 20 minut. Jeśli nie widzisz żadnych błędów, zezwól na kontynuowanie procesu do momentu ukończenia.

  6. Po azd provision zakończeniu otwórz witrynę Azure Portal, przejdź do grupy zasobów dla wdrożenia, a na liście usług upewnij się, że masz teraz wystąpienie usługi Azure Cache for Redis.

Ten przewodnik Szybki start kończy się jednak wieloma usługami platformy Azure, które mogą pomóc w tworzeniu bardziej skalowalnych i gotowych do produkcji aplikacji. Doskonałym miejscem do rozpoczęcia jest zapoznanie się z usługami Azure API Management, Azure Front Door, Azure CDN i Azure Virtual Network, aby wymienić kilka.

Czyszczenie zasobów

Wyczyść zasoby utworzone przez szablon, uruchamiając polecenie azd down .

azd down

Polecenie azd down usuwa zasoby platformy Azure i przepływ pracy funkcji GitHub Actions. Po wyświetleniu monitu zaakceptuj usunięcie wszystkich zasobów skojarzonych z grupą zasobów.

Możesz również usunąć folder azdtest lub użyć go jako podstawy dla własnej aplikacji, modyfikując pliki projektu.