20 Października 2025

Mój smart home przestał być smart. Alexa milczała jak zaklęta. Ring doorbell pokazywał connecting… w nieskończoność. Snapchat, Fortnite i inne działające serwisy zamieniające się w ekrany: Uwaga - Przerwa Techniczna.

Nie był to cyberatak. Nie był to hardware failure. To były trzy litery: DNS.

Co się właściwie stało

Schemat wydarzeń, który mamy z oficjalnych stron AWS, prezentował się następująco:

23:49 PDT ─┐
           │ Błąd rozwiązywania DNS dla endpointów DynamoDB
           ├─> Błędy API DynamoDB (US-EAST-1)
           │
02:24 PDT ─┤ DNS NAPRAWIONY! 🎉 
           │ ...ale...
           │
           ├─> System uruchamiania EC2 padł (zależność od DynamoDB)
           │   └─> RDS, ECS, Glue - wszystko co używa EC2
           │
09:38 PDT ─┤ Awaria health checków Network Load Balancera
           │   └─> Środowiska wykonawcze Lambda
           │   └─> Metryki CloudWatch
           │   └─> Totalny chaos połączeń
           │
15:01 PDT ─┴─> PEŁNE PRZYWRÓCENIE (15h 12min później)

Dotknięte serwisy:
├─ Gaming: Fortnite, Roblox, PlayStation Network
├─ Social: Snapchat, Signal
├─ Finanse: Coinbase, Robinhood, Venmo, banki US
├─ Amazon własne: Alexa, Ring, Prime Video
├─ Atlassian: Jira, Confluence
└─ Infrastruktura: IAM, Zgłoszenia wsparcia, DynamoDB Global Tables

DNS czyli 12 bajtów które zatrzymały pół internetu

Czym właściwie jest DNS i dlaczego spowodował takie problemy i straty? `DNS to swego rodzaju książka telefoniczna internetu, dzięki której możemy w swobodny sposób się komunikować z internetem.

Załóżmy, że nie posługujemy się DNS - chcemy coś wyszukać w Google. Zamiast google.com musimy wpisać adres IP, na przykład 142.250.179.142.

Czy zamiast google.com byłbyś w stanie zapamiętać ciąg liczb? Pewnie nie! DNS to nasza książka telefoniczna, dzięki której możemy komunikować się za pomocą łatwych do zapamiętania adresów internetowych.

Jak to działa?

Kod jest wart więcej niż 1000 słów. Posługując się językiem C i tym oto bardzo uproszczonym programem, zapytajmy serwer DNS Amazon, jaki IP ma DynamoDb! (lub możesz użyć gotowych programów takich jak host albo nslookup)

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main() {
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in dns = {AF_INET, htons(53), {inet_addr("8.8.8.8")}};
    
    // To jest CAŁE pytanie DNS - tylko 12 bajtów nagłówka + nazwa domeny
    unsigned char q[] = {
        0xAA,0xAA,0x01,0x00,0,1,0,0,0,0,0,0,  // Header DNS
        8,'d','y','n','a','m','o','d','b',
        9,'u','s','-','e','a','s','t','-','1',
        9,'a','m','a','z','o','n','a','w','s',
        3,'c','o','m',0,
        0,1,0,1  // Type A, Class IN
    };
    
    unsigned char r[512];
    
    sendto(sock, q, sizeof(q), 0, (struct sockaddr*)&dns, sizeof(dns));
    int len = recvfrom(sock, r, 512, 0, NULL, NULL);
    
    // Odpowiedź DNS ma skomplikowaną strukturę, ale IP jest na końcu
    printf("IP: %d.%d.%d.%d\n", r[len-4], r[len-3], r[len-2], r[len-1]);
    
    return 0;
}

A odpowiedź wygląda następująco:

IP: 3.218.180.124

53 to port DNS. 8.8.8.8 to publicny serwer DNS Google (możesz użyć dowolnego serwera DNS). To wszystko, co potrzebne, żeby zapytać gdzie jest dynamodb.us-east-1.amazonaws.com.

Serwery DNS używają protokołu UDP, który jest bardzo uproszczony w stosunku do TCP/IP i dzięki temu bardzo szybki. Oczywiście jak każdy protokół posiada standardyzację, która jest oznaczona numerem RFC 1035.

Sama awaria dotknęła DynamoDB - nierelacyjną bazę danych, która jest używana do przechowywania i przetwarzania dużych ilości danych, szczególnie tych o dużej skali i natężeniu ruchu.

Także ci, co używają i nie używają DynamoDB, byli dotknięci awarią, bo na przykład EC2 używa wewnętrznie DynamoDB do trzymania metadanych.

DynamoDB jako architektura rozproszona

DynamoDB, jak i inne usługi AWS, działają w architekturze rozproszonej i możemy to zobrazować następującym diagramem:


🏗️ ARCHITEKTURA DynamoDB (rozproszona)

                    LOAD BALANCER VIP
                 (Virtual IP: 52.94.133.131)
                            ↓
        ┌───────────────────┼───────────────────┐
        │                   │                   │
    ┌───▼────┐         ┌───▼────┐         ┌───▼────┐
    │ Node 1 │         │ Node 2 │         │ Node 3 │
    │  AZ-1a │         │  AZ-1b │         │  AZ-1c │
    │   IP   │         │   IP   │         │   IP   │
    └────────┘         └────────┘         └────────┘
        ✅                 ✅                 ✅
     DZIAŁA              DZIAŁA             DZIAŁA

Skoro wszystko jest rozproszone, nawet serwery DNS, to co się wydarzyło? Cały system DNS dla us-east-1 miał problemy.

Jak się okazuje, “multi-region” wymaga prawdziwej niezależności, nie tylko replikacji danych.

Jak to się odnosi do naszego problemu DNS?

Wiele usług AWS, pomimo tego że były zlokalizowane w różnych miejscach, miały jeden punkt styku - w tym przypadku resolvowanie adresów DNS w us-east-1.

// Cała infrastruktura zależna od jednego serwisu
DynamoDB_IP = dns_resolve("dynamodb.us-east-1.amazonaws.com");
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          Kiedy to failuje - wszystko failuje!

Co to oznaczało w praktyce?

Problem nie był w DynamoDB. Problem nie był w serwerach. Problem był w MAPIE.

Wszystkie usługi AWS pytały:

Gdzie jest dynamodb.us-east-1.amazonaws.com?

I nikt nie potrafił odpowiedzieć. Serwery działały. Dane były bezpieczne. Ale NIKT nie wiedział, jak tam dotrzeć.


Co to oznacza dla nas i jakie lekcje z tego możemy wyciągnąć ?

  • chmura to nie magia tylko czyjeś serwery które mogą ulec awarii
  • multiregion to nie to samo co nie zależność (zawsze coś może używać jednego miejsca o którym nie wiemy)
  • testuj awarie szczególnie uwzględniając awarie sieciowe takie jak np DNS
  • nie polegaj tylko na jednym providerze DNS