Deployment Slots no App Service: Swap sem Downtime

Publicar uma versão nova do App Service direto em produção é sempre um momento de tensão: se algo der errado, os usuários sentem na hora. Deployment Slots no App Service resolvem isso com uma técnica simples — subir a versão nova num ambiente isolado, aquecer a aplicação e só então trocar o tráfego, sem downtime e com rollback praticamente instantâneo.

Neste guia rápido você vai ver como criar um slot de staging, publicar o deploy nele, marcar configurações que não devem trocar de ambiente (as chamadas slot settings) e executar o swap com preview — a forma recomendada de trocar produção sem surpresas. Tudo via Azure CLI, sem depender de Terraform ou de portal.

Sumário

Pré-requisitos

Deployment Slots no App Service só existem nos planos Standard, Premium ou Isolated — não estão disponíveis no Free, Shared nem Basic. Se o seu App Service estiver num desses planos menores, o primeiro passo é fazer o scale up:

az appservice plan update \
    --name plan-meuapp \
    --resource-group rg-appservice-lab \
    --sku S1

Criando o slot de staging

Com --configuration-source o slot novo já nasce clonado das configurações do slot de produção, evitando divergência de app settings logo de cara:

az webapp deployment slot create \
    --name meuapp-prod \
    --resource-group rg-appservice-lab \
    --slot staging \
    --configuration-source meuapp-prod

az webapp deployment slot list \
    --name meuapp-prod \
    --resource-group rg-appservice-lab \
    -o table

Cada slot ganha sua própria URL de teste (meuapp-prod-staging.azurewebsites.net), então dá pra validar o deploy isoladamente antes de qualquer troca de tráfego.

Publicando o deploy no slot

O comando az webapp deploy é a forma unificada de publicar (zip, war, jar ou pasta), e aceita --slot pra mandar direto pro staging em vez de produção:

az webapp deploy \
    --name meuapp-prod \
    --resource-group rg-appservice-lab \
    --slot staging \
    --src-path ./app.zip \
    --type zip

Nesse ponto, produção continua intocada — quem visita meuapp-prod.azurewebsites.net nem percebe que existe uma versão nova esperando no staging.

Slot settings: o que não deve trocar no swap

Por padrão, o swap troca tudo — código, app settings e connection strings vão junto. Isso é um problema pra valores que precisam ficar fixos por ambiente, como a connection string do banco de staging. A solução é marcar o setting como “deployment slot setting” (sticky), com --slot-settings em vez de --settings:

az webapp config appsettings set \
    --name meuapp-prod \
    --resource-group rg-appservice-lab \
    --slot staging \
    --slot-settings ENVIRONMENT=staging DB_CONNECTION="Server=stg-db;..."

Settings marcados como slot setting ficam presos ao slot, não à versão do código — mesmo depois do swap, o slot que virou “staging” continua com ENVIRONMENT=staging. Sem isso, um swap acidentalmente aponta produção pra um banco de teste, e isso já derrubou aplicação de gente que não sabia dessa regra.

Swap com preview (warm-up antes de trocar)

Um swap direto já é rápido e sem downtime — o App Service aquece as instâncias do slot de destino antes de rotear tráfego. Mas em aplicações com inicialização pesada (cache, conexões de pool, JIT), o swap com preview (multi-phase swap) é mais seguro: ele aplica a configuração final no staging sem trocar o tráfego ainda, dando espaço pra validar antes do “vai valer”:

# Fase 1: aplica a config de produção no staging, mas mantém o tráfego como está
az webapp deployment slot swap \
    --name meuapp-prod \
    --resource-group rg-appservice-lab \
    --slot staging \
    --target-slot production \
    --action preview

# valide em meuapp-prod-staging.azurewebsites.net com a config real de produção...

# Fase 2: completa o swap (agora sim troca o tráfego)
az webapp deployment slot swap \
    --name meuapp-prod \
    --resource-group rg-appservice-lab \
    --slot staging \
    --target-slot production \
    --action swap

O equivalente em PowerShell usa o cmdlet Switch-AzWebAppSlot, com o parâmetro -SwapWithPreviewAction controlando a mesma lógica de duas fases:

Switch-AzWebAppSlot -ResourceGroupName rg-appservice-lab -Name meuapp-prod `
    -SourceSlotName staging -DestinationSlotName production `
    -SwapWithPreviewAction ApplySlotConfig

Switch-AzWebAppSlot -ResourceGroupName rg-appservice-lab -Name meuapp-prod `
    -SourceSlotName staging -DestinationSlotName production `
    -SwapWithPreviewAction CompleteSlotSwap

Rollback: desfazendo um swap

A maior vantagem do swap é que ele não apaga nada — só troca os apontamentos. Se algo passar despercebido na validação e aparecer só depois em produção, o rollback é o mesmo comando, na direção contrária:

az webapp deployment slot swap \
    --name meuapp-prod \
    --resource-group rg-appservice-lab \
    --slot production \
    --target-slot staging

Isso volta a versão anterior pra produção em segundos — muito mais rápido que um redeploy a partir do zero.

Troubleshooting comum de Deployment Slots no App Service

Problemas mais frequentes de quem está começando com Deployment Slots no App Service:

SintomaCausaSolução
Operation not allowed on Free/Shared/Basic tierPlano abaixo de StandardScale up pra S1 ou superior antes de criar o slot
Connection string de staging aparece em produção após o swapSetting não marcado como stickyRecriar com --slot-settings em vez de --settings
App fica lento logo após o swapSwap direto sem warm-up em app com boot pesadoUsar swap com preview (--action preview antes de --action swap)
Swap operation already in progressUm swap anterior ainda não terminouAguardar conclusão ou checar az webapp deployment list-publishing-profiles pra confirmar o estado

Conclusão

Com Deployment Slots no App Service, o deploy deixa de ser um evento arriscado: você publica isolado, aquece com o swap em preview, valida com calma e só então troca o tráfego — e se precisar voltar atrás, é o mesmo comando ao contrário. Pra times que ainda fazem deploy direto em produção, esse é um dos ajustes de maior retorno com menor esforço no App Service.

Referências oficiais

Interessado em saber mais sobre artigos relacionados ao Microsoft Azure CLIQUE AQUI

🚀 Vamos nos conectar?

Não perca nenhuma oportunidade! Cadastre-se nas minhas redes e no canal do YouTube para receber conteúdos de TI, Cloud, Azure, Kubernetes e DevOps em primeira mão.

Dica: No Facebook, todos os artigos do blog são publicados automaticamente. Vale a pena curtir!


💬 Dúvidas ou Problemas?

Com o intuito de ajudar a comunidade, caso você tenha dúvidas ou encontre problemas na execução dos comandos deste artigo, deixe um comentário abaixo. Responderei o mais breve possível!

Muito obrigado pela visita e até o próximo post!

Jefferson Castilho Especialista em Cloud & DevOps.

Este guia técnico é exclusivo do Blog do Castilho. Explore mais conteúdos sobre Cloud e DevOps.

 

Deixe uma resposta

Descubra mais sobre Blog do Castilho - Tecnologia | FinOps | DevOps | Cloud

Assine agora mesmo para continuar lendo e ter acesso ao arquivo completo.

Continuar lendo