Hızlı Başlangıç: Bicep kullanarak azd Python web şablonlarıyla dağıtılan hizmetleri ölçeklendirme

Python web azd şablonları hızlı bir şekilde yeni bir web uygulaması oluşturmanıza ve bunu Azure'a dağıtmanıza olanak sağlar. Şablonlar azd , düşük maliyetli Azure hizmet seçeneklerini kullanacak şekilde tasarlanmıştır. Kuşkusuz, senaryonuz için şablonda tanımlanan hizmetlerin her biri için hizmet düzeylerini (veya sku'ları) ayarlamak isteyeceksiniz.

Bu Hızlı Başlangıçta, mevcut hizmetlerin ölçeğini genişletmek ve dağıtımınıza yeni hizmetler eklemek için uygun bicep şablon dosyalarını güncelleştireceksiniz. Ardından komutunu çalıştıracak azd provision ve Azure dağıtımında yaptığınız değişikliği görüntüleyebilirsiniz.

Önkoşullar

Azure aboneliği - Ücretsiz bir abonelik oluşturun

Yerel bilgisayarınızda aşağıdakilerin yüklü olması gerekir:

Şablon dağıtma

Başlamak için çalışan azd bir dağıtıma ihtiyacınız vardır. Bunu yaptıktan sonra şablon tarafından azd oluşturulan Bicep dosyalarını değiştirebilirsiniz.

  1. Hızlı Başlangıç makalesindeki 1 ile 7 arasında adımları izleyin. 2. adımda şablonu kullanın azure-django-postgres-flexible-appservice . Kolaylık olması için, komut satırından verilen tüm komut dizisi aşağıda verilmiştir:

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

    İşlem tamamlandıktan sonra azd up Azure portalını açın, yeni Kaynak Grubunuzda dağıtılan Azure Uygulaması Hizmeti'ne gidin ve App Service fiyatlandırma planını not alın (App Service planının Genel Bakış sayfası, Temel Parçalar bölümüne bakın, "Fiyatlandırma planı" değeri).

  2. Hızlı Başlangıç makalesinin 1. adımında azdtest klasörünü oluşturmanız istenir. Bu klasörü Visual Studio Code'da açın.

  3. Gezgin bölmesinde infra klasörüne gidin. infra klasöründeki alt klasörleri ve dosyaları gözlemleyin.

    main.bicep dosyası, veya azd provisiongerçekleştirirken dağıtılan tüm hizmetlerin oluşturulmasını azd up düzenler. Db.bicep ve web.bicep gibi diğer dosyaları çağırır ve bu da \core alt klasöründe bulunan dosyalara çağrır.

    \core alt klasörü, birçok Azure hizmeti için bicep şablonları içeren derin iç içe yerleştirilmiş bir klasör yapısıdır. \core alt klasöründeki dosyalardan bazıları üç üst düzey bicep dosyası (main.bicep, db.bicep ve web.bicep) tarafından başvurulur ve bazıları bu projede hiç kullanılmaz.

Bicep özelliklerini değiştirerek hizmeti ölçeklendirme

Dağıtımınızdaki mevcut bir kaynağı SKU'sunu değiştirerek ölçeklendikleyebilirsiniz. Bunu göstermek için App Service planını "Temel Hizmet planı" (daha düşük trafik gereksinimlerine sahip uygulamalar için tasarlanmıştır ve gelişmiş otomatik ölçeklendirme ve trafik yönetimi özelliklerine ihtiyaç duymayan uygulamalar için tasarlanmıştır) yerine üretim iş yüklerini çalıştırmak için tasarlanmış olan "Standart Hizmet planı" olarak değiştireceksiniz.

Not

Bu olgudan sonra tüm SKU değişiklikleri yapılamaz. Ölçeklendirme seçeneklerinizi daha iyi anlamak için bazı araştırmalar gerekebilir.

  1. web.bicep dosyasını açın ve modül tanımını bulunappService. Özellikle özellik ayarını arayın:

       sku: {
          name: 'B1'
       }
    

    değerini B1S1 şu şekilde değiştirin:

       sku: {
          name: 'S1'
       }
    

    Önemli

    Bu değişikliğin sonucunda saat başına fiyat biraz artacaktır. Farklı hizmet planları ve bunların ilişkili maliyetleri hakkındaki ayrıntılar App Service fiyatlandırma sayfasında bulunabilir.

  2. Uygulamayı Azure'da zaten dağıttığınızı varsayarsak, uygulama kodunun kendisini yeniden dağıtmadan altyapıya değişiklikleri dağıtmak için aşağıdaki komutu kullanın.

    azd provision
    

    Konum ve abonelik istenmemelidir. Bu değerler .azure<environment-name.env> dosyasına kaydedilir; burada <environment-name> sırasında azd initsağladığınız ortam adıdır.

  3. azd provision Tamamlandığında web uygulamanızın çalışmaya devam ettiğinden emin olun. Ayrıca Kaynak Grubunuz için App Service Planı'nı bulun ve Fiyatlandırma Planının Standart Hizmet Planı (S1) olarak ayarlandığını onaylayın.

Bicep ile yeni hizmet tanımı ekleme

Projedeki Bicep'te daha büyük değişiklikler yaparak dağıtımınıza yeni bir kaynak ekleyebilirsiniz. Bunu göstermek için, gelecekteki bir tarihte eklemeyi planladığınız kurgusal yeni bir özelliğe hazırlanmak için mevcut dağıtımınıza bir Redis için Azure Cache örneği ekleyeceksiniz.

Önemli

Bu değişikliğin bir sonucu olarak, Azure portalında veya kullanarak azd downkaynağı silene kadar bir Redis için Azure Cache örneği için ödeme yapacaksınız. Farklı hizmet planları ve bunların ilişkili maliyetleri hakkındaki ayrıntılar Redis için Azure Cache fiyatlandırma sayfasında bulunabilir.

  1. infra klasöründe redis.bicep adlı yeni bir dosya oluşturun. Aşağıdaki kodu kopyalayıp yeni dosyaya yapıştırın:

    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 dosyasını değiştirerek "redis" kaynağının bir örneğini oluşturun.

    main.bicep dosyasında, Web ön uç bölümüyle ilişkili son küme ayraçlarının altına ve gizli diziler bölümünün üstüne aşağıdaki kodu ekleyin.

    // 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. Dosyanın en altına çıkış değerleri ekleyin:

    output REDIS_ID string = redis.outputs.REDIS_ID
    output REDIS_HOST string = redis.outputs.REDIS_HOST
    
  4. Main.bicep dosyasının tamamının aşağıdaki kodla aynı olduğunu onaylayın:

    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. Tüm değişikliklerinizin kaydedildiğinden emin olun, ardından Azure'da sağlanan kaynaklarınızı güncelleştirmek için aşağıdaki komutu kullanın:

    azd provision
    

    Not

    Birçok faktöre bağlı olarak, mevcut dağıtıma bir Redis için Azure Cache örneği eklemek uzun sürebilir. Testte yürütme sürelerinin 20 dakikadan fazla olduğunu belirledik. Herhangi bir hata görmediğiniz sürece, işlemin tamamlanana kadar devam etmesine izin verin.

  6. İşlem azd provision tamamlandığında Azure portalını açın, dağıtımınız için Kaynak Grubu'na gidin ve hizmetler listesinde artık bir Redis için Azure Cache örneğine sahip olduğunuzu onaylayın.

Bu, Hızlı Başlangıç'ı sona erdirir, ancak daha ölçeklenebilir ve üretime hazır uygulamalar oluşturmanıza yardımcı olabilecek birçok Azure hizmeti vardır. Başlangıç olarak Azure API Management, Azure Front Door, Azure CDN ve Azure Sanal Ağ hakkında bilgi edinmek iyi bir başlangıç olabilir.

Kaynakları temizleme

azd down komutunu çalıştırarak şablon tarafından oluşturulan kaynakları temizleyin.

azd down

komutu Azure azd down kaynaklarını ve GitHub Actions iş akışını siler. İstendiğinde, kaynak grubuyla ilişkili tüm kaynakları silmeyi kabul edin.

Ayrıca azdtest klasörünü silebilir veya projenin dosyalarını değiştirerek kendi uygulamanızın temeli olarak kullanabilirsiniz.