Pular para o conteúdo

Fase 4 — Desmontagem

A Fase 4 remove todos os objetos criados durante o exercício na ordem inversa de dependência. Esta fase requer confirmação humana explícita antes de qualquer operação destrutiva.

Remova os objetos na ordem inversa de criação — exclua primeiro os objetos que dependem de outros objetos:

  1. Domínios Mitigados — excluir todos os domínios mitigados CSD criados na Fase 3
  2. HTTPS Load Balancer (${F5XC_LB_NAME}-https) — reduzir ao esqueleto (preservar certificado Let’s Encrypt); DELETE completo se NAMESPACE_CREATED=true ou mediante solicitação explícita
  3. HTTP Load Balancer (${F5XC_LB_NAME}-http) — depende do Origin Pool
  4. Origin Pool — depende do Healthcheck (se criado)
  5. Limpeza de zona DNS — o esqueleto do HTTPS LB retém seus registros A gerenciados e registros ACME (isso é desejado — mantém o certificado válido). Os registros gerenciados do HTTP LB são limpos automaticamente na exclusão. Os registros manuais em default_rr_set_group precisam de limpeza manual via PUT
  6. Healthcheck — somente se criado na Fase 1 Etapa 1
  7. Domínio Protegido — excluir o registro de domínio protegido CSD
  8. Namespace — somente se criado durante a Fase 1 Etapa 0 (NAMESPACE_CREATED=true)

Se a Fase 3 foi executada, exclua todos os domínios mitigados antes de remover os objetos de infraestrutura. A simulação padrão cria 6 domínios mitigados:

Terminal window
for domain in cdn.jsdelivr.net esm.sh unpkg.com ga.jspm.io httpbin.org jsonplaceholder.typicode.com; do
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains/$domain"
done

Verificação: Liste os domínios mitigados para confirmar que a contagem é 0 (ou 1 — veja a nota abaixo):

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq '{count: (.items | length)}'

O comportamento de desmontagem do HTTPS LB depende de se o namespace foi criado durante esta sessão de demonstração (variável NAMESPACE_CREATED da Fase 1 Etapa 0):

  • NAMESPACE_CREATED=false (namespace pré-existente) — reduzir ao estado de esqueleto, preservando o certificado Let’s Encrypt para reutilização
  • NAMESPACE_CREATED=true (namespace criado durante a demonstração) — DELETE completo, pois o próprio namespace será excluído e o certificado não pode ser preservado

Caminho A: Reduzir ao Esqueleto (Namespace Pré-existente)

Seção intitulada “Caminho A: Reduzir ao Esqueleto (Namespace Pré-existente)”

Quando o namespace é pré-existente, reduza o HTTPS LB ao estado de esqueleto — remova a referência ao origin pool e a configuração CSD, preservando o vínculo de domínio, as configurações https_auto_cert e o certificado Let’s Encrypt. Isso evita acionar uma nova solicitação de certificado na próxima execução da demonstração (o Let’s Encrypt impõe um limite de 5 certificados duplicados por conjunto exato de identificadores a cada 7 dias).

Etapa 1 — GET da configuração atual do HTTPS LB:

Terminal window
HTTPS_LB_JSON=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https")

Etapa 2 — Reduzir ao esqueleto via jq e aplicar PUT:

Terminal window
echo "$HTTPS_LB_JSON" | jq '{
metadata: .metadata,
spec: (.spec | del(.client_side_defense) | .disable_client_side_defense = {} | .default_route_pools = [])
}' | curl -s -X PUT \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d @- \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq .

O filtro jq preserva toda a spec (domínios, https_auto_cert, advertise_on_public_default_vip e todos os sinalizadores de funcionalidades desativados) enquanto remove client_side_defense (substituído por disable_client_side_defense: {}) e limpa default_route_pools para um array vazio. O certificado e os vínculos DNS permanecem intactos.

Verificação de que o HTTPS LB está agora como esqueleto:

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq '{
name: .metadata.name,
domains: .spec.domains,
has_origin_pools: ((.spec.default_route_pools // []) | length > 0),
has_csd: (.spec.client_side_defense != null),
cert_state: .spec.cert_state
}'

Esperado: has_origin_pools: false, has_csd: false, domains ainda preenchido, cert_state inalterado (ex.: CertificateValid).

Caminho B: DELETE Completo (Namespace Criado Durante a Demonstração)

Seção intitulada “Caminho B: DELETE Completo (Namespace Criado Durante a Demonstração)”

Quando o namespace foi criado durante esta sessão de demonstração, o HTTPS LB deve ser completamente excluído — a preservação do esqueleto é desnecessária porque o próprio namespace será removido no final da desmontagem.

Terminal window
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https"

Verificação: GET /api/config/namespaces/\{namespace\}/http_loadbalancers não deve conter ${F5XC_LB_NAME}-https.

Exclua o HTTP LB principal:

Terminal window
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http"

Verificação: GET /api/config/namespaces/\{namespace\}/http_loadbalancers não deve conter ${F5XC_LB_NAME}-http. Se o objeto ainda aparecer na lista após o DELETE retornar 200, aguarde 30 segundos e verifique novamente. Se ainda estiver presente após a segunda verificação, informe ao operador — não prossiga.

Terminal window
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx"

Verificação: GET /api/config/namespaces/\{namespace\}/origin_pools não deve conter o nome do pool. Se o objeto ainda aparecer na lista após o DELETE retornar 200, aguarde 30 segundos e verifique novamente. Se ainda estiver presente após a segunda verificação, informe ao operador.

Terminal window
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks/xF5XC_HC_NAMEx"

Verificação: GET /api/config/namespaces/\{namespace\}/healthchecks não deve conter o nome do healthcheck. Se o objeto ainda aparecer na lista após o DELETE retornar 200, aguarde 30 segundos e verifique novamente. Se ainda estiver presente após a segunda verificação, informe ao operador.

Exclua o registro de domínio protegido CSD. O domínio protegido tem escopo de tenant (não de namespace), mas é um objeto de configuração CSD vinculado a esta implantação — não é uma infraestrutura compartilhada como a zona DNS.

Terminal window
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains/xF5XC_ROOT_DOMAINx"

Verificação: Liste os domínios protegidos para confirmar que o domínio não está mais registrado:

Terminal window
curl -s -X GET \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \
| jq '.items // [] | map(.metadata.name)'

Esta etapa é executada somente se o namespace foi criado durante a Fase 1 Etapa 0 (NAMESPACE_CREATED=true). Se o namespace era pré-existente (NAMESPACE_CREATED=false), ignore esta etapa completamente — o namespace é uma infraestrutura compartilhada que não deve ser excluída.

Terminal window
if [ "$NAMESPACE_CREATED" = "true" ]; then
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"name": "xF5XC_NAMESPACEx"}' \
"xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx/cascade_delete" | jq .
fi

Verificação: Confirme que o namespace não existe mais:

Terminal window
curl -s -o /dev/null -w '%\{http_code\}' \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx"

Esperado: 404 se NAMESPACE_CREATED=true, 200 se NAMESPACE_CREATED=false.

ObjetoStatus de ExclusãoStatus de Verificação
Domínios Mitigados (6)Todos 200 (vazio \{\}) ou ignorado se a Fase 3 não foi executadaContagem 0 (ou 1 fantasma) — APROVADO
HTTPS Load Balancer (-https)200 (PUT esqueleto) ou 200 (DELETE completo se NAMESPACE_CREATED=true)Esqueleto verificado ou não na lista — APROVADO
HTTP Load Balancer (-http)200 (vazio \{\})Não na lista — APROVADO
Origin Pool200 (vazio \{\})Não na lista — APROVADO
Healthcheck200 (vazio \{\}) ou ignoradoNão na lista — APROVADO
Domínio Protegido200 (vazio \{\})Não na lista — APROVADO
Zona DNSNÃO excluída (infraestrutura compartilhada)Zona ainda existe — APROVADO
Namespace200 (exclusão em cascata) se NAMESPACE_CREATED=true, ignorado caso contrário404 se excluído, 200 se preservado — APROVADO

Desmontagem concluída. Quando o namespace era pré-existente (NAMESPACE_CREATED=false), todos os objetos de implantação foram removidos, exceto o esqueleto do HTTPS LB, que preserva o certificado Let’s Encrypt e o vínculo de domínio para a próxima execução da demonstração. Quando o namespace foi criado durante a demonstração (NAMESPACE_CREATED=true), todos os objetos, incluindo o HTTPS LB e o namespace, foram completamente excluídos. A zona DNS e seus registros não gerenciados permanecem intactos em ambos os casos.