Поделиться через


Краткое руководство. Масштабирование служб, развернутых с помощью веб-шаблонов azd Python с помощью Bicep

Веб-шаблоны Python позволяют быстро создавать веб-приложение azd и развертывать его в Azure. azd Шаблоны предназначены для использования параметров службы Azure с низкой стоимостью. Несомненно, вы хотите настроить уровни обслуживания (или skus) для каждого из служб, определенных в шаблоне для вашего сценария.

В этом кратком руководстве вы обновите соответствующие файлы шаблонов bicep, чтобы увеличить масштаб существующих служб и добавить новые службы в развертывание. Затем выполните azd provision команду и просмотрите изменения, внесенные в развертывание Azure.

Необходимые компоненты

подписка Azure — создайте бесплатную учетную запись.

На локальном компьютере должно быть установлено следующее:

Развертывание шаблона

Для начала вам потребуется рабочее azd развертывание. После этого вы сможете изменить файлы Bicep, созданные шаблоном azd .

  1. Выполните шаги 1–7 в статье "Краткое руководство". На шаге 2 используйте azure-django-postgres-flexible-appservice шаблон. Для удобства выполните всю последовательность команд из командной строки:

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

    После azd up завершения откройте портал Azure, перейдите к службе приложение Azure, развернутой в новой группе ресурсов, и запишите план ценообразования Служба приложений (см. страницу обзора плана Служба приложений, раздел "Основные сведения", значение "Ценовый план").

  2. На шаге 1 статьи краткого руководства вам было показано, как создать папку azdtest . Откройте папку в Visual Studio Code.

  3. В области Обозреватель перейдите в папку инфра. Просмотрите вложенные папки и файлы в инфраструктуре.

    Файл main.bicep управляет созданием всех служб, развернутых при выполнении azd up или azd provision. Он вызывает другие файлы, такие как db.bicep и web.bicep, которые, в свою очередь, вызывают файлы, содержащиеся в подпапке \core.

    Вложенная папка \core — это глубоко вложенная структура папок, содержащая шаблоны bicep для многих служб Azure. Некоторые файлы в подпапке \core ссылаются на три файла bicep верхнего уровня (main.bicep, db.bicep и web.bicep) и некоторые из них не используются вообще в этом проекте.

Масштабирование службы путем изменения его свойств Bicep

Вы можете масштабировать существующий ресурс в развертывании, изменив его номер SKU. Чтобы продемонстрировать это, вы измените план Служба приложений с "Базовый план обслуживания" (который предназначен для приложений с более низкими требованиями к трафику и не требует расширенных функций автоматического масштабирования и управления трафиком) на план "Стандартный план обслуживания", который предназначен для выполнения рабочих рабочих нагрузок.

Примечание.

Не все изменения номера SKU можно вносить после факта. Некоторые исследования могут потребоваться для лучшего понимания вариантов масштабирования.

  1. Откройте файл web.bicep и найдите appService определение модуля. В частности, найдите параметр свойства:

       sku: {
          name: 'B1'
       }
    

    Измените значение следующим B1S1 образом:

       sku: {
          name: 'S1'
       }
    

    Внимание

    В результате этого изменения цена за час немного увеличится. Сведения о различных планах обслуживания и связанных с ними затратах можно найти на странице цен на Служба приложений.

  2. Если у вас уже есть приложение, развернутое в Azure, используйте следующую команду, чтобы развернуть изменения в инфраструктуре, не развертывая сам код приложения.

    azd provision
    

    Вам не следует запрашивать расположение и подписку. Эти значения сохраняются в файле .azure<environment-name.env>, где <environment-name> указано имя среды, предоставленное во времяazd init.

  3. По azd provision завершении убедитесь, что веб-приложение по-прежнему работает. Кроме того, найдите план Служба приложений для группы ресурсов и убедитесь, что для плана ценообразования задан стандартный план обслуживания (S1).

Добавление нового определения службы с помощью Bicep

Вы можете добавить новый ресурс в развертывание, внося более крупные изменения в Bicep в проект. Чтобы продемонстрировать это, вы добавите экземпляр Кэш Azure для Redis в существующее развертывание при подготовке к вымышленной новой функции, которую вы планируете добавить в некоторые будущие даты.

Внимание

В результате этого изменения вы будете платить за экземпляр Кэш Azure для Redis, пока не удалите ресурс в портал Azure или используетеazd down. Сведения о различных планах обслуживания и их связанных затратах можно найти на странице цен Кэш Azure для Redis.

  1. Создайте новый файл в папке с именем redis.bicep. Скопируйте и вставьте следующий код в новый файл:

    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. Измените файл main.bicep , чтобы создать экземпляр ресурса Redis.

    В файле main.bicep добавьте следующий код под конечными фигурными скобками, связанными с разделом веб-интерфейса и выше раздела секретов.

    // 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. Добавьте выходные значения в нижней части файла:

    output REDIS_ID string = redis.outputs.REDIS_ID
    output REDIS_HOST string = redis.outputs.REDIS_HOST
    
  4. Убедитесь, что весь файл main.bicep идентичен следующему коду:

    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. Убедитесь, что все изменения сохранены, а затем выполните следующую команду, чтобы обновить подготовленные ресурсы в Azure:

    azd provision
    

    Примечание.

    В зависимости от многих факторов добавление экземпляра Кэш Azure для Redis в существующее развертывание может занять много времени. При тестировании время выполнения превышает 20 минут. Если вы не видите никаких ошибок, разрешите процессу продолжаться до завершения.

  6. По azd provision завершении откройте портал Azure, перейдите в группу ресурсов для развертывания и в списке служб убедитесь, что у вас есть экземпляр Кэш Azure для Redis.

В этом кратком руководстве содержится множество служб Azure, которые помогут вам создавать более масштабируемые и готовые к работе приложения. Чтобы начать, вы узнаете о Azure Управление API, Azure Front Door, Azure CDN и Azure виртуальная сеть, чтобы назвать несколько.

Очистка ресурсов

Очистите ресурсы, созданные шаблоном , выполнив команду azd down .

azd down

Команда azd down удаляет ресурсы Azure и рабочий процесс GitHub Actions. При появлении запроса примите согласие на удаление всех ресурсов, связанных с группой ресурсов.

Вы также можете удалить папку azdtest или использовать ее в качестве основы для собственного приложения, изменив файлы проекта.