Azure Developer CLI를 사용하여 Azure App Service 배포 슬롯에 배포

Azure 개발자 CLI(azd)는 App Service에서 호스트되는 앱에 대한 Azure App Service 배포 슬롯을 지원합니다. 인프라에서 슬롯을 정의하고, 특정 슬롯에 코드를 배포한 후, 릴리스를 승격할 준비가 되면 슬롯을 교환할 수 있습니다.

사용자 지정 배포 스크립트를 추가하지 않고 스테이징, 청록색 배포, 스모크 테스트 및 롤백에 이 방법을 사용합니다.

사전 요구 사항

  • azd Azure 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를 사용하세요.

  1. Bicep 템플릿에서 하나 이상의 App Service 배포 슬롯을 정의합니다.
  2. azd provision 또는 azd up을 사용하여 App Service 리소스를 프로비저닝합니다.
  3. 첫 번째 배포가 주 앱 및 모든 슬롯에 대한 기준을 설정하도록 합니다.
  4. 애플리케이션 업데이트를 나중에 스테이징 슬롯에 배포하려면 두 개 이상의 슬롯이 있을 때 AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME을 설정하거나 메시지가 표시될 때 슬롯을 선택합니다. 슬롯이 있는 경우 CI에서 메인으로 직접 배포를 강제하려면 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS를 대신 true로 설정하세요.
  5. 단계적 배포의 유효성을 검사합니다.
  6. 릴리스를 승격하기 위해 azd appservice swap --src <slot> --dst @main을(를) 실행하십시오.
  7. 필요한 경우 역방향 스왑을 실행하여 롤백합니다.