Развертывание в слотах развертывания Службы приложений Azure с помощью Интерфейса командной строки разработчика Azure

Интерфейс командной строки разработчика Azure (azd) поддерживает слоты развертывания Службы приложений Azure для приложений, размещенных в службе приложений. Вы можете определить слоты в своей инфраструктуре, развернуть код в конкретном слоте и поменять слоты местами, когда будете готовы продвигать релиз.

Используйте этот подход для промежуточных и голубо-зеленых развертываний, смоук-тестирования и откатов без добавления кастомных скриптов развертывания.

Необходимые условия

  • azd Проект, который развертывает службу в Службе приложений Azure.
  • Инфраструктура как код, определяющий ресурсы службы приложений в Bicep.
  • План службы приложений уровня "Стандартный" или вышеS1. Бесплатные, общие и базовые уровни не поддерживают слоты для развертывания.

Определение слота развертывания в 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: {}
}

Если вы используете проверенные модули Azure (AVM), определите модули веб-приложений и модули слотов развертывания в одном и том же развертывании и передайте имя приложения модулю слота.

Развертывание в слоте с помощью azd

Запустите azd up или azd provision и azd deploy как обычно.

azd up

При первом развертывании azd развертывается на рабочем сайте и на всех слотах, определенных в инфраструктуре. Это первое развертывание устанавливает одинаковые базовые показатели для основного приложения и каждого слота.

После первого развертывания azd deploy изменяет способ выбора целевого объекта развертывания, когда существуют слоты. azd Не продолжает развертываться непосредственно в рабочем приложении, если слоты доступны. Вместо этого вы сначала развертываете в слоте, проверяете выпуск, а затем переносите его в рабочую среду для использования в производстве.

Как azd выбирает целевой объект развертывания

** При запуске приложения службы с слотами развертывания azd deploy выбирает целевой слот, проверяя журнал развертывания основного приложения, а затем оценивая доступные слоты.

Поведение работает следующим образом:

  • Если предыдущие развертывания отсутствуют, azd развертывается в основном приложении и всех слотах.
  • Если предыдущие развертывания существуют, и слоты отсутствуют, azd развертывается только в основном приложении.
  • Если существуют предыдущие развертывания и только один слот, azd развертывается только в этом слоте.
  • Если существуют предыдущие развертывания и имеется два или более слота, azd использует слот, указанный переменной среды, или предлагает выбрать один.

Important

После первого развертывания azd не развертывается непосредственно в главном приложении службы приложений при наличии слотов. Это поведение намеренно и помогает предотвратить случайные прямые развертывания на производственные системы. Чтобы обновить рабочую среду, разверните его в слот, а затем переключите его на рабочую среду (@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или определить его непосредственно в системе CI перед запуском azd deploy.

Если служба имеет ровно один слот, 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 и неинтерактивное поведение

При запуске azd deploy --no-prompt или развертывании из CI выбор слотов работает по-разному в зависимости от количества доступных слотов:

Слоты Поведение переменной среды Результат
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 развертывается в указанном слоте, развертывается в главном приложении, если слоты игнорируются, или завершается ошибкой, если целевой объект не может быть выбран.

Если вы автоматизируете развертывания для службы приложений с двумя или более слотами, установите AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME в среде конвейера перед запуском azd deploy. Чтобы принудительно выполнить развертывание direct-to-main из CI, если существуют слоты, установите вместо этого значение AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTStrue .

Замена слотов развертывания Служба приложений Azure

Используйте расширение 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.
  • Цель конкретной службы приложений, поддерживаемой службой приложений, в проекте с несколькими службами azd--service.

Переключение — это рекомендуемый процесс обновления продукции после настройки слотов. Используйте azd deploy для обновления слота, а затем используйте azd appservice swap для перевода этого слота в эксплуатацию.

  1. Определите один или несколько слотов развертывания для Azure App Service в ваших шаблонах на языке Bicep.
  2. Развертывание ресурсов службы приложений с помощью azd provision или azd up.
  3. Пусть первое развертывание устанавливает базовые показатели для основного приложения и каждого слота.
  4. Разверните последующие обновления приложений в промежуточном слоте, указав AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME если у вас два или более слотов, или выбрав слот при появлении соответствующего запроса. Чтобы принудительно выполнить развертывание direct-to-main из CI, если существуют слоты, установите вместо этого значение AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTStrue .
  5. Проверьте поэтапное развертывание.
  6. Запустите azd appservice swap --src <slot> --dst @main, чтобы продвинуть выпуск.
  7. При необходимости выполните обратное преобразование, чтобы отменить изменения.