Jak navrhnout bezserverové API

Účel a kontext: co znamená bezserverové API

Bezserverové (serverless) API je rozhraní postavené na spravovaných cloudových službách, kde aplikace běží v krátkodobých funkcích a platí se primárně za skutečné využití. Infrastruktura (škálování, patchování, dostupnost) je abstrahovaná a automaticky spravovaná poskytovatelem. Cílem je rychlá iterace, vysoká elasticita a optimalizace nákladů bez kompromisů v oblasti spolehlivosti, bezpečnosti a pozorovatelnosti.

Architektonické stavebnice

  • API brána: terminace HTTP(S), směrování na funkce/mikroslužby, throttling, autentizace, metriky, WAF.
  • Funkce (FaaS): stateless výpočetní jednotky (AWS Lambda, Azure Functions, Cloud Functions) spouštěné na požádání.
  • Datová vrstva: spravované databáze (NoSQL/SQL), fronty a streamy (SQS/SNS, EventBridge, Pub/Sub), objektové úložiště.
  • Identity a přístup: správa identity (Cognito/Entra/Identity Platform), OAuth/OIDC, mTLS dle potřeby.
  • Observabilita: logy, distribuované trasování, metriky, alarmy a structured events.

Návrhové principy bezserverového API

  • Stateless: žádný per-request stav uvnitř funkce; stav uložte do datových služeb nebo krátkodobých cache s vědomím TTL.
  • Idempotence: opakovatelné zpracování požadavků (retry). Identifikujte požadavky pomocí requestIdempotencyKey.
  • Back-pressure: ulevte zatížení špiček pomocí front a asynchronních workflow.
  • Least privilege: granularita oprávnění na úrovni funkcí, datových tabulek, témat a úložišť.
  • Konfigurací nad kódem: routování, throttling, CORS a autentizace v API bráně; běhové parametry v prostředí a pomocí feature flags.

API brána: návrh rozhraní, limity a CORS

  • Model rozhraní: REST (konzistentní zdrojové cesty a HTTP metody), HTTP API (rychlejší a levnější varianty) nebo GraphQL pro agregaci dat.
  • Validace: schémata (OpenAPI/JSON Schema) přímo v API bráně; odmítnutí nevalidních payloadů před spuštěním funkce.
  • Rate limiting: globální a per-klíč; odpověď s kódem 429 s retry politikou a hlavičkou Retry-After.
  • Caching: odpovědi dle cache-control, per-route cache; pozor na personalizovaný obsah a tokeny.
  • CORS: povolit pouze nezbytné originy, metody a hlavičky; preflight optimalizujte krátkou funkcí či přímo nastavením v bráně.

Chladné starty, latence a výkon

  • Chladné starty: minimalizujte závislosti, používejte menší runtime (např. Node.js/Go), provisioned concurrency pro kritické endpointy.
  • Teplý pool: recyklujte DB klienty mimo handler (globální scope), aby připojení přetrvalo mezi invokacemi.
  • Payloady: komprese GZIP/Brotli, limity velikosti (uploady přesunout přímo do objektového úložiště pomocí pre-signed URL).
  • Regionální blízkost: zvolte region API a dat blízko uživatelům; u globálních API zvažte edge termination a multi-region active-active řešení.

Autentizace a autorizace

  • Standardy: OAuth 2.1/OIDC s JWT nebo PASETO; krátká TTL, rotace klíčů (JWKS), validace audience/issuer.
  • Granulární přístup: mapování entit na resource-based politiky v datové vrstvě; claimsABAC.
  • mTLS/API klíče: pro server-server integrace; klíče s omezeným rozsahem oprávnění a kvótami.
  • Segregace: veřejné a interní endpointy na oddělených doménách a WAF pravidlech.

Data a transakce v bezserverovém světě

  • NoSQL vs. SQL: definujte přístupové vzory předem; NoSQL pro nízkou latenci a masivní škálování, SQL pro komplexní dotazy a podporu ACID transakcí.
  • Transakce: pokud nejsou k dispozici distribuované transakce, využijte vzory outbox a saga s kompenzačními kroky.
  • TTL a archivační politiky: automatická expirace záznamů s ohledem na legislativu (GDPR, retence dat).
  • Cache: spravované in-memory služby (ElastiCache/Memorystore) pro hot paths; invalidace pomocí eventů.

Asynchronní zpracování a workflow

  • Fronty a témata: oddělení příjmu požadavku od zpracování na pozadí; garantované doručení, dead-letter fronty, backoff strategie.
  • Orchestrace: stavové automaty (Step Functions/Logic Apps/Workflows) se zabudovanými kompenzacemi, timeouts a circuit breakers.
  • Event-driven: emitujte doménové události; spotřebitelé vytvářejí projekce (vyhledávací indexy, analytika).

Bezpečnostní opatření

  • WAF a ochrana proti botům: pravidla proti injection, anomálnímu provozu, IP reputation.
  • Secret management: KMS/HSM a trezory tajemství; žádné klíče v proměnných prostředí bez šifrování a pravidelné rotace.
  • Výstupní egress: privátní konektivita (VPC endpoints, Private Link) a egress allowlist.
  • Audit: auditní stopa všech změn konfigurace brány, funkcí a přístupových politik; neměnné logy.

Observabilita a testovatelnost

  • Strukturované logy: korelační ID mezi API bránou, funkcí a databází; žádné citlivé informace v logu.
  • Trasování: OpenTelemetry; spans přes API bránu, funkce, databázi a fronty.
  • Metriky a SLO: p99 latence na endpoint, míra chyb fault rate, chladné starty, saturace concurrency; alerty s multi-window, multi-burn.
  • Testy: kontraktační testy na rozhraní, integrační testy v sandbox prostředí, chaos testování selhání závislostí a zvýšené latence.

Řízení verzí a kompatibility

  • Versioning: /v1, /v2 nebo content negotiation; zajištění zpětné kompatibility payloadů.
  • Deployment strategie: canary a postupný rollout, feature flags, automatický rollback na základě chyb či zvýšené latence.
  • Kontrakty: OpenAPI jako zdroj pravdy; generovaná SDK pro klientské aplikace.

Náklady a optimalizace

  • Unit economics: cena za milion požadavků + GB-sekund výpočtu + egress; modelujte p99 latenci versus provisioned concurrency.
  • Hot paths: přesun náročných částí do asynchronních pipeline; využití cache a předpočítávání.
  • Agregace požadavků: GraphQL a edge compute snižují počet volání backend funkcí.

Edge a globální distribuce

  • Edge funkce: validace tokenů, A/B routing, jednoduché obohacení dat blízko uživatelům.
  • Multi-region: aktivně–aktivní API s globálním DNS a failoverem; konflikty řešte CRDT nebo last-write-wins dle domény.
  • CDN: caching pro GET; invalidace eventy a ETag/If-None-Match.

API vzory a anti-vzory

  • Vzory: request–reply pro synchronní čtení, command–async result pro zápisy, webhook/outbox pro integrace, bulk operace přes dávkové joby.
  • Anti-vzory: dlouhé synchronní běhy ve funkcích, držení spojení na minuty (preferujte spravované WebSocket služby), chatty klienti místo agregace, sdílené globální proměnné jako stav.

Schéma payloadů a správné kódy

  • Kontrakty: explicitní typy, jednotky, enumy; verzování schémat a deprecation pole.
  • Kódy: 200/201/202 pro úspěšné přijetí, 400 validace, 401/403 autentizace/autorizace, 404 nenalezeno, 409 konflikt, 429 limit, 5xx serverová chyba; korelujte s retry politikou klienta.

Infrastruktura jako kód a prostředí

  • IaC: deklarativní šablony (CDK, Terraform, Pulumi, SAM, Serverless Framework); versioning, code review, drift detection.
  • Prostředí: izolace dev/stage/prod účtů, branch per env pro API bránu; preview prostředí pro pull requesty.

Resilience a spolehlivost

  • Timeouty: kratší než závislé služby; hedging u čtení; circuit breaker pro externí API.
  • Retries: exponenciální backoff s jitterem; idempotence; dead-letter kanál pro manuální zásah.
  • Politiky: graceful degradation (např. vrátit starší cache), fallbacky, brownout neklíčových funkcí během špiček.

Bezserverové GraphQL API

  • Resolvery: mapujte resolvery na funkce s využitím dataloaderů proti N+1 problému; per-field autorizace dle claims.
  • Limity: hloubka dotazu, složitost, timeouty per resolver; persisted queries.
  • Subscription: spravované WebSocket/HTTP/2 kanály; posílejte pouze eventy s minimálním payloadem.

Audit a compliance

  • Osobní údaje (PII): klasifikace dat, privacy by design, šifrování end-to-end (transport i at-rest), pseudonymizace.
  • Evidence: neměnné audity změn konfigurace a přístupů; retenční politiky logů; přístup řízený rolí a potřebou.

Příklad referenční topologie

  • API Gateway (public) → funkce (autentizace, validace) → fronta (asynchronní příkaz) → orchestrátor (stavový workflow) → DB (NoSQL) a index (vyhledávání).
  • Pro čtení: API Gateway → funkce → cache → DB; TTL a invalidace eventy.
  • Integrace: outbox v DB → stream → webhook worker → cílové API s retry a podpisováním žádostí.

Checklist před produkčním nasazením

  • OpenAPI/GraphQL schéma publikováno, kontraktační testy bez chyb.
  • Autentizace OIDC, validace aud/iss v bráně, least-privilege IAM role.
  • Rate limiting, WAF, CORS minimalizované.
  • Idempotence u zápisů; retry/backoff politika definována.
  • Provisioned concurrency pro kritické cesty; warm konektory k databázi.
  • Strukturované logy, end-to-end trasování, metriky p99, alarmy a runbooky.
  • Canary release s automatickým rollbackem; připravené feature flags.
  • Disaster recovery plán: multi-AZ, snapshoty, testy obnovy; provedeno chaos testování.

Časté chyby a jak se jim vyhnout

  • Nadměrná granularita funkcí bez sdílených knihovních vrstev → vysoké latence a náklady. Řešení: shared layers, aggregator pattern.
  • Synchronní dlouhé běhy → timeouts a drahé invokace. Řešení: rozdělit na kroky a orchestraci.
  • Chybějící idempotence → duplikáty objednávek. Řešení: idempotency klíče a podmíněné zápisy (conditional writes).
  • Neřízené CORS → bezpečnostní rizika. Řešení: povolit pouze specifické originy a metody.
  • Příliš volná IAM politika. Řešení: role na úrovni zdrojů (resource-scoped) a permission boundaries.

Závěr

Dobře navržené bezserverové API stojí na jasných kontraktech, stavových funkcích, důsledné bezpečnosti a pozorovatelnosti, s asynchronními vzory pro odolnost a škálování. S využitím API brány, event-driven architektur, infrastruktury jako kódu a automatizovaných testů lze dosáhnout rychlých iterací s nízkými provozními náklady a vysokou spolehlivostí. Klíčové je myslet na idempotenci, limity, latenci a správu verzí od prvního dne.