第四階段 — 拆除
第四階段依照反向相依順序,移除演練過程中所建立的所有物件。本階段在執行任何破壞性操作前,需要人工明確確認。
依反向建立順序移除物件 — 先刪除相依於其他物件的物件:
- 已緩解網域 — 刪除第三階段所建立的所有 CSD 已緩解網域
- HTTPS 負載平衡器 (
${F5XC_LB_NAME}-https) — 縮減為骨架狀態(保留 Let’s Encrypt 憑證);若NAMESPACE_CREATED=true或明確要求時,執行完整 DELETE - HTTP 負載平衡器 (
${F5XC_LB_NAME}-http) — 相依於來源集區 - 來源集區 — 相依於健康檢查(若已建立)
- DNS 區域清理 — HTTPS LB 骨架會保留其受管理的 A 記錄與 ACME 記錄(此為預期行為 — 可保持憑證有效)。HTTP LB 受管理的記錄會於刪除時自動清理。
default_rr_set_group中的手動記錄需透過PUT進行手動清理 - 健康檢查 — 僅限第一階段步驟 1 中已建立者
- 受保護網域 — 刪除 CSD 受保護網域登錄
- 命名空間 — 僅限第一階段步驟 0 期間所建立者(
NAMESPACE_CREATED=true)
刪除已緩解網域
Section titled “刪除已緩解網域”若已執行第三階段,請在移除基礎架構物件之前先刪除所有已緩解網域。標準模擬會建立 6 個已緩解網域:
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驗證:列出已緩解網域,確認數量為 0(或 1,請參閱以下備註):
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq '{count: (.items | length)}'HTTPS 負載平衡器
Section titled “HTTPS 負載平衡器”HTTPS LB 的拆除行為取決於命名空間是否於本次示範工作階段期間建立(來自第一階段步驟 0 的 NAMESPACE_CREATED 變數):
NAMESPACE_CREATED=false(預先存在的命名空間)— 縮減為骨架狀態,保留 Let’s Encrypt 憑證以供重複使用NAMESPACE_CREATED=true(示範期間建立的命名空間)— 執行完整 DELETE,因為命名空間本身將被刪除,憑證無法保留
路徑 A:縮減為骨架(預先存在的命名空間)
Section titled “路徑 A:縮減為骨架(預先存在的命名空間)”當命名空間為預先存在時,將 HTTPS LB 縮減為骨架狀態 — 移除來源集區參考與 CSD 設定,同時保留網域繫結、https_auto_cert 設定及 Let’s Encrypt 憑證。此舉可避免在下次示範執行時觸發新的憑證申請(Let’s Encrypt 對每個精確識別符集合在 7 天內強制執行最多 5 份重複憑證的限制)。
步驟 1 — 取得目前的 HTTPS LB 設定:
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")步驟 2 — 透過 jq 縮減為骨架並 PUT 回去:
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 .此 jq 過濾器會保留完整規格(網域、https_auto_cert、advertise_on_public_default_vip 及所有已停用的功能旗標),同時移除 client_side_defense(以 disable_client_side_defense: {} 取代),並將 default_route_pools 清空為空陣列。憑證與 DNS 繫結維持不變。
驗證 HTTPS LB 現已為骨架狀態:
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 }'預期結果:has_origin_pools: false、has_csd: false、domains 仍有資料、cert_state 不變(例如 CertificateValid)。
路徑 B:完整刪除(示範期間建立的命名空間)
Section titled “路徑 B:完整刪除(示範期間建立的命名空間)”當命名空間於本次示範工作階段期間建立時,必須完整刪除 HTTPS LB — 由於命名空間本身將於拆除結束時移除,保留骨架已無必要。
curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https"驗證:GET /api/config/namespaces/\{namespace\}/http_loadbalancers 的結果中不應包含 ${F5XC_LB_NAME}-https。
刪除 HTTP 負載平衡器
Section titled “刪除 HTTP 負載平衡器”刪除主要 HTTP LB:
curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http"驗證:GET /api/config/namespaces/\{namespace\}/http_loadbalancers 的結果中不應包含 ${F5XC_LB_NAME}-http。若 DELETE 回傳 200 後,物件仍出現於清單中,請等待 30 秒後再確認一次。若第二次確認後仍存在,請回報給操作員 — 請勿繼續進行。
刪除來源集區
Section titled “刪除來源集區”curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx"驗證:GET /api/config/namespaces/\{namespace\}/origin_pools 的結果中不應包含該集區名稱。若 DELETE 回傳 200 後,物件仍出現於清單中,請等待 30 秒後再確認一次。若第二次確認後仍存在,請回報給操作員。
刪除健康檢查
Section titled “刪除健康檢查”curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks/xF5XC_HC_NAMEx"驗證:GET /api/config/namespaces/\{namespace\}/healthchecks 的結果中不應包含該健康檢查名稱。若 DELETE 回傳 200 後,物件仍出現於清單中,請等待 30 秒後再確認一次。若第二次確認後仍存在,請回報給操作員。
刪除受保護網域
Section titled “刪除受保護網域”刪除 CSD 受保護網域登錄。受保護網域屬於租戶範圍(非命名空間範圍),但它是與本次部署綁定的 CSD 設定物件 — 並非像 DNS 區域那樣的共用基礎架構。
curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains/xF5XC_ROOT_DOMAINx"驗證:列出受保護網域,確認該網域已不再登錄:
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)'刪除命名空間(條件性)
Section titled “刪除命名空間(條件性)”此步驟僅在命名空間於第一階段步驟 0 期間建立(NAMESPACE_CREATED=true)時執行。若命名空間為預先存在(NAMESPACE_CREATED=false),請完全跳過此步驟 — 命名空間屬於共用基礎架構,不得刪除。
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驗證:確認命名空間已不存在:
curl -s -o /dev/null -w '%\{http_code\}' \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx"預期結果:若 NAMESPACE_CREATED=true 則回傳 404,若 NAMESPACE_CREATED=false 則回傳 200。
第四階段證據摘要
Section titled “第四階段證據摘要”| 物件 | 刪除狀態 | 驗證狀態 |
|---|---|---|
| 已緩解網域(6 個) | 全部 200(空 \{\})或若第三階段未執行則跳過 | 數量為 0(或 1 個幽靈)— 通過 |
HTTPS 負載平衡器(-https) | 200(骨架 PUT)或 200(若 NAMESPACE_CREATED=true 則完整 DELETE) | 骨架已驗證或不在清單中 — 通過 |
HTTP 負載平衡器(-http) | 200(空 \{\}) | 不在清單中 — 通過 |
| 來源集區 | 200(空 \{\}) | 不在清單中 — 通過 |
| 健康檢查 | 200(空 \{\})或跳過 | 不在清單中 — 通過 |
| 受保護網域 | 200(空 \{\}) | 不在清單中 — 通過 |
| DNS 區域 | 未刪除(共用基礎架構) | 區域仍存在 — 通過 |
| 命名空間 | 若 NAMESPACE_CREATED=true 則 200(串聯刪除),否則跳過 | 若已刪除則 404,若已保留則 200 — 通過 |
拆除完成。 當命名空間為預先存在(NAMESPACE_CREATED=false)時,除 HTTPS LB 骨架外,所有部署物件均已移除;骨架保留 Let’s Encrypt 憑證與網域繫結,供下次示範執行使用。當命名空間於示範期間建立(NAMESPACE_CREATED=true)時,包含 HTTPS LB 與命名空間在內的所有物件均已完整刪除。兩種情況下,DNS 區域及其非受管理記錄均維持完整。