Test Ortamına Uygun Şekilde SNS ve SQS Servislerini Kullanarak Uygulama Geliştirelim + LocalStack
Herkese selamlar, bugün konumuz aws servisleri ve localstack. Başlık biraz garip gelmiş veya anlaşılmamış olabilir. Bugün altını çizmek istediğim konu aws servislerini kullanmak değil de , bu servisleri localde ve test ortamında nasıl düzgün çalıştırabiliriz konusuna değinmek. Son yaptığım bir projede SNS+SQS servislerini kullanmam gerekti. Fakat bu servisleri debug edip localde çalıştırmak gerekti. Bunun için araştırmaya koyuldum. Ve LocalStack adlı projeye denk geldim. Gelin beraber Spring boot kullanarak mini bir bildirim gönderen uygulama yazalım ve yazdığımız uygulanmayı aws servislerine bağlanmadan localde çalışır hale getirelim.
SNS ve SQS Servislerinin Oluşturulması
İlk önce SNS konfigürasyonunu yapalım.
Buradaki endpointi properties dosyasından almamım sebebi, farklı enviromentler için bu değerin değişiyor olmasıdır. Production’da gerçek aws url’i kullanılırken test ve local ortamda localhost değeri kullanılacaktır.
SQS configurasyonunu yapalım.
Konfigürasyonları da tamamladığımıza göre şimdi de daha önce oluşturduğumuz topiğe mesaj gönderelim ve consumer servisi gelen mesajı handle etsin.
Gelen mesajı dinleyelim
Artık gelen mesajlar bu kuyruğu dinleyen execute methoduna düşüyor ve mesajı istediğimiz gibi handle edebiliyoruz. Ayrıca SNS ile gönderilen mesajları sadece SQS alabilir diye bir şart yok. Bir çok protokol mevcut olduğunu hatırlatmakta fayda var.
Peki bu işlemi aws servislerine bağlanmadan localde nasıl tekrar edebiliriz ?
Bunun çözümü de localstack. Bu framewrok AWS servislerini kendi bilgisayarınıza simüle etmeye yarıyor ve özellikle testing konusunda çok önemli bir rol oynuyor. Yazdığımız kodların testlerini localstack yardımı ile daha iyi hale getiriyoruz.
Docker compose üzerinden kurulumu.
pip install localstack
diyerek localstack’i indirebiliriz.
Öncelikle yukarıda yazdığımız mini apiyi test etmemiz gerek. Bunun için bir SNS topiğine ihtiyacımız var. Hadi oluşturalım.
aws --endpoint-url=http://localhost:4566 sns create-topic --name notification --region eu-central-1
diyerek topic oluşturabiliriz. Şimdi ise SQS hizmetini kullandığımız için bir kuyruk oluşturalım.
aws --endpoint-url=http://localhost:4566 sqs create-queue --queue-name telegram-message-queue --region eu-central-1
Kuyruğumuzu da oluşturduktan sonra geriye sadece, bu kuyruğu ilgili topiğe subscribe etmek kalıyor.
aws --endpoint-url=http://localhost:4566 sns subscribe --topic-arn arn:aws:sns:eu-central-1:000000000000:notification --protocol sqs --notification-endpoint http://localstack:4566/000000000000/telegram-message-queue --output table | cat
Bu komutu da çalıştırdıktan sonra başarılı bir şekilde çıktı almanız gerekiyor, bir şeyler yanlış gittiyse makaleyi tekrardan okuyun ve adımları tekrar edin.
Şimdi de serverin düzgün çalışıp çalışmadığını kontrol edelim ve topiğe bir mesaj atalım.
aws sns publish --endpoint-url=http://localhost:4566 --topic-arn arn:aws:sns:eu-central-1:000000000000:notification --message "Hello World" --region eu-central-1
başarılı bir şekilde java uygulamanıza mesaj düşmüş olması gerekiyor. Eğer aws propertiesleri için prod harici bir properties dosyanız yoksa oluşturup tekrar deneyin. Örnek bir test properties dosyası bırakıyorum aşağıya.
Okuduğunuz için teşekkür ederim. Mutlu kodlamalar.