Rozmowa · ćwicz na głos, potem czytaj

Pytania, które mogą paść

Siedem pytań z raportu, z pełnymi odpowiedziami. Najpierw zamknij oczy i odpowiedz. Potem porównaj. Diagram do pytania 1 jest też na whiteboardzie.

Pytanie 1

Zaprojektuj AWS account + network model pod karty + PCI.

Cel pytania: czy myślisz zakresem CDE, nie „jedną VPC z public/private”, i czy umiesz powiedzieć, co nie wychodzi.

Odpowiedź na głos (8 minut)

„Dzielę po granicy danych kartowych, nie po zespołach. AWS Organizations, SCP na OU.”

  1. Konta. Management tylko billing/SCP. Identity (SSO). Log-archive (org trail, Object Lock). Shared/network (TGW, inspection). Dev, staging, prod-app (bez CHD). Osobne konto PCI-prod na CDE. Staging CDE tylko jeśli audytor uzna kopię za konieczną — default: nie klonuję PAN na staging, tylko tokeny.
  2. Sieć. Prod-app i PCI to osobne VPC. Między nimi nie peering „na wszystko”, tylko PrivateLink na konkretny port (np. tokenize/authorize). Public subnet wyłącznie pod ALB w app. RDS CDE w isolated subnet bez 0.0.0.0/0. Egress CDE przez proxy allow-list (Visa, internal repo). VPC endpoints: STS, KMS, S3, ECR, Logs.
  3. SCP na PCI: zakaz access keys, zakaz wyłączenia Traila, region allow-list, zakaz publicznych SG/S3, GuardDuty on.
  4. Tożsamość. Ludzie przez Identity Center, krótkie sesje, MFA. CI: OIDC, sub per repo i environment. Workload poza AWS: Roles Anywhere. Zero standing keys.
  5. Nie wychodzi z PCI VPC: PAN/SAD, materiał kluczy, interaktywny SSH, trasa z dev, obrazki z Docker Huba, logi z payloadem karty. Wychodzi: token, last4, metryki, trail do archive.
Domknięcie„To nie jest ich produkcyjny diagram — nie widziałem go. To jest wzorzec z AWS PCI scoping plus to, co jest w JD: osobne konta PCI. Chętnie skonfrontuję z tym, co macie.”
Pytanie 2

Jak zrobisz reusable Terraform module na ECS/EKS service, z którego korzysta 20 teamów?

Cel: platform as a product. Kontrakt, wersje, bezpieczne defaulty, migracja runtime.

Odpowiedź

  1. Interfejs jeden, runtime za flagą. Inputy: name, image_digest, cpu, memory, port, healthcheck, env, autoscaling, runtime = ecs|eks. Outputy: SG, log group, role ARN, DNS/URL. Caller’s PR nie zawiera YAML-i K8s ani surowego task def.
  2. Defaulty: private, encryption, deletion protection w prod, required tags, IRSA/task role z boundary, datadog sidecar opcjonalny ale SLO label obowiązkowy.
  3. Czego nie ma w API: open_world, skip_logs, surowa IAM policy. Wyjątki: osobny obiekt exceptions z expires_at.
  4. Wersjonowanie: semver w registry, changelog, test apply na sandbox przy publikacji modułu (Spacelift to robi). Callers pin ~> 3.2. Major = breaking (np. zmiana outputu).
  5. Migracja ECS→EKS: v3.x wspiera oba. Zespół zmienia jedną zmienną, ten sam obraz. Po soak usuwam ECS z modułu w v4. Nie 20 forków.
  6. Governance: Spacelift policy na plan (no destroy in prod without approval, no 0.0.0.0/0, pci tag). Dokumentacja: 1 strona „jak dodać serwis” + przykładowy caller.

Sukces: ticket „postawcie nam serwis” znika. Zostaje PR z values.

Pytanie 3

Pipeline pada tylko na jednym serwisie w matrixie — jak idziesz po kolei?

Cel: diagnostyka, nie „zrestartuję runner”. Oni mają 20+ Java/Kotlin.

Odpowiedź — kolejka

  1. Zawęź blast. Która komórka: service=cards, java=21, env=staging? Czy fail-fast ukrył inne? (u nas fail-fast false).
  2. Klasyfikuj błąd. Kompilacja / test / cache / auth OIDC / push ECR / deploy. Logi joba, nie zgadywanie.
  3. Czy tylko CI? Odpal ten sam Gradle na czystym kontenerze z tym samym JDKiem. Jeśli lokalnie pada — to nie pipeline, to kod albo testdane. Oddaj productowi z reprodukcją.
  4. Jeśli tylko CI:
    • cache: job z wyłączonym cache; porównaj. Podejrzenie: dirty Gradle cache z innego serwisu w monorepo.
    • OIDC: sts get-caller-identity w logu. Czy trust sub obejmuje to repo? Czy environment name się rozjechał?
    • sekrety: brak CODEARTIFACT / cert do Nexus tylko w tym repo.
    • matrix exclude źle napisany — cards na 17, którego nie ma.
    • flaky Testcontainers / port bind / czas. Szukaj w historii „pass po rerun”.
  5. Nie zostawiaj rerun jako fix. Albo wyłącz cache dla tego serwisu, albo napraw test isolation, albo popraw trust policy. W runbooku: jak zabić cache, jak odczytać OIDC claims.
Pytanie 4

Jak zmigrujesz 20 mikroserwisów z ECS na EKS bez tygodnia downtime i bez 20 snowflake’ów?

Skrót z lekcji 4, w formie odpowiedzi:

  1. Nie otwieram 20 projektów. Otwieram factory: jeden chart/moduł, values per serwis, jeden pipeline z runtime.
  2. Data plane (RDS, Kafka) zostaje. Zmienia się compute. Żadnego dual-write.
  3. Ten sam image digest na ECS i EKS.
  4. Kolejność: bezstanowe non-PCI → consumery Kafka → (osobna decyzja) CDE na osobnym klastrze.
  5. Per serwis: shadow → 5% → 25% → 100% na ALB. Rollback = waga z powrotem na ECS. Soak dni, nie godzin, przy settlement.
  6. Stop: SLO, nie data w Jira.
  7. PCI: osobny cluster, nie namespace na wspólnym. Jeśli nie robiłem EKS na prod — mówię to i zostawiam CDE na ECS dłużej.
Pytanie 5

Product team chce wyjątek IAM „na już”. Co robisz?

Cel: Own it + Be kind bez bycia helpdeskiem. PCI.

Odpowiedź

„Nie mówię nie z urzędu i nie otwieram *:* na Slacku.”

  1. 15 minut na zrozumienie job-to-be-done. Czytają z S3? Wołają API partnera? Debugują staging? Często potrzeba jest „read na staging”, a prośba brzmi „admin na prod”.
  2. Ścieżka szczęśliwa: istniejący moduł / permission set / time-bound assume-role z session name = ticket. Self-service, bez mnie.
  3. Jeśli naprawdę wyjątek:
    • najwęższa akcja i zasób, nie *,
    • Condition: MFA, IP/VPC, time,
    • expiry (24h / 7 dni) w kodzie (notatka + aws_iam_policy z datą w nazwie albo scheduled revoke Lambda),
    • nie w CDE, jeśli da się na kopii/tokenie,
    • PR, nie klik. Spacelift policy może wymagać approval security przy iam:*.
  4. Po fakcie: jeśli ten wyjątek wraca — to brakująca capability platformy. Robię ją. Ticket volume ma spadać.
  5. Czego nie zrobię „na już”: long-lived key, public SG do RDS, wyłączenie Traila, dostęp z laptopa do PCI VPC, wklejenie PAN do Cursora.
Zdanie„Wyjątek bez daty końcowej to nowy baseline. Albo ma expiry, albo to feature w module.”
Pytanie 6

Jakie SLO postawisz na platformę CI i na API gateway?

Nie zmyślaj 99.99 wszędzie. Pokaż, że SLO jest narzędziem, nie plakatem.

CI platformAPI gateway / auth path
SLI% jobów, które startują < 2 min; % fail z powodu infra (OIDC, disk, runner), nie testów% requestów 2xx w budżecie latency (np. p99 < 200–300 ms na autoryzacji, skalibruj z nimi)
Okno30 dni, osobno godziny pracy vs. weekend — CI może mieć niższy cel w nocy30 dni, 24/7, bo karty
SLO (rząd)99.0–99.5% infra-success. GitHub.com nie jest pod Twoją kontrolą — nie obiecuj 99.9999.9%+ na ścieżce płatności. 43 min/mies. to już dużo pieniędzy
PageMain/prod deploy leży; kolejka runnerów > N minut. Nie: flaky na feature branchBurn rate szybki na tym SLI. Composite, jeden pager na fire
Gdy budżet spalonyFreeze nowości w reusable workflowsFreeze feature deploy na ścieżce auth

„Dokładne liczby ustaliłbym z error budgetem biznesu i z historią on-call. Dziś nie znam Waszego p99.” To jest dorosłe. Potem podajesz rząd i alert policy.

Pytanie 7

Opowiedz o najgorszym incydencie infra.

Tu nie ma uniwersalnej treści — jest uniwersalna forma. Wypełnij w STAR przed rozmową. Na głos:

  1. Sytuacja (30 s): system, skala, objaw, impact (klienci / $ / czas).
  2. Twój call (45 s): co zdecydowałeś Ty, nie zespół. Rollback vs. patch vs. scale vs. revoke.
  3. Trade-off (20 s): np. dłuższy incident vs. ryzyko złego fixa na CDE.
  4. Wynik (20 s): MTTR, $ , ile osób obudzonych.
  5. System po (30 s): monitor, guardrail, runbook. Bez „pracowaliśmy całą noc”.
Unikajheroics, obwiniania ludzi, SSH na prod jako puenty, historii, w której nie było Cię przy decyzji. Jeśli nie masz dużej awarii — weź mniejszą i podkreśl zmianę systemową. Lepsze niż zmyślony data-loss.

Dodatkowe, które spadają z JD