AWS SQS, SES ile Sipariş Servisi

Order servisimi oluşturdum. Şimdi serverless.yml dosyamı düzenliyorum ve dynamoDB bilgilerini giriyorum.

Region, runtime ve resources altında OrdersTable adıyla DynamoDB tablomu bağladım. Yapıyı direkt productService dosyasından kopyalıyorum orada detaylarını anlatmıştım.
Şimdi sipariş verme fonksiyonunu yazalım. Burada sipariş verme işlemi sırasında productService ile iletişime geçmek için fetch kullanacağım.



-
Gelen veriyi doğruluyor
-
Ürün gerçekten onaylı mı diye başka bir API’den kontrol ediyor
-
Stok yeterli mi diye bakıyor
-
Siparişi DynamoDB’de ORDERS_TABLE’a kaydediyor
DynamoDB’e kaydettiğimiz data ise şu şekilde:
-
id → { S: orderId } → siparişin ID’si
-
productId → { S: id } → hangi ürüne ait
-
quantity → { N: "3" } gibi string number
-
email → siparişi veren kullanıcı
-
status → "pending" → sipariş onaylanmamış / kargoya verilmemiş vs.
-
createdAt → ISO tarih string’i
Şimdi API Gateway routeumuzu tanımlayalım.

Ve IAM yetkimizi de verelim dynamoDB put item yetkisini verelim.

Resource: Fn::GetAtt: [OrdersTable, Arn] bu satır bu izin yalnızca şu tabloya verilsin diyor. Yani bu lambda fonksiyonu sadece Orders tablosuna yazabilir.

Şimdi endpointi kullanalım.

Neden? Çünkü ürün stokta 30 tane yok.

2 tane var.

2 tane sipariş edince kabul ettti.
Şimdi Amazon SQS hizmetine bakacağız.
AWS SQS Nedir?
AWS SQS (Amazon Simple Queue Service), Amazon Web Services tarafından sunulan tam yönetilen bir mesaj kuyruğu (message queue) servisidir. AWS SQS, bir sistemin farklı parçaları arasında mesajları (tasks) geçici olarak tutan güvenilir bir kuyruğu ifade eder.
-
Bir bileşen mesajı kuyruğa gönderir
-
Başka bir bileşen mesajı kuyruqdan okur / işler
-
Sistem parçaları birbirinden bağımsız çalışır
Yani biz siparişleri hemen veritabanına kaydetmek yerine onları önce bir SQS kuyruğuna koyacağız. Sonrasında bir lambda fonksiyonu kuyruğu işleyecek ve siparişleri DynamoDB’e kaydedecek. Bu sayede birçok siparişi kesintiye uğramadan yönetebileceğiz.
Öncelikle SQS kaynağını serlervess yml da tanımlayacağım.

Kaynağımı OrdersQueue adında tanımladım. Sls deploy komutunu vererek deploy aldım ve şimdi aws SQS hizmetinden kuyruklarımı kontrol ediyorum.


Buradaki url bilgisini kullanacağız. Bunu serverless.yml dosyasında environment olarak ekliyorum.


Fonksiyonumuzu düzenledim burada önceden doğrudan dynamoDB’e kayıt yapıyorduk artık SQS kuyruğuna ekliyoruz. Yani adım adım şunu yapıyor.
Sipariş isteğini alıyor, ürünü onaylı ürünler listesinden kontrol ediyor, stok yeterli mi bakıyor, yeterliyse siparişi bir SQS kuyruğuna mesaj olarak atıyor ve cevabı dönüyor.
Şimdi SQS için gerekli izinleri tanımlayalım.

- 'sqs:SendMessage'
- 'sqs:ReceiveMessage'
- 'sqs:DeleteMessage'
Izinlerini ekledim.
Fn::GetAtt: [OrdersQueue, Arn] satırını da açıklamak gerekirse OrdersQueue adındaki SQS kuyruğunun ARN değerini getir Lambda sadece bu kuyruğa mesaj gönderebilir / okuyabilir / silebilir diyor.

Şimdi endpointi tekrar çalıştırdım ve başarılı sonuç aldım.

Burada ‘send and receive messages’ butonuna tıklıyoruz. Açılan sayfada aşağıda yer alan ‘Poll for messages’ butonuna tıklıyoruz.

Ve kuyrukta yer alan mesajımızı görüyoruz. Şimdi kuyruğu okumak için bir lambda fonksiyonu yazalım ve siparişi DynamoDB’e kaydedelim.

Bunun için processOrder fonksiyonu yazdım. SQS kuyruğuna gelen sipariş mesajlarını alıp DynamoDB’ye kaydeden bir Lambda fonksiyonudur.
-
SQS kuyruğundan gelen mesajları (siparişleri) okur.
-
Her siparişi parse eder.
-
Siparişi DynamoDB tablosuna kaydeder.
Yani şu sıralama ile çalışır SQS -> Lambda -> DynamoDB
Şimdi bu fonksiyonu tetikleyecek olayı serverless.yml da yazalım.

processOrder tanımlamamı yaptım. Bu event sqs olayını dinleyecek.

Bu sekme, SQS kuyruğunun Lambda’yı tetiklediğini gösteriyor. OrderQueue > processOrder Lambda fonksiyonunu otomatik tetikliyor. SQS’ye mesaj düştüğünde Lambda otomatik çalışacak.
SQS konusundan sonra birde SES konusuna bakalım.
Amazon SES (Simple Email Service), Amazon Web Services (AWS) tarafından sunulan tamamen yönetilen bir e-posta gönderme servisidir. Temel olarak uygulamaların güvenilir, hızlı ve ölçeklenebilir şekilde e-posta göndermesini sağlar.
Bizde alıcıya hemen e-posta göndermek için bu hizmeti kullanacağız.
Bunun için services klasörü oluşturup içerisine sendEmail fonksiyonunu yazacağım dosyayı oluşturuyorum.

-
Bu fonksiyon toEmail, orderId, productName alıyor,
-
basit bir “sipariş onayı” mail’i hazırlıyor,
-
Amazon SES üzerinden maili gönderiyor,
-
hata olursa da Error fırlatıyor.
Şimdi sipariş oluşturulduktan sonra e-mail gönderimini tetikleyecek şekilde yapılandıralım.
Bunun için placeOrder fonksiyonuma ekleme yapıyorum.


SQS’e gönderim yapıldıktan sonra tetiklenecek. Burada ürün ismini product.productName?.S
Bu formatta yazmamızın sebebi product objesinin şu formatta gelmesinden kaynaklanıyor dynamoDB’den "productName": { "S": "Laptop" },
Şimdi email’i gönderen kaynağı doğrulamak için gerekli kod bloğunu serverless.yml dosyasına ekleyeceğim.

Resources olarak OrderServiceEmailIdentity ekledim ve kaynak mailimi tanımladım.
‘sls deploy’ ile deploy ettikten sonra mail adresime gelen doğrulamayı yapıyoru

Ilgili bağlantıya tıklıyorum.
Daha sonrasında lambdaya email gönderme izni verelim.


Buradaki kimliğimizin üzerine tıklayıp arn değerini alıyoruz.

Bu şekilde resource de tanımlıyoruz.

Şimdi ürün siparişi verdim ve mail adresimi kontrol ediyorum.
