Share via


빠른 시작: Bicep을 사용하여 azd Python 웹 템플릿으로 배포된 서비스 크기 조정

Python 웹 템플릿을 사용하면 새 웹 azd 애플리케이션을 빠르게 만들고 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 앱 Service로 이동하고 App Service 가격 책정 계획을 기록해 둡니다(App Service 계획의 개요 페이지, Essentials 섹션, "가격 책정 계획" 값 참조).

  2. 빠른 시작 문서의 1단계에서는 azdtest 폴더를 만들라는 지시를 받았습니다. Visual Studio Code에서 해당 폴더를 엽니다.

  3. 탐색기 창에서 인프라 폴더로 이동합니다. 인프라 폴더의 하위 폴더 및 파일을 관찰합니다.

    기본.bicep 파일은 수행하거나 azd provision수행할 때 배포된 모든 서비스의 생성을 azd up 오케스트레이션합니다. db.bicep 및 web.bicep같은 다른 파일을 호출하여 \core 하위 폴더에 포함된 파일을 호출합니다.

    \core 하위 폴더는 많은 Azure 서비스에 대한 bicep 템플릿을 포함하는 깊이 중첩된 폴더 구조입니다. \core 하위 폴더의 일부 파일은 세 개의 최상위 bicep 파일(기본.bicep, db.bicepweb.bicep)에서 참조되며 일부는 이 프로젝트에서 전혀 사용되지 않습니다.

Bicep 속성을 수정하여 서비스 크기 조정

SKU를 변경하여 배포에서 기존 리소스의 크기를 조정할 수 있습니다. 이를 입증하기 위해 App Service 계획을 "기본 서비스 계획"(트래픽 요구 사항이 낮고 고급 자동 크기 조정 및 트래픽 관리 기능이 필요하지 않은 앱용으로 설계됨)에서 프로덕션 워크로드를 실행하도록 설계된 "표준 서비스 계획"으로 변경합니다.

참고 항목

사실 이후에 모든 SKU를 변경할 수 있는 것은 아닙니다. 크기 조정 옵션을 더 잘 이해하려면 몇 가지 연구가 필요할 수 있습니다.

  1. web.bicep 파일을 열고 모듈 정의를 찾습니다appService. 특히 속성 설정을 찾습니다.

       sku: {
          name: 'B1'
       }
    

    값을 B1S1 다음과 같이 변경합니다.

       sku: {
          name: 'S1'
       }
    

    Important

    이 변경으로 인해 시간당 가격이 약간 증가합니다. 다양한 서비스 계획 및 관련 비용에 대한 자세한 내용은 App Service 가격 책정 페이지에서 확인할 수 있습니다.

  2. Azure에 애플리케이션이 이미 배포되어 있다고 가정하면 다음 명령을 사용하여 애플리케이션 코드 자체를 다시 배포하지 않고 인프라에 변경 내용을 배포합니다.

    azd provision
    

    위치 및 구독에 대한 메시지가 표시되지 않아야 합니다. 이러한 값은 .azure<environment-name.env> 파일에 저장됩니다. 여기서 <environment-name> 는 사용자가 azd init제공한 환경 이름입니다.

  3. azd provision 완료되면 웹 애플리케이션이 여전히 작동하는지 확인합니다. 또한 리소스 그룹에 대한 App Service 계획을 찾아 가격 책정 계획이 표준 서비스 계획(S1)으로 설정되어 있는지 확인합니다.

Bicep을 사용하여 새 서비스 정의 추가

프로젝트에서 Bicep을 더 크게 변경하여 배포에 새 리소스를 추가할 수 있습니다. 이를 입증하기 위해 향후 추가하려는 가상의 새 기능에 대비하여 기존 배포에 Azure Cache for Redis 인스턴스를 추가합니다.

Important

이 변경으로 인해 Azure Portal에서 리소스를 삭제하거나 사용할 azd down때까지 Azure Cache for Redis 인스턴스에 대한 비용을 지불하게 됩니다. 다양한 서비스 계획 및 관련 비용에 대한 자세한 내용은 Azure Cache for 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. 기본.bicep 파일을 수정하여 "redis" 리소스의 인스턴스를 만듭니다.

    기본.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. 전체 기본.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 Cache for Redis 인스턴스를 추가하는 데 시간이 오래 걸릴 수 있습니다. 테스트에서 실행 시간이 20분을 초과했습니다. 오류가 표시되지 않는 한 프로세스가 완료될 때까지 계속하도록 허용합니다.

  6. azd provision 완료되면 Azure Portal을 열고, 배포를 위한 리소스 그룹으로 이동하고, 서비스 목록에서 이제 Azure Cache for Redis 인스턴스가 있는지 확인합니다.

이렇게 하면 빠른 시작이 마무리되지만, 더 확장 가능하고 프로덕션이 가능한 애플리케이션을 빌드하는 데 도움이 되는 많은 Azure 서비스가 있습니다. 시작하기에 좋은 위치는 Azure API Management, Azure Front Door, Azure CDNAzure Virtual Network에 대해 알아보는 것입니다.

리소스 정리

azd down 명령을 실행하여 템플릿에서 만든 리소스를 정리합니다.

azd down

azd down 명령은 Azure 리소스 및 GitHub Actions 워크플로를 삭제합니다. 메시지가 표시되면 리소스 그룹과 연결된 모든 리소스를 삭제하는 데 동의합니다.

azdtest 폴더를 삭제하거나 프로젝트의 파일을 수정하여 자체 애플리케이션의 기준으로 사용할 수도 있습니다.