Amazon SNS (Simple Notification Service)

Merhaba arkadaşar, mobilhanem.com’da Amazon Dersleri yazı serimize kaldığımız yerden devam ediyoruz. Amazon SNS (Simple Notification Service), mesajların iletilmesinde yüksek güvenilirlik, güvenlik sağlayan mesajlaşma sistemidir. Amazon SNS Publish/Subscribe modelini benimser. Bu model, servisler arası asenkron bir şekilde iletişimi sağlar. Bu mimaride gönderilen mesaj bir kuyruk yapısına gönderilmektedir. Gönderen servis cevap beklemediği için mesajı ilettikten sonra başka işlere devam edebilir.  Bu mesajı alması gereken serviste bu kuyruk üzerinden mesajlara ulaşır ve mesajı işledikten sonra kuyruktan siler. Artan trafik ile mesajları gönderen ve işleyen servislerin ölçeklenmesi daha kolay olmaktadır.

AWS gibi bulut sağlayıcıları üzerinde bu sistemleri kullanmak ise kullanıcılara sınırsıza yakın bir ölçekleme sağlar. Bu sayede bu sistemlerin yönetimi, ölçeklenmesi gibi kısımlarla uğraşmasına gerek kalmadan hızlı bir şekilde geliştirme yapılabilir.

Amazon SNS

SNS’te Topic mesajların iletimini sağlayan bir iletişim kanalıdır. Topic’ler Subscribe işlemi ile HTTP, SMS, Email veya Amazon SQS servislerine iletim yapabilmektedir. Bir Topic birden fazla servise aynı mesajı aynı anda iletebilmektedir.. Bu mesajların iletiminde oluşan olası ağ sorunlarında tekrarlayarak ulaştırılmasını sağlar. Aynı zamanda Topic üzerine gönderilen mesajların iletimine kadar geçen süre boyunca şifrelenmesine de olanak sağlamaktadır.

Yazımızın devamında Amazon SNS servisini nasıl kullanacağımıza değineceğiz. Bir SNS Topic’i oluşturmak için sadece isim vermemiz yeterli olmaktadır. Ancak aşağıdaki ekran görüntüsünde görebileceğiniz gibi başka opsiyonlar da bulunmaktadır.

Konfigürasyon

Display Name:  Eğer SMS alıcısı kullanacaksanız, mesajın gönderici kısmında yazacak yazıyı belirler. Mesajı alan kişilerin mesajın nereden geldiğini anlaması açısından önemli bir alandır.

Encyrption: Topic’e gönderilen mesajın iletilmesine kadar geçen süre boyunca sunucu tarafında şifreli bir biçimde saklanmasını sağlar. SNS sunucu tarafındaki şifrelemeler için CMK (Customer Managed Key) kullanmaktadır. SNS mesaj sadece iletilirken şifrelenmiş mesajı tanımlanan anahtarla çözülmektedir.

Access Policy: Topic’e kimlerin mesaj gönderebileceğini, kimlerin subscribe olabileceğini ve Topic ayarlarını değiştirebileceğinin ayarlandığı kısımdır. Burada sadece belirli bir AWS hesabının mesaj gönderebileceği veya yalnızca belirli bir alan adına isteklerin gönderilebileceği tanımlanabilir.

Delivery Retry Policy: Gelen mesajın iletiliceği uçbirim o an yüksek trafik aldığından, herhangi bir sebeple bakımda olduğundan ya da olası ağ problemlerinden dolayı mesajları kabul edemiyorsa SNS bu iletimi başarısız olarak kabul etmektedir. Başarısız iletimleri burada belirtilen alanlar ile kaç defa tekrar deneme yapılacağını, her bir deneme arasında lineer mi yoksa üstel bir şekilde bekleme süresi koyarak tekrar deneme süresi belirtilir. Böylelikle mesajların iletiminde yüksek başarı sağlanmaktadır.

 

SNS Özellikleri

Amazon SNS topici oluştuktan sonra, bu servisin bilinmesi gereken belli başlı özellikleri bulunmaktadır:

Subscriptions

SNS Topic’ine gelen mesajı servislere iletebilmek ve Pub/Sub mimarisindeki Sub(Subscription) kısmını ayarlanması gerekmektedir. Amazon SNS bir çok farklı tipte subscription sunmaktadır:

  • HTTP/HTTPS istemcileri
  • Email
  • SMS
  • Push Notification
  • Amazon SQS
  • AWS Lambda

Oluşturulan her bir abonelik için istemcinin mutlaka bu aboneliği kabul etmesi gerekmektedir. Çünkü Amazon, SNS kullanarak spam ya da saldırı yapılmasını istemez. SNS servisi bunun için abonelik ilk oluşturulduğuna kabul edilmesi için istemci adresine bir POST isteği göndermektedir. Bu istek içerisinde SubscribeURL alanındaki URL adresine istek atılması gerekmektedir.

HTTP abonelikleri için bir çok programlama dilinde hazır kütüphanelerde bu fonksiyonellik bulunmaktadır. Örnek olarak Spring Cloud içerisindeki NotificationSubscriptionMapping anotasyonunu gösterebiliriz.

Bir Subscription oluşturmak için protokol ve istemci adresini girmemiz zorunludur. Burada güncel olarak yukarıdaki listede bulunan protokoller mevcuttur.

Subscription filter policy: Bu alan sayesinde Topic’e gelen mesajların içeriğine göre burada belirtilen istemciye gitmesi sağlanabilir. Bu alana bir değer girilmemesi durumunda Topic’e gelen tüm mesajlar iletilmektedir.

Örnek olarak bir sipariş servisine gelen mesajlarda; hazırlanma cümlesi geçiyorsa Sipariş Hazırlama HTTP istemcisine, takip cümlesi geçiyorsa SMS ve Email istemcilerine iletimi sağlanabilir.

Redrive policy (dead-letter queue): Eğer istemciye mesaj iletiminde sorun yaşanıyor ve bu iletim tekrar denemelerde de başarılı olamıyorsa, bu mesajı dead-letter kuyruklarına iletimi sağlanarak mesajın kaybedilmesinin önüne geçilebilir.

Örnek olarak bir üyelik sisteminde kayıt olan kullanıcının çeşitli işlemlerinin yapıldığı bir servis istenmeyen bir şekilde çalışmıyor veya bakımda ise, müşterinin bilgilerinin kaybolmadan bir kuyrukta saklanması sağlanarak sistem tekrar çalışır hale geldiğinde işlenmesi sağlanabilir.

Publish
Mesajı gönderirken çeşitli protokollere göre farklı mesajlar yazılabilmektedir. Bu sayede örnek bir kayıt servisinde kullanıcı bilgileri diğer servise iletilirken (HTTP veya SQS istemcisi) JSON formatında makinelerin anlayabileceği bir mesaj gönderirken aynı anda SMS ve Push notification ile müşteriye kayıt işlemi tamamlandı bilgisi yollanabilir.

Örnek

AWS CLI toolunu kullanarak TestTopic adında bir Topic oluşturalım. .

$ aws sns create-topic --name TestTopic

Bu topic için HTTP subscription oluşturalım.

$ aws sns subscribe  --topic-arn arn:aws:sns:eu-central-1:123456789012:TestTopic \
                     --protocol https \
                     --notification-endpoint istemciadresimiz.com

Yukarıdaki komut çalıştırıldığında SNS servisinden belirtilen adrese bir HTTP isteği gönderilir. Bu istekte  x-amz-sns-message-type:SubscriptionConfirmation adında bir HTTP header’ı da gönderilir.

Header’da yazan SubscribeURL alınarak bir  POST isteği  atarak aboneliği tamamlamış oluruz.. Artık bu Topic ile gelen mesajları servisime iletime başlayabiliriz.

$ aws sns publish --topic-arn "arn:aws:sns:eu-central-1:123456789012:TestTopic" \
                  --message "Ilk mesaj"

Aşağıdaki gibi bir POST isteği ulaştı ve burada hangi Topic olduğunu ve mesajın içeriğini JSON formatında alabiliyoruz.

{
  "Type" : "Notification",
  "MessageId" : "792410ad-4774-6109-1ef9-4ff547ff3962",
  "TopicArn" : "arn:aws:sns:eu-central-1:123456789012:TestTopic",
  "Message" : "Ilk mesaj",
  "Timestamp" : "2020-05-02T23:12:11.814Z",
  "SignatureVersion" : "1",
  "Signature" : "...",
  "SigningCertURL" : "...",
  "UnsubscribeURL" : "..."
}

Bu  yazımızda Amazon SNS servisinden ve Pub/Sub mimarisinden bahsettik. SNS tekrar deneme, asenkron yollama gibi özellikleri ile sistemlerinizi ölçeklemeye yardımcı olabilir. Desteklediği subscription türleri ve filtreleme özellikleri ile kompleks sistemlerde de kullanıma elverişlidir.

AWS servisleri için diğer derslerimize buradan ulaşabilirsiniz.

20

Fahri Yardımcı

Site Reliability Engineer @ Atlassian Opsgenie

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?