Günler süren kesintilerle internetin önemli bir bölümünü, oyunları ve hatta akıllı ev cihazlarını etkileyen o büyük Amazon Web Services (AWS) kesintisi hafızalara kazındı. Dağıtık mimarisiyle bilinen bulut hizmetlerinin böylesi bir hatadan korunması beklenirken, ne ters gitti? Yaşananlara dair detaylı bir teknik inceleme yayınlayan AWS, ironik bir şekilde, şu meşhur şiire gönderme yaptı: "Sorun DNS değil. / Asla DNS olamaz. / Sorun DNS'ti."
Bir trafik kazasıyla benzetebiliriz durumu: Kaza temizlense bile kilometrelerce süren bir trafik sıkışıklığı oluşur. AWS'deki ilk sorun nispeten hızlı çözülse de, 19 Ekim'deki kesinti gece 23:48'den 20 Ekim'deki 02:40'a kadar sürdü. Ancak trafik örneğindeki gibi, birbirine bağlı sistemlerde aksaklıklar zinciri başladı ve tam olarak normale dönmeleri daha uzun sürdü.
Kesintinin temel nedeninin, DynamoDB (veritabanı hizmeti) için yapılan DNS yapılandırmasının bozulması ve Route53 (DNS hizmeti) üzerinde yayınlanması olduğu bildirildi. Bu durum, otomatik yönetim hizmetlerini DynamoDB'ye dayandıran EC2'nin (sanal makine hizmeti) de bir kısmının çökmesine neden oldu. AWS'nin Ağ Yük Dengeleyicisi de doğal olarak DNS'e bağlı olduğundan, o da sorunlarla karşılaştı.
Tüm ABD-Doğu-1 bölgesindeki DynamoDB'nin çökmesi başlı başına milyonlarca web sitesi ve hizmeti durdurabilecek bir durumken, EC2 örneklerinin de başlatılamaması durumu daha da kötüleştirdi. Yük dengeleyicinin etkilenmesi ise adeta bir felaket senaryosu yarattı.
Bu DNS hatasının ardındaki teknik sorun ise programcıların "en sevdiği" hata türüydü: Yarış koşulu. Bu, iki tekrarlayan olayın birbirlerinin etkilerini sürekli yeniden yapması veya geri alması anlamına geliyor. Bugs Bunny ve Daffy Duck'ın posterle olduğu o meşhur GIF'i düşünebilirsiniz.
DynamoDB'nin DNS çözümlemesi iki bileşeni kullanıyor: Birincisi, sistem yükünü ve kullanılabilirliği dikkate alarak periyodik olarak yeni bir Plan oluşturan DNS Planlayıcısı. İkincisi ise, her yeni Plan gördüğünde, bunu Route53'e bir işlem olarak uygulayan DNS Yürütücüleri. Yani bir Plan ya tamamen uygulanır ya da hiç uygulanmaz.
Burada yaşananlar ise şöyle: İlk DNS Yürütücüsü, eski Plan'ı uygulamak için fazladan zaman harcıyordu. Yeni Planlar gelirken, başka bir Yürütücü yeni bir Plan alıp uyguladı. Route53'te hem güncel hem de eski veriler bulunuyordu. Tam da ilk Yürütücü Eski Plan'ı uygulamayı bitirdiğinde, eski planın temizlenmesi emri verildi. Ancak bu temizlik sırasında Eski Plan da kaldırıldığı için, artık boş bilgiler içeren bu Plan uygulandı ve bu da tüm DynamoDB DNS kayıtlarının silinmesine neden oldu. Bu devasa "kaza"yı düzeltmek, DNS kayıtlarının tutarsız hale gelmesi nedeniyle manuel olarak yapıldı.
Tam bu sırada EC2 hizmeti çökmeye başladı, çünkü otomatik yönetim sistemleri DynamoDB'ye bağımlıydı. Yeni EC2 örnekleri oluşturulamadı ve bu da devasa bir istek kuyruğuna yol açtı. Bu durum, teknisyenlerin EC2 örneklerinin oluşturulmasını bir süre kısıtlamasına neden oldu. Bu da birçok hizmet ve web sitesinin, örnekleri çevrimiçi olana kadar kapalı kalması anlamına geliyordu.
Üstüne bir de AWS'nin Ağ Yük Dengeleyicisi de darbe aldı. DNS kayıtlarındaki gecikmeler ve ardından gelen yayılma sorunları nedeniyle, Yük Dengeleyici yeni EC2 örneklerini tutarsız bir ağ durumuyla başlattı. Ayrıca, bu durum nedeniyle birçok NLB sağlık kontrolü başarısız oldu, oysa altyapının kendisi aslında iyi çalışıyordu. Başarısız olan bu sağlık kontrolleri, NLB düğümlerinin ve arka uç hedeflerinin (tahmin edin ne oldu?) DNS'ten kaldırılmasına ve daha sonra geri dönmesine neden oldu.
Olayın ardından, AWS teknisyenleri, yaşanan yarış koşulu senaryosu için düzeltmeler yayınlanana ve daha fazla koruma eklenene kadar DynamoDB'nin DNS Planlayıcısı ve Yürütücüsü'nü devre dışı bıraktı. Benzer şekilde, EC2 için alışılmadık çalışma koşulları için yeni bir test paketi geliştiriliyor ve Ağ Yük Dengeleyici, bir sağlık kontrolü başarısız olduğunda ne kadar kapasitenin kaldırılacağını sınırlayan kontrol mekanizmalarına sahip olacak.
Otomatik kontrol sistemleri, bulut bilişim dünyasında veya ciddi herhangi bir kurumsal yapıda bir zorunluluktur. Ancak bu olay gösterdi ki, bu sistemler son derece dikkatli bir programlama ve merkeziyetsizlik gerektiriyor. Görünüşe göre AWS bu noktada başarısız oldu. Her zaman hatırlayın, "bulut aslında yalnızca başkasının bilgisayarıdır."