빠른 시작: Bicep을 사용하여 azd Python 웹 템플릿으로 배포된 서비스 크기 조정
Python 웹 템플릿을 사용하면 새 웹 azd
애플리케이션을 빠르게 만들고 Azure에 배포할 수 있습니다. 템플릿은 azd
저렴한 Azure 서비스 옵션을 사용하도록 설계되었습니다. 의심할 여지 없이 시나리오에 대해 템플릿에 정의된 각 서비스에 대한 서비스 수준(또는 sku)을 조정하려고 합니다.
이 빠른 시작에서는 적절한 bicep 템플릿 파일을 업데이트하여 기존 서비스를 확장하고 배포에 새 서비스를 추가합니다. 그런 다음, 명령을 실행하고 azd provision
Azure 배포에 대한 변경 내용을 확인합니다.
필수 조건
Azure 구독 - 체험 구독 만들기
로컬 컴퓨터에 다음이 설치되어 있어야 합니다.
- Azure Developer CLI
- Docker Desktop
- Visual Studio Code
- 개발 컨테이너 확장
- Visual Studio Code Bicep 이 확장은 Bicep 구문을 작성하는 데 도움이 됩니다.
템플릿 배포
시작하려면 작업 azd
배포가 필요합니다. 이 작업이 완료되면 템플릿에서 생성된 azd
Bicep 파일을 수정할 수 있습니다.
빠른 시작 문서의 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 섹션, "가격 책정 계획" 값 참조).빠른 시작 문서의 1단계에서는 azdtest 폴더를 만들라는 지시를 받았습니다. Visual Studio Code에서 해당 폴더를 엽니다.
탐색기 창에서 인프라 폴더로 이동합니다. 인프라 폴더의 하위 폴더 및 파일을 관찰합니다.
기본.bicep 파일은 수행하거나
azd provision
수행할 때 배포된 모든 서비스의 생성을azd up
오케스트레이션합니다. db.bicep 및 web.bicep과 같은 다른 파일을 호출하여 \core 하위 폴더에 포함된 파일을 호출합니다.\core 하위 폴더는 많은 Azure 서비스에 대한 bicep 템플릿을 포함하는 깊이 중첩된 폴더 구조입니다. \core 하위 폴더의 일부 파일은 세 개의 최상위 bicep 파일(기본.bicep, db.bicep 및 web.bicep)에서 참조되며 일부는 이 프로젝트에서 전혀 사용되지 않습니다.
Bicep 속성을 수정하여 서비스 크기 조정
SKU를 변경하여 배포에서 기존 리소스의 크기를 조정할 수 있습니다. 이를 입증하기 위해 App Service 계획을 "기본 서비스 계획"(트래픽 요구 사항이 낮고 고급 자동 크기 조정 및 트래픽 관리 기능이 필요하지 않은 앱용으로 설계됨)에서 프로덕션 워크로드를 실행하도록 설계된 "표준 서비스 계획"으로 변경합니다.
참고 항목
사실 이후에 모든 SKU를 변경할 수 있는 것은 아닙니다. 크기 조정 옵션을 더 잘 이해하려면 몇 가지 연구가 필요할 수 있습니다.
web.bicep 파일을 열고 모듈 정의를 찾습니다
appService
. 특히 속성 설정을 찾습니다.sku: { name: 'B1' }
값을
B1
S1
다음과 같이 변경합니다.sku: { name: 'S1' }
Important
이 변경으로 인해 시간당 가격이 약간 증가합니다. 다양한 서비스 계획 및 관련 비용에 대한 자세한 내용은 App Service 가격 책정 페이지에서 확인할 수 있습니다.
Azure에 애플리케이션이 이미 배포되어 있다고 가정하면 다음 명령을 사용하여 애플리케이션 코드 자체를 다시 배포하지 않고 인프라에 변경 내용을 배포합니다.
azd provision
위치 및 구독에 대한 메시지가 표시되지 않아야 합니다. 이러한 값은 .azure<environment-name.env> 파일에 저장됩니다. 여기서
<environment-name>
는 사용자가azd init
제공한 환경 이름입니다.azd provision
완료되면 웹 애플리케이션이 여전히 작동하는지 확인합니다. 또한 리소스 그룹에 대한 App Service 계획을 찾아 가격 책정 계획이 표준 서비스 계획(S1)으로 설정되어 있는지 확인합니다.
Bicep을 사용하여 새 서비스 정의 추가
프로젝트에서 Bicep을 더 크게 변경하여 배포에 새 리소스를 추가할 수 있습니다. 이를 입증하기 위해 향후 추가하려는 가상의 새 기능에 대비하여 기존 배포에 Azure Cache for Redis 인스턴스를 추가합니다.
Important
이 변경으로 인해 Azure Portal에서 리소스를 삭제하거나 사용할 azd down
때까지 Azure Cache for Redis 인스턴스에 대한 비용을 지불하게 됩니다. 다양한 서비스 계획 및 관련 비용에 대한 자세한 내용은 Azure Cache for Redis 가격 책정 페이지에서 확인할 수 있습니다.
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
기본.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 } }
파일 아래쪽에 출력 값을 추가합니다.
output REDIS_ID string = redis.outputs.REDIS_ID output REDIS_HOST string = redis.outputs.REDIS_HOST
전체 기본.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
모든 변경 내용이 저장되었는지 확인한 다음, 다음 명령을 사용하여 Azure에서 프로비전된 리소스를 업데이트합니다.
azd provision
참고 항목
여러 요인에 따라 기존 배포에 Azure Cache for Redis 인스턴스를 추가하는 데 시간이 오래 걸릴 수 있습니다. 테스트에서 실행 시간이 20분을 초과했습니다. 오류가 표시되지 않는 한 프로세스가 완료될 때까지 계속하도록 허용합니다.
azd provision
완료되면 Azure Portal을 열고, 배포를 위한 리소스 그룹으로 이동하고, 서비스 목록에서 이제 Azure Cache for Redis 인스턴스가 있는지 확인합니다.
이렇게 하면 빠른 시작이 마무리되지만, 더 확장 가능하고 프로덕션이 가능한 애플리케이션을 빌드하는 데 도움이 되는 많은 Azure 서비스가 있습니다. 시작하기에 좋은 위치는 Azure API Management, Azure Front Door, Azure CDN 및 Azure Virtual Network에 대해 알아보는 것입니다.
리소스 정리
azd down 명령을 실행하여 템플릿에서 만든 리소스를 정리합니다.
azd down
이 azd down
명령은 Azure 리소스 및 GitHub Actions 워크플로를 삭제합니다. 메시지가 표시되면 리소스 그룹과 연결된 모든 리소스를 삭제하는 데 동의합니다.
azdtest 폴더를 삭제하거나 프로젝트의 파일을 수정하여 자체 애플리케이션의 기준으로 사용할 수도 있습니다.
관련 내용
- Python 웹
azd
템플릿에 대해 자세히 알아보기 - 명령에 대해
azd
자세히 알아봅니다. - 프로젝트의 각 폴더 및 파일이 수행하는 작업과 편집하거나 삭제할 수 있는 작업을 알아봅니다.
- Bicep 템플릿을 업데이트하여 Azure 서비스를 추가하거나 제거합니다. Bicep을 모르시나요? 이 학습 경로 시도: Bicep의 기본 사항
- 병합에서 기본 분기로 다시 배포하도록 GitHub Actions CI/CD 파이프라인을 설정하는 데 사용합니다
azd
. - Azure 개발자 CLI를 사용하여 앱을 모니터링할 수 있도록 모니터링 설정