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.
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.
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.
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.
[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