Azure 개발자 CLI(azd)는 App Service에서 호스트되는 앱에 대한 Azure App Service 배포 슬롯을 지원합니다. 인프라에서 슬롯을 정의하고, 특정 슬롯에 코드를 배포한 후, 릴리스를 승격할 준비가 되면 슬롯을 교환할 수 있습니다.
사용자 지정 배포 스크립트를 추가하지 않고 스테이징, 청록색 배포, 스모크 테스트 및 롤백에 이 방법을 사용합니다.
사전 요구 사항
-
azdAzure App Service에 서비스를 배포하는 프로젝트입니다. - Bicep에서 App Service 리소스를 정의하는 코드로서의 인프라.
- 표준(
S1) 계층 이상에 대한 App Service 계획입니다. 무료, 공유 계층 및 기본 계층은 배포 슬롯을 지원하지 않습니다.
Bicep에서 배포 슬롯 정의
프로덕션 사이트를 평소와 같이 정의한 후, Microsoft.Web/sites/slots 각 슬롯을 azd 가(이) 타겟으로 하는 리소스를 추가합니다.
resource appServicePlan 'Microsoft.Web/serverfarms@2021-03-01' = {
name: 'my-appservice-plan'
location: resourceGroup().location
sku: {
name: 'S1'
tier: 'Standard'
}
}
resource webApp 'Microsoft.Web/sites@2021-03-01' = {
name: 'my-appservice'
location: resourceGroup().location
kind: 'app'
properties: {
serverFarmId: appServicePlan.id
}
}
resource stagingSlot 'Microsoft.Web/sites/slots@2021-03-01' = {
name: '${webApp.name}/staging'
location: webApp.location
properties: {}
}
AVM(Azure Verified Modules)을 사용하는 경우 동일한 배포에서 웹앱 및 배포 슬롯 모듈을 정의하고 앱 이름을 슬롯 모듈에 전달합니다.
azd 명령어를 사용하여 슬롯에 배포
실행하세요 azd up 또는 azd provision 그리고 azd deploy 평소와 같이.
azd up
첫 번째로 azd가 프로덕션 사이트와 인프라에 정의된 모든 슬롯에 배포됩니다. 이 첫 번째 배포는 주 앱 및 모든 슬롯에서 동일한 기준을 설정합니다.
첫 번째 배포 azd deploy 후에 슬롯이 있을 때 배포 대상을 선택하는 방법을 변경합니다.
azd 는 배포 슬롯 사용 시 프로덕션 앱으로의 직접 배포를 계속하지 않습니다. 대신 슬롯에 배포한 후 릴리스의 유효성을 검사하고, 그런 다음 프로덕션으로 전환합니다.
azd가 배포 대상을 선택하는 방법
배포 슬롯이 있는 App Service에 대해 실행되면 azd deploy 주 앱에서 배포 기록을 확인한 다음 사용 가능한 슬롯을 평가하여 대상을 선택합니다.
동작은 다음과 같이 작동합니다.
- 이전 배포가 없는
azd경우 주 앱 및 모든 슬롯에 배포합니다. - 이전 배포가 있고 슬롯이 없는
azd경우 주 앱에만 배포합니다. - 이전 배포가 존재하고 정확히 하나의 슬롯이
azd있는 경우 해당 슬롯에만 배포합니다. - 이전 배포가 있고 두 개 이상의 슬롯이 있는
azd경우 환경 변수에 지정된 슬롯을 사용하거나 하나를 선택하라는 메시지를 표시합니다.
중요합니다
첫 번째 배포 후에는 azd가 슬롯이 있는 경우 주 App Service 애플리케이션에 직접 배포되지 않습니다. 이 동작은 의도적인 것이며 우발적인 직접 프로덕션 배포를 방지하는 데 도움이 됩니다. 프로덕션을 업데이트하려면 먼저 슬롯에 배포한 후 그 슬롯을 프로덕션(@main)으로 전환하세요.
환경 변수가 있는 슬롯 선택
첫 번째 배포 후 서비스에 두 개 이상의 슬롯이 있는 경우 배포하려는 서비스에 대한 환경 변수를 설정하여 대화형 프롬프트를 건너뛸 수 있습니다.
이때 다음 형식을 사용합니다.
AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME
대문자를 사용하고 하이픈을 밑줄로 바꿔서 서비스 이름에서 변수 이름을 azure.yaml 작성합니다.
예를 들어, 서비스가 my-api이라면 AZD_DEPLOY_MY_API_SLOT_NAME을 사용하십시오.
azd env set AZD_DEPLOY_MY_API_SLOT_NAME staging
azd deploy my-api
이 값을 azd 을 사용하여 azd env set 환경에 저장하거나 실행 azd deploy 전에 CI 시스템에서 직접 정의할 수 있습니다.
서비스에 정확히 하나의 슬롯 azd 이 있는 경우 가능한 배포 대상이 하나뿐이므로 환경 변수를 무시합니다.
서비스에 슬롯이 두 개 이상 있고 환경 변수가 설정 azd 되지 않은 경우 슬롯을 선택하라는 메시지가 표시됩니다.
슬롯 검색 우회 및 주 앱에 배포
일부 시나리오에서는 슬롯이 있는 경우에도 azd 기본 App Service 앱에 직접 배포해야 합니다. 다음은 그 예입니다.
- CI 파이프라인은 기존 슬롯을 그대로 유지하면서 주 앱을 새로 고쳐야 합니다.
- 잘못된 슬롯 상태에서 복구하고 프로덕션 사이트를 직접 다시 배포하려고 합니다.
- 새 슬롯을 구성하기 전에 주 앱의 기준을 다시 설정합니다.
슬롯 검색을 무시하려면 서비스에 대해 다음 환경 변수를 설정합니다.
AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS
대문자를 사용하고 하이픈을 밑줄로 바꿔서 서비스 이름에서 변수 이름을 azure.yaml 작성합니다. 값을 true로 설정하여 슬롯 감지를 건너뛰고 메인 앱에 배포합니다.
예를 들어, 서비스가 my-api이라면 AZD_DEPLOY_MY_API_IGNORE_SLOTS을 사용하십시오.
azd env set AZD_DEPLOY_MY_API_IGNORE_SLOTS true
azd deploy my-api
AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS이 true(으)로 설정되면 azd은(는) 주 앱에 배포되고 동일한 서비스에 대한 모든 AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME 값을 무시합니다. 변수를 설정 해제하거나 기본 슬롯 인식 동작으로 돌아가도록 설정합니다 false .
CI 및 비자동성 동작
CI에서 실행 azd deploy --no-prompt 하거나 배포할 때 슬롯 선택은 사용 가능한 슬롯 수에 따라 다르게 작동합니다.
| 슬롯 | 환경 변수 동작 | 결과 |
|---|---|---|
0 |
적용할 수 없습니다. |
azd 는 주 앱에 배포됩니다. |
1 |
AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS이(가) true이 아닌 경우 무시됩니다. |
azd는 유일한 배포 슬롯에 배포되거나, 슬롯이 무시되는 경우 주 앱에 배포됩니다. |
2+ |
프롬프트가 표시되지 않도록 하려면 AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME이(가) 필요합니다. 단, AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS이(가) true인 경우는 예외입니다. |
azd 는 지정된 슬롯에 배포하거나, 슬롯이 무시될 때 주 앱에 배포하거나, 대상을 선택할 수 없는 경우 실패합니다. |
둘 이상의 슬롯이 있는 App Service에 대한 배포를 자동화하는 경우, AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME를 실행하기 전에 파이프라인 환경에서 azd deploy을 설정합니다. 슬롯이 있는 경우 CI에서 메인에 직접 배포하도록 강제하려면 대신 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS를 true로 설정하세요.
Azure App Service 배포 슬롯 교환
azure.appservice 유효성 검사 후 확장을 사용하여 슬롯을 교환합니다. 확장이 아직 설치되지 azd 않은 경우 명령을 처음 실행할 때 설치하라는 메시지가 표시됩니다.
대화형 환경을 실행합니다.
azd appservice swap
비프로덕션 슬롯이 하나만 있는 azd 경우 프롬프트를 건너뛰고 프로덕션과 직접 교환합니다.
자동화의 경우 원본 및 대상 슬롯을 명시적으로 지정합니다.
@main을(를) 프로덕션 슬롯을 참조하는 데 사용하세요.
azd appservice swap --src staging --dst @main
azd appservice swap --src @main --dst staging
azd appservice swap --service myapi --src staging --dst @main
다음 패턴을 사용하여 일반적인 릴리스 흐름을 지원합니다.
-
--src staging --dst @main을 사용하여 유효성이 검사된 스테이징 배포를 프로덕션으로 승격합니다. - 를 사용하여 프로덕션을 스테이징 슬롯
--src @main --dst staging으로 다시 교환하여 롤백합니다. - 특정 App Service를 지원하는 서비스를 다중 서비스
azd프로젝트에서--service를 사용하여 대상으로 지정합니다.
교환은 슬롯이 구성된 후 프로덕션을 업데이트하기 위한 경로입니다. 슬롯을 업데이트하려면 azd deploy를 사용하고, 그 슬롯을 프로덕션으로 승격하려면 azd appservice swap를 사용하세요.
권장 배포 슬롯 작업 흐름
- Bicep 템플릿에서 하나 이상의 App Service 배포 슬롯을 정의합니다.
-
azd provision또는azd up을 사용하여 App Service 리소스를 프로비저닝합니다. - 첫 번째 배포가 주 앱 및 모든 슬롯에 대한 기준을 설정하도록 합니다.
- 애플리케이션 업데이트를 나중에 스테이징 슬롯에 배포하려면 두 개 이상의 슬롯이 있을 때
AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME을 설정하거나 메시지가 표시될 때 슬롯을 선택합니다. 슬롯이 있는 경우 CI에서 메인으로 직접 배포를 강제하려면AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS를 대신true로 설정하세요. - 단계적 배포의 유효성을 검사합니다.
- 릴리스를 승격하기 위해
azd appservice swap --src <slot> --dst @main을(를) 실행하십시오. - 필요한 경우 역방향 스왑을 실행하여 롤백합니다.