Desafio 6: Sync Windows + Break-glass

Configurar janelas de sincronização em um AppProject para bloquear deploys em produção durante o horário comercial, e executar um procedimento de break-glass para forçar um deploy de emergência fora da janela.

Em ambientes de produção, deploys não controlados durante o horário de pico são um risco operacional. O ArgoCD resolve isso com Sync Windows - regras de tempo configuradas no AppProject que controlam quando aplicações podem ou não ser sincronizadas.

Existem dois tipos:

  • allow - sync só acontece dentro dessa janela
  • deny - sync é bloqueado durante essa janela

No self-managed ArgoCD, você poderia ajustar isso via argocd-cm ConfigMap. No EKS Capabilities, esse ConfigMap não é acessível - a única forma suportada é via spec.syncWindows no AppProject. Isso é um diferencial importante de operação.

O break-glass é o procedimento de emergência: forçar um sync mesmo com a janela bloqueada. No ArgoCD, isso é feito com a flag --bypass-sync-window no CLI, disponível apenas para usuários com role ADMIN.

Limitação importante: O sync timeout no EKS Capabilities é fixo em 120 segundos e não é configurável. Para workloads que demoram mais de 2 minutos para subir (ex: jobs de migração de banco), planeje estratégias alternativas como health checks customizados ou sync manual em etapas. Referência: Comparing EKS Capability for Argo CD to self-managed Argo CD 

  • AppProject production com deny window de segunda a sexta, das 8h às 18h
  • Aplicação associada ao projeto production com sync automático habilitado
  • Simular um commit durante a janela bloqueada e observar o sync bloqueado na UI
  • Executar break-glass via CLI para forçar o deploy

Configure o AppProject com a Sync Window e valide o comportamento de bloqueio. Em seguida, use o procedimento de break-glass para forçar o sync.

Dica: O cron da Sync Window usa o formato padrão. 0 8 * * 1-5 significa “às 8h de segunda a sexta”. A duração é em horas: 10h cobre das 8h às 18h.

1. AppProject com Sync Window

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production
  namespace: argocd
spec:
  description: "Projeto de produção com janela de deploy controlada"
  sourceRepos:
  - '*'
  destinations:
  - namespace: '*'
    server: '*'
  sourceNamespaces:
  - argocd
  clusterResourceWhitelist:
  - group: '*'
    kind: '*'
  syncWindows:
  - kind: deny
    schedule: "0 8 * * 1-5"
    duration: 10h
    applications:
    - "*"
    namespaces:
    - "*"
    clusters:
    - "*"
    manualSync: false
kubectl apply -f production-project.yaml

2. Aplicação associada ao projeto production

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: minha-app-prod
  namespace: argocd
spec:
  project: production
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    path: guestbook
    targetRevision: HEAD
  destination:
    name: in-cluster
    namespace: guestbook
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

3. Validar bloqueio

Durante a janela de deny, qualquer commit no repositório não vai disparar sync automático. Na UI do ArgoCD, a aplicação aparece com status OutOfSync mas sem tentar sincronizar. Você verá a mensagem de sync window ativa.

# Verificar sync windows ativas
argocd proj windows list production

4. Break-glass - forçar sync fora da janela

# Requer role ADMIN no ArgoCD
argocd app sync minha-app-prod --bypass-sync-window

Na UI: Application > Sync > selecionar "Bypass Sync Window" (disponível apenas para admins).

5. Sync Window com janela de manutenção (allow)

Para permitir deploys apenas em janelas específicas, use kind: allow:

syncWindows:
- kind: allow
  schedule: "0 22 * * 5"   # sexta às 22h
  duration: 6h              # até sábado às 4h
  applications:
  - "*"

Se manualSync: true na Sync Window, syncs manuais ainda são permitidos durante o bloqueio - apenas o sync automático é bloqueado. Útil para equipes que precisam de flexibilidade operacional sem abrir o break-glass completo.


Por padrão, o ArgoCD EKS Capability faz polling dos repositórios a cada 6 minutos - diferente do self-managed que é 3 minutos. Para ambientes onde velocidade de feedback importa, configure webhooks para sync em segundos.

O endpoint do webhook no EKS Capabilities segue o padrão:

https://<seu-argocd-server>.eks-capabilities.<region>.amazonaws.com/api/webhook

Dica: A URL completa do seu ArgoCD está disponível no EKS Console em Clusters → Capabilities → Argo CD, ou via CLI:

aws eks describe-capability \
  --cluster-name meu-cluster \
  --capability-name meu-cluster-argocd \
  --query 'capability.configuration.argoCd.serverUrl' \
  --output text

GitHub:

  1. No repositório → Settings → Webhooks → Add webhook
  2. Payload URL: https://<argocd-server>/api/webhook
  3. Content type: application/json
  4. Events: “Just the push event”

GitLab:

  1. No projeto → Settings → Webhooks
  2. URL: https://<argocd-server>/api/webhook
  3. Trigger: “Push events”

CodeCommit via EventBridge:

{
  "source": ["aws.codecommit"],
  "detail-type": ["CodeCommit Repository State Change"],
  "detail": {
    "event": ["referenceUpdated"],
    "repositoryName": ["meu-repo"]
  }
}

Target: API Destination apontando para https://<argocd-server>/api/webhook com método POST.

Validar:

Faça um commit e observe na UI do ArgoCD - a aplicação deve entrar em sync em segundos, não em até 6 minutos.

Webhooks complementam o polling - não o substituem. O ArgoCD continua fazendo polling como fallback caso uma notificação seja perdida.

Referência: Webhook configuration for faster sync 

  • Configurar Sync Windows por namespace para granularidade maior
  • Integrar com EventBridge para notificar o time quando break-glass é acionado
  • Combinar com AppProject RBAC para restringir quem pode fazer break-glass