Asp.NET Core’da AWS DynamoDB İle Basit CRUD İşlemleri
Merhaba,
Bu içeriğimizde Asp.NET Core Web API mimarisi ile AWS DynamoDB‘de basit düzeyde CRUD işlemlerinin nasıl yapılacağına dair bir incelemede bulunuyor olacağız. O halde vakit kaybetmeksizin buyrun başlayalım…
AWS DynamoDB Nedir?
AWS DynamoDB, Amazon Web Services tarafından sunulan, highly available olan NoSQL tabanlı bir veritabanı hizmetidir. AWS’nin Serverless Application Model‘i için oldukça kullanışlı bir yapıya sahip olan DynamoDB otomatik olarak ölçeklendirilebildiği(auto-scalable) için saniyede milyonlarca isteği işleyebilecek ve TB’larca veriyi depolayabilecek bir kapasiteye sahiptir. Ayrıca veri sorgulama süreçlerinde gecikme payı şaşırtıcı derecede oldukça küçüktür. Tüm bunların yanında güvenlik için, AWS kaynaklarına erişimi güvenli bir şekilde kontrol etmemize yardımcı olan IAM(Identity and Access Management) servisi ile diğer AWS servislerinde olduğu gibi doğal entegrasyona sahiptir.
Amazon, DynamoDB üzerinde aylık olarak 25 GB’lık ücretsiz bir alan sağlamaktadır. Ayrıca 200 milyona kadar read/write işlemlerine de izin vermektedir. Bu, DynamoDB’yi öğrenmek maksatlı tatbik etmek ve hatta küçük ölçekli yazılımlarda da istifade edebilmek için oldukça yeterli bir imkandır diye düşünüyorum.
AWS platformuna aws.amazon.com/tr/free adresinden ücretsiz üye olabilirsiniz.
DynamoDB Teminolojisi
- Table
Diğer veritabanı sistemlerine benzer şekilde DynamoDB’de verilerini table’lar da depolamaktadır. Bir başka deyişle table’lar veri collection’ları olarak kullanılmaktadırlar. - Items
Table’lar da ki her bir veri item olarak nitelendirilmektedir. Diğer ilişkisel veritabanlarındaki satırlara yahut NoSQL yapılanmalardaki document’lara karşılık gelmektedir. Item’lar da depolama sınırı söz konusu değildir. - Attributes
Her item, bir veya birden fazla attribute’tan meydana gelmektedir. Attribute’lar temel veri öğeleridir. İlişkisel veritabanlarındaki kolonların, normal NoSQL yapılanmasındaki field’ların muadilleridir.
Başlarken
Artık DynamoDB’yi incelemek için yavaştan kazmayı vurabiliriz. Tabi bunun için öncelikle makale süresince yapacağımız işlemleri başta önbilgi olması maksadıyla bildirmekte fayda görmekteyim. Bu içeriğimizde AWS CLI aracılığıyla belirli yapılandırmalara dayalı DynamoDB veritabanı oluşturacak ve bir entity üzerinden temel CRUD operasyonlarını yürüterek, irdelememizi gerçekleştiriyor olacağız.
AWS Console İle DynamoDB’de Tablo Oluşturma
Her şeyden önce DynamoDB’de bir tablo oluşturarak başlayalım. Bunun için console üzerinden aşağıdaki görseldeki gibi DynamoDB’yi aratınız ve ilgili servise tıklayarak, gidiniz.Devamında ise açılan sayfadan turuncu ‘Create Table’ butonuna tıklayarak tablo oluşturma sayfasına gidiniz.Son olarak açılan sayfada oluşturulacak tablo ile ilgili bilgileri giriniz.Burada dikkat ederseniz tabloya örnek maksatlı ’employees’, primary key kolonuna ise ‘id’ isimlerini vermiş bulunuyoruz. ‘id’ kolonunun, sayısal olup olmayacağını kendinize göre özelleştirebilir ve duruma göre belirleyebilirsiniz. Şimdilik tabloyu oluşturmak için bu temel ayarlar kâfidir.
Ekstradan bir işleme gerek kalmaksızın sayfanın en altına geliniz ve ‘Create Table’ butonuna tıklayarak, tabloyu üretiniz.
AWS IAM Aracılığıyla Kullanıcı Oluşturma ve Access Key Generate Etme
Şimdi DynamoDB’de oluşturulan bu tabloyu ASP.NET Core uygulamalarında nasıl kullanabileceğimizi incelemeye başlayalım. Tabi ilk olarak AWS DynamoDB’ye erişim için AWS IAM’de yetkilendirilmiş bir kullanıcı tanımlaması yapılması gerekmektedir.
IAM(Identity and Access Management), AWS kaynaklarına erişimi güvenli bir şekilde kontrol etmemize yardımcı olan bir servistir. Açılan oturumları, kaynakları kullanmak için yetkilendirilen kullanıcıları vs. denetlememizi sağlamaktadır.
Bunun için AWS Console üzerinden IAM servisine gidiniz ve bir kullanıcı oluşturunuz. Eğer konuya dair pek bilginiz yoksa önceden AWS S3 konusunda klavyeye almış olduğum makaleden konuyla alakalı bölümü okuyarak detaylı bilgi edinebilirsiniz.
Burada oluşturulacak kullanıcı için tek dikkat edilmesi gereken husus policy’sinin ‘DynamoDB’ olacak şekilde ayarlanmasıdır.Kullanıcıyı oluşturduktan sonra menü üzerinden tekrar ‘Users’ sayfasına, oradan da ilgili kullanıcıya tıklayınız ve açılan sayfada ‘Security credentials’ sekmesine gelerek oradan da aşağıdaki ‘Create access key’ butonuna tıklayarak DynamoDB’ye erişim için gerekli olan access key’i oluşturup, kaydediniz.Edinilen bu access key ve secret key bilgilerine rahat ve güvenilir erişim sergileyebilmek için AWS CLI ile local bilgisayarımıza aşağıdaki gibi depolayalım.Dikkat ederseniz ‘dynamodb-profile’ ismine karşılık credential bilgilerimiz AWS CLI aracılığıyla local’imize kaydedilmiştir. Ayrıca seçilen region’ın AWS bölgenize uygun olduğuna dikkat etmenizde fayda vardır. Aksi taktirde tabloyu farklı bir bölgede oluşturduysanız muhtemel erişim sıkıntısı yaşayacağınızdan dolayı sağlıklı bir şekilde kullanamayabilirsiniz.
Asp.NET Core Uygulamasıyla DynamoDB’yi Kullanma
Yukarıda yaptığımız tüm çalışmalar ve altyapılar neticesinde artık Asp.NET Core uygulaması üzerinden DynamoDB’yi nasıl kullanabileceğimizi teknik olarak incelemeye geçebiliriz. Bunun için boş bir Asp.NET Core Web API uygulaması oluşturunuz ve direkt uygulamanın ‘appsettings.json’ dosyasında biraz önce edindiğimiz ve AWS CLI ile local’e kaydettiğimiz access key ve secret key bilgilerini aşağıdaki gibi işleyiniz.
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "AWS": { "Profile": "dynamodb-profile", "Region": "ap-south-1" } }
Ardından DynamoDB’ye bağlanabilmek ve gerekli sorgulama sürecini başlatabilmek için Nuget’ten AWSSDK.DynamoDBv2 ve AWSSDK.Extensions.NETCore.Setup kütüphanelerini uygulamaya yükleyiniz.Bu işlemlerden sonra artık oluşturduğumuz ’employees’ tablosunda tutulacak verileri modelleyecek olan bir entity oluşturunuz. Bu entity’nin yapısı ve mahiyeti işin ihtiyacına ve sizlerin taktirine kalmıştır. Ben bu örneklendirmede aşağıdaki kadarıyla yetiniyor olacağım.
[DynamoDBTable("employees")] public class Employee { [DynamoDBHashKey("id")] public int? Id { get; set; } [DynamoDBProperty("name")] public string? Name { get; set; } [DynamoDBProperty("surname")] public string? Surname { get; set; } [DynamoDBProperty("birth_date")] public DateTime? BirthDate { get; set; } }
Yukarıdaki kod bloğunu incelerseniz eğer ‘Employee’ isminde oluşturduğumuz bu entity sınıfını DynamoDB’de ki ’employees’ tablosuyla DynamoDBTable
attribute’u aracılığıyla eşlemekteyiz. Ayrıca primary key olacak olan ‘Id’ property’sini ise DynamoDBHashKey
attribute’u ile işaretleyerek belirtmekteyiz.
Şimdi ise yapılan bu konfigürasyonları ve DynamoDB context’ini Asp.NET Core pipeline’ına dahil ederek devam edelim.
. . . builder.Services.AddSwaggerGen(); builder.Services.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions()); builder.Services.AddAWSService<IAmazonDynamoDB>(); builder.Services.AddScoped<IDynamoDBContext, DynamoDBContext>(); var app = builder.Build(); . . .
Dikkat ederseniz 6. satırda AddDefaultAWSOptions
metodu ile ‘appsettings.json’ dosyasındaki yapılandırmaları, 7. satırda IAmazonDynamoDB
interface’i ile Amazon DynamoDB servisini ve 8. satırda IoC’ye IDynamoDBContext
arayüzüne karşılık DynamoDBContext
nesnesini ekleyerek servisleri uygulamaya register ediyoruz.
Sırada ise DynamoDB ile CRUD işlemlerini fiilen gerçekleştirebilmek için controller oluşturma vardır. Bunun için aşağıdaki gibi ‘EmployeesController’ı oluşturunuz.
[Route("api/[controller]")] [ApiController] public class EmployeesController : ControllerBase { readonly IDynamoDBContext _dynamoDBContext; public EmployeesController(IDynamoDBContext dynamoDBContext) { _dynamoDBContext = dynamoDBContext; } [HttpGet] public async Task<IActionResult> Get() { List<Employee> employees = await _dynamoDBContext.ScanAsync<Employee>(default).GetRemainingAsync(); return Ok(employees); } [HttpGet("{id}")] public async Task<IActionResult> Get(int id) { Employee employee = await _dynamoDBContext.LoadAsync<Employee>(id); return Ok(employee); } [HttpPost] public async Task<IActionResult> Post(Employee employeeRequest) { Employee employee = await _dynamoDBContext.LoadAsync<Employee>(employeeRequest.Id); if (employee != null) return BadRequest($"Employee with Id {employeeRequest.Id} already exists."); await _dynamoDBContext.SaveAsync(employeeRequest); return CreatedAtAction(nameof(EmployeesController.Post), new { employeeRequest.Id }, employeeRequest); } [HttpPut] public async Task<IActionResult> Put(Employee employeeRequest) { Employee employee = await _dynamoDBContext.LoadAsync<Employee>(employeeRequest.Id); if (employee == null) return NotFound(); await _dynamoDBContext.SaveAsync(employeeRequest); return Ok(); } [HttpDelete("{id}")] public async Task<IActionResult> Delete(int id) { Employee employee = await _dynamoDBContext.LoadAsync<Employee>(id); if (employee == null) return NotFound(); await _dynamoDBContext.DeleteAsync(employee); return NoContent(); } }
Yukarıdaki kod bloğunu incelerseniz ’employees’ tablosuna veri ekleyecek ve ardından eklenmiş olan bu verileri topluca yahut id bazlı sorgulayabilecek, güncelleyebilecek ve silebilecek tüm operasyonlar gerçekleştirilmektedir.
İşte bu kadar 🙂 Basit düzeyde uygulamanın geliştirilmesi oldukça kolay, öyle değil mi 🙂 Şimdi gelin yaptığımız bu çalışmayı test edelim.
Test Edelim
Uygulamayı ayağa kaldırdığımızda bizleri direkt Swagger karşılayacaktır. Ekleme, silme ve güncelleme işlemlerini yaptığınız taktirde (umuyorum ki 🙂 )kusursuz çalıştığını göreceksiniz. Burada tüm aksiyonları test ederek içeriği şişirmektense, numune olması açısından sadece ‘Get’ işlem neticesini incelemek ve DynamoDB’de de ilgili tabloyu fiziksel olarak gözlemlemekle yetinmenin kafi olacağı kanaatindeyim.
Nihai olarak;
Bu içeriğimizde, Asp.NET Core uygulamalarında DynamoDB ile CRUD işlemlerinin nasıl gerçekleştirileceğini en temel düzeyde AWS CLI yapılandırmalarını ve IAM(Identity and Access Management) çalışmalarını da tekrardan tatbik ederek ele almış bulunuyoruz. Okuyarak eşlik ettiğiniz için teşekkür ederim…
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Not : Örnek uygulamayı aşağıdaki github adresinden edinebilirsiniz.
https://github.com/gncyyldz/AWS.DynamoDB.Example
1 Cevap
[…] Service’leriyle olan entegrasyonlar sayesinde de istifade edilebilmektedir. Yani isterseniz DynamoDB ile bağlantı kurup veritabanı işlemleri gerçekleştirebilir yahut AWS S3 üzerinden dosya […]