AWS Cognito ve DynamoDB ile Kullanıcı Servisi
Şimdi mikroservis mimarimizin ilk servisini authService yapısını yazarak başlayalım.

Yeni bir serverless proje oluşturarak başlıyorum. Projeyi oluşturduk ve şimdi aws hesabımızdan cognitoyu yapılandırmaya gidelim.


Bu şekilde doldurup oluşturuyorum.
Uygulama olarak mobile app seçtim spa da seçebilirim genel olarak aynı işliyor.
Configure options da email seçtim bu kullanıcının authentication için email ve password kullanacağını söyler. Zorunlu alanlar içinde email, name alanlarını belirledim. Self-registration: Enabled ise kullanıcının hesap oluşturabileceğini söylüyor. Zaten istediğimizde bu.

Oluşturduk. Şimdi oluşturdum authServisine vscode üzerinde gidiyorum.

Burada handlers klasörü oluşturdum ve içerisine signUp işlevimi ekledim. Burada işlevlerimi handlers klasörü içerisinde yazacağım. İlk olarak kayıt olma işlevinden başlıyorum.

Bu şekilde signUp fonksiyonumuzu yazdım. Şimdi detaylıca açıklayayım.
AWS SDK v3 için Cognito Identity Provider client'ını ve kullanıcı kaydı için gerekli SignUpCommand’ı projeye dahil ediyoruz.
Cognito ile konuşmak için bir client oluşturuyoruz. Burada aws hesabımızdaki bölgeyi giriyoruz.
CLIENT_ID: Bu ID, hangi user pool client üzerinden sign up yapılacağını belirliyor.

Cognito servisinden uygulamaya ait keyi bulabiliriz.
signUp fonksiyonu içerisinde gelen request’in body’sinden email, fullName ve password ayrıştırılıyor.
params değişkeni değerleri şu şekilde:
-
ClientId → Hangi Cognito App Client’ın kullanılacağını belirtiyor.
-
Username → Genellikle email kullanılıyor.
-
Password → Cognito kurallarına uyması gereken şifre.
-
UserAttributes → Kullanıcıya ait ek bilgiler:
-
email
-
name (fullName)
const command = new SignUpCommand(params);
await client.send(command);
bu son iki satırla Cognito’ya gerçekten “yeni kullanıcı oluştur” isteğini gönderiyor.
Şimdi fonksiyonu yazdıkta bu fonksiyonu nasıl kullanacağız? Api gateway konusunda görmüştük serverless.yml da tanımlamasını yapacağız.

signUp fonksiyonumu handler da gösteriyorum. Path olarak /sign-up diyorum ve method olarakta post kullanıyorum. Klasik bir kullanıcı kayıt endpointi olarak düşünebiliriz.
Şimdi artık deploy edebiliriz.

“sls deploy” aslında “serverless deploy” komutunun kısa yazım şekli oluyor. Şu an full deploy aldık fark ederseniz single function deploy yapmadım çünkü birden fazla fonksiyon ve yml dosyasında yapısal değişiklik yaptım ve zaten ilk kez deploy ediyorum.

Hata aldım. Acaab neden? Bunun için cloudwatch’a bakacağım.

Bir şeyleri yanlış yazmışım. SignUp değilde signup şeklinde yazmışım onu düzeltip tekrar deploy ediyorum.

Single function deploy bu sefer benim için yeterliydi.

Şimdi hatanın şekli değişti politika falan filan diyor.

Hala beğenmiyor.

Ve başarılı.

Aynı zamanda mailimize bir kod geliyor. Yani aslında yapmamız gereken kullanıcının otp girmesine izin vermek için bir fonksiyon daha yazmak. Bu eposta adreslerini doğrulamak için gerekiyor.


Ilgili fonksiyon ve route tanımlamalarını yaptım ve kodu detaylıca açıklamayacağım. Gayet anlaşılır bir yapı var.


Burada daha önceden kayıt yaptığım mailleri görüyorum ve bunları sileceğim. Durumları onaylanmadı görüyoruz.


Kayıt ve onay işlemlerini tamamladım.

Aktif ve onaylı bi kullanıcı hesabı var.
Şimdi oturum açma işlevini yazalım.

Öncelikle unutmuşuz Sign in with username and password: ALLOW_USER_PASSWORD_AUTH seçeneğini aktifleştiriyorum. Bunu seçmezsek kullanıcı giriş yapma özelliğimiz çalışmayacak.


App Client’ta USER_PASSWORD_AUTH flow aktif olmalı. AuthFlow da belirtilen satırı az önce cognito servisinde aktif ettik.

Deploy tamam.



Giriş işlemi sonucunda bize tokens keyi değeri olarak response.AuthenticationResult objesini dönüyor. Bu obje jwt tokenlerini içeriyor.

Şimdi kodlarımızda CLIENT_ID bilgisini açıkça tutuyoruz banu daha güvenli bir şekilde saklayalım. Öncelikle terminale girip aws configure diyorum. Burayı IAM konusunda işlemiştik.

Kullandığım bölgeyi eu-north-1 olarak belirledim.



Burada yaptığımız işlem AWS CLI üzerinden SSM Parameter Store’a bir değer kaydetmek oldu.
Bunu genelde Serverless, Lambda veya diğer AWS servislerinin kullanacağı gizli veya konfigürasyon değerlerini saklamak için yaparız.
Yani bu sayede lambda fonksiyonlarımız içerisinde doğrudan const CLIENT_ID tanımlaması yapmayacağız. Bir nevi env kullanımı yapacağız.


Bu sayede fonksiyonlarımızda env üzerinden okuyor olacağız.
Şimdi kullanıcı oturum kapama fonksiyonunu yazalım.




Accesstoken üzerinden logout işlemini tamamladık.
Şimdi kullanıcı bilgilerimizi depolamak için servisimize DynamoDB ekleyeceğiz.
DynamoDB nedir?
AWS’nin tamamen yönetilen, serverless, yüksek performanslı NoSQL veritabanı servisidir. NoSQL Veritabanıdır. DynamoDB bir key-value ve document tabanlı veritabanıdır. AWS’nin mongodb alternatifi gibi düşünebiliriz.

Yml dosyama geldim ve resources tanımlamamı yaptım. Resources ile Serverless Framework’e CloudFormation kaynakları oluşturacağını söyledik. Burada DynamoDB, S3, SQS, vb birçok hizmet yazılabilir.
AWS::DynamoDB::Table ile Yeni bir DynamoDB tablosu oluşturulacağını ifade eder.
AWS üzerinde Users adında bir tablomuz olacak. PAY_PER_REQUEST ile otomatik ölçeklenir herhangi bir kapasitemiz yok. Uygulama ne kadar kullanırsa o kadar ödeme yapılır.
AttributeDefinitions ile userId adında bir kolonum olacak ve string olacak diyorum.
KeyType: HASH ile Bu tablo için bir partition key belirlemiş oluyorsun. Her kaydı benzersiz şekilde tanımlayan ilk anahtardır.
Burada DynamoDB tercih etmemizin sebebi tamamen serverless olması zaten amacımızda serverless yapıları kullanmak. Kendimiz herhangi bir şekilde ölçeklendirmeye odaklanmayacağız dikkat etmemiz gereken en önemli şey doğru veritabanı tablo tasarımları uygulamak ki maliyeti artırmayalım çünkü serverlessda yazılan her bir satır kod ve kurulan yapı maliyeti etkiliyor.
Sls deploy diyerek deployumuzu alıyoruz.

Şimdi bir kullanıcı modeli oluşturalım.

Models diye bir klasör oluşturup user modelimi tanımladım. Şimdi bunu signUp fonksiyonunda kullanacağım.

Ve deploy edip test edelim.

Hata aldık şimdi bunu çözelim. Yapmamız gereken lambdaya öğe ekleme izni vermek.

Serverless framework uzantısını kurup serverless yml da hızlıca tamamlama özelliğini kullanabiliriz. iamRoleStatements üzerine gelip tab’a basıyorum.

Resource bilgisini aws de tablomuza tıklayıp detayında görebiliriz.

Tekrar deploy edip test edelim.



Dynamodb kaydetme işlemimiz başarıyla tamamlandı.