次の方法で共有


クイック スタート: Bicep を使って azd Python Web テンプレートによってデプロイされたサービスのスケーリング

Python Web azd テンプレートを使用すると、新しい Web アプリケーションをすばやく作成し、Azure にデプロイすることができます。 azd テンプレートは、低コストの Azure サービス オプションを使用するよう設計されています。 シナリオのテンプレートで定義された各サービスのサービス レベル (つまり SKU) を調整する必要が生じることは間違いなくあります。

このクイック スタートでは、該当する bicep テンプレート ファイルを更新して、既存のサービスをスケール アップし、新しいサービスをデプロイに追加します。 その後、azd provision コマンドを実行し、Azure デプロイに加えた変更を表示します。

前提条件

Azure サブスクリプション - 無料アカウントを作成します

ローカル コンピューターに以下がインストールされている必要があります。

テンプレートのデプロイ

開始するには、稼働中の azd デプロイが必要です。 準備ができたら、azd テンプレートにより生成された Bicep ファイルを変更することができます。

  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 portal を開いて、新しいリソース グループにデプロイされた Azure App Service に移動し、App Service の料金プランを書き留めます (App Service プランの概要ページの [要点] セクションにある [料金プラン] 値を参照)。

  2. クイック スタート記事の手順 1 では、azdtest フォルダーを作成するよう指示されました。 Visual Studio Code でそのフォルダーを開きます。

  3. エクスプローラー ウィンドウで、infra フォルダーに移動します。 infra フォルダーでサブフォルダーとファイルを確認します。

    main.bicep ファイルは、azd up または azd provision の実行時にデプロイされたすべてのサービスの作成を調整します。 他のファイル (db.bicepweb.bicep など) が呼び出され、その後 \core サブフォルダーに含まれているファイルが呼び出されます。

    \core サブフォルダーは、多くの Azure サービス用の bicep テンプレートが含まれる、深く入れ子になったフォルダー構造です。 \core サブフォルダー内の一部のファイルは、最上位レベルの 3 つの bicep ファイル (main.bicepdb.bicepweb.bicep) によって参照されます。このプロジェクトでまったく使用されないものもあります。

Bicep プロパティを変更することによるサービスのスケーリング

デプロイ内の既存のリソースをスケーリングするにはその SKU を変更します。 これを示すため、App Service プランを "Basic サービス プラン" (トラフィック要件が低く、高度な自動スケーリングやトラフィック管理機能を必要としないアプリ用に設計) から、"Standard サービス プラン" (運用環境のワークロードを実行するために設計) に変更します。

Note

どの SKU の変更でも事後に加えられるわけではありません。 スケーリング オプションについてより深く理解するため、ある程度の調査が必要になることがあります。

  1. web.bicep ファイルを開き、appService モジュール定義を見つけます。 特に、プロパティ設定を探します。

       sku: {
          name: 'B1'
       }
    

    次のように、値を B1 から S1 に変更します。

       sku: {
          name: 'S1'
       }
    

    重要

    この変更の結果、1 時間あたりの料金がわずかに上昇します。 各種サービス プランとそれに関連するコストについて詳しくは、App Service の料金ページをご覧ください。

  2. アプリケーションを既に Azure にデプロイしている場合、次のコマンドを使用して、アプリケーション コード自体を再デプロイせずにインフラストラクチャに変更をデプロイします。

    azd provision
    

    場所とサブスクリプションの入力を求められることはありません。 これらの値は、.azure<environment-name>.env ファイルに保存されます。ここで、<environment-name> は、azd init 時に指定した環境名です。

  3. azd provision が完了したら、Web アプリケーションがまだ起動することを確認します。 さらに、リソース グループの App Service プランを調べ、料金プランが Standard サービス プラン (S1) に設定されていることを確認します。

Bicep を使った新しいサービス定義の追加

プロジェクトの Bicep に大規模な変更を加えることにより、新しいリソースをデプロイに追加できます。 これをデモンストレーションするため、今後追加を計画している架空の新機能に備えて、既存のデプロイに Azure Cache for Redis のインスタンスを追加します。

重要

この変更の結果、Azure portal または azd down を使ってリソースを削除するまで、Azure Cache for Redis のインスタンスに対して料金が発生します。 各種サービス プランとそれに関連するコストについて詳しくは、Azure Cache for Redis の料金ページをご覧ください。

  1. infra フォルダーに 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 ファイルで、Web フロントエンド セクションに関連付けられている末尾の中かっこの下と secrets セクションの上に以下のコードを追加します。

    // 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
    

    Note

    多くの理由のため、既存のデプロイに Azure Cache for Redis のインスタンスを追加する処理には時間がかかることがあります。 テストでは、実行時間が 20 分を超えました。 エラーが表示されない限り、プロセスは完了するまで続行されます。

  6. azd provision が完了したら、Azure portal を開いて、デプロイ用のリソース グループに移動し、サービスの一覧に Azure Cache for Redis のインスタンスがあることを確認します。

これでクイック スタートは終了ですが、よりスケーラブルで運用環境に対応したアプリケーションの構築に役立つ Azure サービスが多数あります。 まず、たとえば Azure API ManagementAzure Front DoorAzure CDNAzure Virtual Network について学習することをお勧めします。

リソースをクリーンアップする

azd down コマンドを実行することにより、テンプレートによって作成されたリソースをクリーンアップします。

azd down

azd down コマンドを実行すると、Azure リソースと GitHub Actions ワークフローが削除されます。 メッセージが表示されたら、リソース グループに関連付けられたすべてのリソースを削除することに同意します。

azdtest フォルダーを削除したり、プロジェクトのファイルを変更することにより独自のアプリケーションの基礎として使用したりすることもできます。