Przejdź do głównej zawartości

Odzyskiwanie po awarii z AI

Odzyskiwanie po awarii w pracy z agentami AI obejmuje dwa promienie rażenia: zmianę wypuszczoną przez agenta, cofaną checkpointami, odwracalnymi commitami, feature flagami i celowanymi revertami, oraz infrastrukturę pod spodem, odtwarzaną runbookami PITR, kopiami zapasowymi i przećwiczonym failoverem. Oba wymagają celów odtwarzania ustalonych z góry, prób, które je mierzą, i człowieka przy każdym nieodwracalnym kroku.

Ten przewodnik jest dla programisty, który ma dyżur, i dla tech leada odpowiedzialnego za plan odtwarzania usługi. Scenariusz, na który cię przygotowuje: agent refaktoryzuje moduł uwierzytelniania w 47 plikach, testy przechodzą, scalasz, a dwie godziny później API administracyjne przestaje walidować tokeny sesji, a na wierzchu leżą już trzy kolejne PR-y. Miesiąc później główny region gaśnie w trakcie wdrożenia, a runbook dla Postgresa wskazuje host wycofany wiosną.

  • Tabelę celów odtwarzania (RTO i RPO dla każdego poziomu usług), dzięki której każdy kolejny artefakt da się przetestować
  • Ustawienia dla każdego narzędzia i dwa prompty, które utrzymują dużą zmianę agenta odwracalną commit po commicie
  • Procedurę „najpierw revert” dla scalonej zmiany agenta, która szkodzi produkcji, wraz z promptem, który ją prowadzi
  • Prompt generujący runbook odtwarzania Postgresa do punktu w czasie (PITR) z twojej prawdziwej konfiguracji pgBackRest oraz zaplanowane zadanie agenta tylko do odczytu, które zatrzymuje CI błędem, gdy runbook rozjedzie się z konfiguracją
  • Próbę failoveru w Chaos Mesh z kryteriami zaliczenia mierzonymi względem RTO i RPO oraz wskazaną osobą, która podpisuje wynik
  • Prompt do failoveru z bramką człowieka, prompt do post-mortemu bez szukania winnych i tryby awarii, które po cichu psują plany odtwarzania

Zanim wybierzesz narzędzie, nazwij promień rażenia. Oba rodzaje awarii wymagają innej mechaniki, ale tej samej dyscypliny.

Zmiana agentaInfrastruktura
Promień rażeniaCommit, PR lub wdrożenieBaza danych, klaster lub region i wszystko, co na nich stoi
Mechanizm odtwarzaniaCheckpoint, git revert, przełączenie feature flagi, minimalny hotfixOdtworzenie z kopii, promocja repliki, failover regionu
MiaraCzas od alertu do wycofania zmianyRTO (czas do przywrócenia usługi) i RPO (ile danych możesz stracić)
Co decyduje o sukcesieCzy zmiana była na tyle mała, żeby dało się ją czysto cofnąćCzy procedurę przećwiczono na prawdziwej topologii
Kto zatwierdza nieodwracalny krokDyżurny inżynier odpowiedzialny za usługęIncident commander

Na obu poziomach agent przygotowuje, sprawdza i wyjaśnia. Każdy krok, którego nie da się cofnąć – force-push, odtworzenie danych, promocję repliki, przełączenie DNS – zatwierdza człowiek.

Każdy artefakt poniżej zależy od dwóch liczb dla każdego poziomu usług. Runbook, którego celem jest „szybkie odtwarzanie”, nie może zakończyć się niepowodzeniem. Runbook z celem „RTO 15 minut, RPO 5 minut dla płatności” – może. Zacznij od tego szablonu i wpisz wartości zatwierdzone przez biznes:

PoziomPrzykładowe usługiRTORPOSposób tworzenia kopii
Krytycznyuwierzytelnianie, płatności15 min0–5 minReplika strumieniowa i ciągła archiwizacja WAL
Wysokigłówne API1 godz.5 minArchiwizacja WAL i częste kopie bazowe
Średnifunkcje drugorzędne4 godz.1 godz.Snapshoty co godzinę
Niskinarzędzia wewnętrzne24 godz.24 godz.Kopie dzienne

Dodaj tabelę do repozytorium (commit) obok runbooków, na przykład jako ops/recovery-objectives.md, żeby każdy prompt poniżej mógł wskazać ją agentowi zamiast powtarzać liczby.

Zadbaj, by zmianę agenta dało się cofnąć, zanim trafi do main

Dział zatytułowany „Zadbaj, by zmianę agenta dało się cofnąć, zanim trafi do main”

Najtańsze odtwarzanie to takie, które przygotujesz, zanim agent zacznie pracę. Każde narzędzie ma lokalne cofanie edycji agenta, ale żadne nie zastępuje Gita: checkpoint istnieje na jednej maszynie, nie obejmuje niektórych rodzajów zmian i nigdy nie obejmuje tego, co już scalono.

Claude Code zapisuje checkpoint swoich edycji plików przed każdym wysłanym promptem. Uruchom /rewind albo naciśnij dwa razy Esc przy pustym polu promptu i wybierz, czy przywrócić kod, rozmowę, czy jedno i drugie. Checkpointy nie śledzą plików zmienionych przez polecenia Bash, takie jak rm czy skrypt migracji, więc zrób commit, zanim pozwolisz agentowi uruchomić cokolwiek destrukcyjnego. Stare checkpointy są usuwane automatycznie, więc nie traktuj ich jak archiwum.

Trwałe reguły umieść w CLAUDE.md. Od v2.1.277 w kanale latest Claude Code czyta też AGENTS.md, gdy projekt nie ma CLAUDE.md; na Bedrocku, Google Cloud, Foundry i bramach LLM wymaga to v2.1.281. Treść reguł jest w bloku pod tymi zakładkami.

Same reguły bezpieczeństwa są identyczne we wszystkich trzech narzędziach:

## Change safety
- Work on a branch named agent/<task>. Never commit to main. Never force-push.
- Before a change that touches more than 10 files, list the files and wait for approval.
- Commit after each step that passes `npm test` and `npm run typecheck`. One logical step per commit.
- Never delete a file, edit a migration that has run, or change *.config.*, .env*, Dockerfile
or infra/ without showing the diff and waiting for approval.
- If a test fails after a step, revert that step's commit and report why. Do not fix forward.

Dwa nawyki odróżniają dwuminutowy revert od popołudnia rozplątywania commitów: commituj kroki, z których każdy przechodzi testy, i zanim zacznie się przepisywanie, utrwal obecne zachowanie w testach.

Krok z mutacją pokazuje, że testy w ogóle potrafią wykryć błąd. Zestaw testów utrwalających, który zostaje zielony, gdy psujesz kod, niczego nie chroni. Pełną technikę opisuje strona o testach charakteryzujących.

Wycofaj zmianę agenta, która już trafiła na produkcję

Dział zatytułowany „Wycofaj zmianę agenta, która już trafiła na produkcję”

Gdy scalona zmiana szkodzi produkcji, szybkość jest ważniejsza od elegancji. Działaj w tej kolejności i zatrzymaj się na pierwszym kroku, który przywraca usługę:

  1. Przełącz flagę. Jeśli zmiana wyszła za feature flagą, wyłącz ją. Dlatego zmiany pisane przez agentów powinny wychodzić za flagami i przez canary; konfigurację opisuje strona o progressive delivery.

  2. Cofnij merge (git revert). Cofnij commit scalający na main i pozwól CI go wdrożyć:

    Okno terminala
    # Terminal: znajdź commit scalający PR, a potem go cofnij (zachowując rodzica z main)
    git log --merges --oneline -20
    git revert -m 1 MERGE_SHA

    MERGE_SHA to commit scalający z logu. Jeśli PR scalono metodą squash, znajdź jego commit przez git log --oneline i uruchom git revert SHA bez -m 1. Jeśli późniejsze PR-y zależą od kodu agenta i revert wywołuje konflikty, przejdź do kroku 3 zamiast rozplątywać historię w trakcie incydentu.

  3. Wypuść minimalny hotfix. Przywróć zachowanie sprzed awarii i nie zmieniaj niczego więcej; właściwą poprawkę otwórz jako zwykły PR po incydencie.

  4. Sprawdź usunięte pliki. Refaktoryzacja agenta może usunąć plik, którego brak nikt nie zauważy, dopóki nie wykona się dana ścieżka kodu. Wypisz, co usunął PR, poleceniem git diff --name-only --diff-filter=D MERGE_SHA^1 MERGE_SHA, a plik przywróć przez git checkout MERGE_SHA^ -- PATH.

Weryfikacją jest test regresji z kroku 5: oblewa na zepsutym buildzie i przechodzi z poprawką, więc recenzent sprawdza jeden test i jeden mały diff, zamiast ponownie czytać całą refaktoryzację.

Tu spotykają się oba promienie rażenia: poprawką kodu jest revert, ale poprawką danych – odtworzenie z kopii.

  1. Zatrzymaj zapisy ze złego kodu. Najpierw wdróż rollback albo przełącz flagę. Nie naprawiaj „do przodu”, dopóki trwają błędne zapisy.

  2. Zmierz szkody zapytaniami tylko do odczytu. Poproś agenta o zapytania SELECT, które znajdą wiersze zapisane lub zmienione w oknie incydentu, i uruchom je sam na replice do odczytu. Zanotuj liczby wierszy, zanim cokolwiek zmienisz.

  3. Odtwórz do bazy pobocznej. Użyj runbooka PITR opisanego niżej, żeby odtworzyć stan sprzed złego wdrożenia do osobnej instancji, nigdy na działający primary.

  4. Napraw przejrzanym skryptem. Niech agent napisze skrypt naprawczy, który kopiuje poprawne wartości z bazy pobocznej. Uruchom go najpierw na kopii, porównaj liczby wierszy i sumy kontrolne z krokiem 2 i uzyskaj zgodę drugiej osoby, zanim skrypt trafi na produkcję.

  5. Zamknij lukę. Dodaj ograniczenie w bazie albo test walidacji, który odrzuciłby błędne zapisy, i zapisz klasę błędu (zob. taksonomię błędów).

Wygeneruj runbook PITR dla Postgresa, z którego skorzysta dyżurny

Dział zatytułowany „Wygeneruj runbook PITR dla Postgresa, z którego skorzysta dyżurny”

Runbook odtwarzania do punktu w czasie (PITR) to artefakt, po który dyżurni sięgają najpierw, więc napisz go tak, żeby dało się go wykonać nawet w środku nocy. Sprawdzony wzorzec to ciągła archiwizacja WAL i zewnętrzne narzędzie do kopii, takie jak pgBackRest albo WAL-G. Odtworzenie ustawia recovery_target_time i wymaga nieprzerwanego łańcucha WAL od kopii bazowej do tego punktu. Niech agent pisze runbook na podstawie twojej prawdziwej konfiguracji, a nie szablonu:

Ostatnie polecenie jest w prompcie dlatego, że agent najczęściej myli się tu w dwóch miejscach: wymyśla opcje pgBackRest i pomija sprawdzenie luki w WAL. Uruchom pgbackrest help restore i sprawdź każdą wypisaną opcję, zanim runbook zostanie scalony. Rdzeń poprawnego runbooka wygląda tak:

Okno terminala
# Na hoście odtwarzania, jako użytkownik postgres
pgbackrest --stanza=prod-main info # kopie i zakres WAL potrzebny każdej z nich
pgbackrest --stanza=prod-main verify # sprawdza integralność kopii i archiwum WAL
pgbackrest --stanza=prod-main --type=time \
"--target=2026-09-25 14:02:00+00" --target-action=promote restore

Utrzymuj runbook w zgodzie z konfiguracją dzięki zaplanowanej kontroli dryfu

Dział zatytułowany „Utrzymuj runbook w zgodzie z konfiguracją dzięki zaplanowanej kontroli dryfu”

Runbook starzeje się w dniu, w którym ktoś zmienia nazwę stanzy albo przenosi host. Uruchamiaj na nim agenta tylko do odczytu według harmonogramu, z domyślnej gałęzi, i kończ zadanie błędem, gdy runbook rozjedzie się z konfiguracją.

Okno terminala
# Zaplanowane zadanie CI na domyślnej gałęzi; ANTHROPIC_API_KEY pochodzi z magazynu sekretów
claude -p "Read infra/pgbackrest.conf and ops/runbooks/pitr.md. Check that every stanza,
host, bucket and path in the runbook exists in the config. Print one line per mismatch.
End with DRIFT if there is at least one mismatch, otherwise CLEAN." \
--allowedTools "Read,Grep,Glob" --permission-mode dontAsk > drift.txt
tail -n 1 drift.txt | tr -d '*[:space:]' | grep -qx CLEAN

--permission-mode dontAsk odrzuca każde narzędzie spoza listy dozwolonych, więc zadanie może tylko czytać. Ostatnia linia zamienia werdykt na kod wyjścia zadania; tr -d usuwa znaczniki Markdown, takie jak **CLEAN**, którymi model może otoczyć słowo, więc samo formatowanie nie przerwie zadania.

Uruchamiaj zadanie z tokenem, który może czytać repozytorium i nic więcej (permissions: contents: read w GitHub Actions i persist-credentials: false przy checkout). Szczegóły bezpiecznego uruchamiania agentów w CI opisuje strona o agentach bez interfejsu w CI.

Sprawdź prawdziwe ustawienia kopii zamiast je zgadywać

Dział zatytułowany „Sprawdź prawdziwe ustawienia kopii zamiast je zgadywać”

Wygenerowana polityka kopii jest tylko prawdopodobna. Podłączony do konta chmurowego przez serwer MCP z tożsamością tylko do odczytu agent odczyta faktyczne reguły cyklu życia bucketów, harmonogramy snapshotów i regiony replik, a potem wskaże lukę w RPO. Serwer AWS rejestrujesz w każdym narzędziu tak samo; ten przykład używa profilu powiązanego z rolą IAM tylko do odczytu i dodaje flagę proxy --read-only, która ukrywa narzędzia mogące wymagać uprawnień do zapisu, jako drugą warstwę ochrony ponad rolą. Endpoint pozostaje w us-east-1; region, który odpytujesz, trafia do serwera jako metadane AWS_REGION (bez --metadata bierze się z profilu). W Claude Code lub Codeksie uruchom potem /mcp, w Cursorze otwórz ustawienia MCP. Sprawdź, czy potrzebne narzędzia nadal są na liście. Zarządzany serwer AWS MCP Server ma w README awslabs oznaczenie preview (sprawdzone 2026-09-26); w Claude Code możesz go też zainstalować jako wtyczkę aws-core z claude-plugins-official:

Okno terminala
claude mcp add aws-mcp -- uvx mcp-proxy-for-aws-cli@latest \
https://aws-mcp.us-east-1.api.aws/mcp --profile agent-readonly --metadata AWS_REGION=eu-west-1 --read-only

Azure, Google Cloud i pozostałych dostawców, razem z ustawieniami tylko do odczytu, opisuje strona o serwerach MCP platform chmurowych; Kubernetes i Terraform – strona o serwerach MCP dla infrastruktury.

Dla obciążeń w Kubernetesie kopie zasobów klastra i wolumenów trwałych robi Velero. Poproś o Schedule dla przestrzeni nazw payments i auth z harmonogramem (cron) dopasowanym do RPO poziomu i TTL zgodnym z polityką retencji, a potem udowodnij, że działa, odtwarzając kopię do przestrzeni testowej: velero restore create --from-backup BACKUP_NAME --namespace-mappings payments:payments-drill. Kopia, której nigdy nie odtworzono, nie jest kopią.

Udowodnij, że failover działa, dzięki zaplanowanej próbie chaosu

Dział zatytułowany „Udowodnij, że failover działa, dzięki zaplanowanej próbie chaosu”

Nieprzetestowany plan odtwarzania to hipoteza. Zaplanowany eksperyment Chaos Mesh testuje failover na bieżąco: zasób Schedule (apiVersion: chaos-mesh.org/v1alpha1) uruchamia PodChaos z akcją pod-kill według crona.

Manifest to łatwiejsza połowa. Definicja sukcesu i porażki zamienia zabijanie podów w dowód.

  1. Uruchamiaj próbę w klastrze stagingowym o topologii takiej jak produkcja, nigdy na ruchu klientów.

  2. Niech drill-report.sh automatycznie zapisuje czas zabicia poda, czas promocji i pierwszy udany zapis; nikt nie czyta logów ręcznie.

  3. Traktuj FAIL jak zgłoszenie P2 z właścicielem, a nie ciekawostkę.

  4. Niech tech lead usługi co miesiąc podpisuje wyniki prób w zgłoszeniu. To ten podpis, a nie zielony panel kopii, jest dowodem, że RTO i RPO są dotrzymane.

  5. Każdą nieudaną próbę przepuść przez prompt do post-mortemu z końca tego przewodnika.

Przeprowadź prawdziwy failover z człowiekiem przy każdym nieodwracalnym kroku

Dział zatytułowany „Przeprowadź prawdziwy failover z człowiekiem przy każdym nieodwracalnym kroku”

W trakcie incydentu używaj agenta do przygotowania i sprawdzenia kolejnego działania, nigdy do wykonywania nieodwracalnych poleceń na podstawie swobodnego tekstu. Sesja pozostaje tylko do odczytu, a każde polecenie uruchamia człowiek. Szerszą pętlę incydentu (powiadamianie, triaż, komunikaty o statusie) opisuje strona o reagowaniu na incydenty.

Ta sama dyscyplina dotyczy ransomware: agent może przeczytać katalog kopii i oś czasu modyfikacji plików, żeby znaleźć ostatnią kopię zakończoną przed pierwszym zdarzeniem szyfrowania, i przygotować reguły izolacji sieci, a odtworzenie uruchamia człowiek.

Co psuje plany odtwarzania po awarii i jak się z tego podnieść?

Dział zatytułowany „Co psuje plany odtwarzania po awarii i jak się z tego podnieść?”
  • Luka w WAL blokuje odtwarzanie. Reguła cyklu życia albo zawodzący archive_command usunęły segmenty. Jak się podnieść: odtwórz do najpóźniejszego punktu, na który pozwala pozostały łańcuch, zgłoś faktyczną utratę danych i dodaj verify oraz kontrolę reguł cyklu życia do zadania wykrywającego dryf.
  • Opóźnienie replikacji przekracza RPO w najgorszym momencie. Skok zapisów poprzedzający awarię zostawia replikę kilka minut w tyle. Jak się podnieść: alertuj na opóźnienie względem wartości RPO, a lista kroków failoveru niech porównuje opóźnienie przed promocją; zob. monitoring i obserwowalność.
  • Split-brain po failoverze. Stary primary nadal przyjmuje zapisy po promocji repliki. Jak się podnieść: najpierw odetnij stary primary, zrób jego snapshot, wyeksportuj wiersze przyjęte po czasie promocji (porównując je z nowym primary) i po przeglądzie odtwórz je, a potem odbuduj go jako replikę przez pg_rewind albo świeżą kopię bazową; niech „zatrzymaj zapisy” zawsze będzie pierwszym krokiem każdej listy failoveru.
  • Próba przechodzi, a prawdziwy failover zawodzi. Staging ma trzy węzły, produkcja 30. Jak się podnieść: odwzoruj topologię produkcji w klastrze prób i zmieniaj wstrzykiwaną awarię (zabicie poda, partycja sieci, pełny dysk).
  • Agent wymyśla flagę albo pole CRD. Runbook lub manifest się nie uruchomi. Jak się podnieść: prompty powyżej każą agentowi wypisać każdą opcję ze źródłem; sprawdź tę listę z --help albo typami CRD przed scaleniem.
  • Revert ma konflikty, bo późniejsze PR-y budują na kodzie agenta. Jak się podnieść: wypuść minimalny hotfix zamiast rozplątywać commity w trakcie incydentu, a właściwą poprawkę zaplanuj później. Odwracalne commity (opisane wyżej) sprawiają, że zdarza się to rzadziej.
  • Brakuje potrzebnego checkpointu. Zmianę wprowadziło polecenie powłoki, którego checkpointy nie śledzą, albo snapshoty zostały już usunięte. Jak się podnieść: trwałym zapisem jest Git; commituj każdy krok, żeby zawsze był commit, do którego można wrócić.

Incydent nie jest zamknięty, dopóki lekcja nie trafi do repozytorium: post-mortem, test regresji i zmieniony runbook albo reguła. Dawaj agentowi prawdziwe artefakty, a nie swoje wspomnienia o nich.

Trzymaj post-mortem obok runbooka, który ma zmienić, żeby następna próba sprawdzała lekcję z ostatniego incydentu. Przy incydentach wywołanych zmianą agenta oznacz klasę błędu i postępuj zgodnie z procesem organizacyjnym opisanym na stronie o incydentach z udziałem agentów.