Asp.Net Core ile Amazon Simple Storage Service (AWS S3) Kullanımı

Hakan Topuz
3 min readJan 31, 2021

--

Merhabalar,

Bu yazımda .Net Core projesinde AWS S3 servisinin kullanımını anlatacağım.Çalışmakta olduğum projede, bu proje microservice mimarisi kullandığımız Asp.Net Core ile geliştirdiğimiz bir proje, dosya saklamak amacıyla kullandık bu servisi ve bu konuyla alakalı bir yazı paylaşmak istedim.

Öncelikle AWS S3 servisinden bahsedelim:

Amazon S3 Nedir?

Amazon S3, İnternet’te her yerden, her boyutta veri almak ve depolamak için oluşturulmuş bir nesne depolama hizmetidir. Çok düşük maliyetlerde sektör lideri dayanıklılık, erişilebilirlik, performans, güvenlik ve neredeyse sınırsız ölçeklenebilirlik sunan basit bir depolama hizmetidir.

Dediğim gibi biz de microservice mimarisiyle geliştirdiğimiz projede dosya saklamak için file storage olarak kullandık bu hizmeti.

Amazon S3 Terminoloji

Bucket: Amazon S3 içerisinde saklanan objelerin tutulduğu containerlardır.Her obje bir bucket’in içinde olmalıdır.

Object: Amazon S3'te asıl saklanan veridir.S3 içerisinde obje ve bu objeye bağlı meta bilgileri bulunur.Ad, değiştirilme tarihi, content type gibi meta bilgileri içerir.İstenirse dosya yükleme esnasında özel meta verileri de oluşturulabilir.

Key: S3 Bucket içerisinde saklanan veriye tanımlanan unique bir değerdir.Dosya ismi olarak düşünebiliriz.

Region: Her bucket bir AWS Region’ında bulunur ve bucket oluşturulurken region bilgisi de girilir.Dosyaların tutulacağı bölge seçimi yapılır aslında.Gecikmeyi en aza indirmek, maliyetleri düşürmek için konuma en yakın bölge seçilir.

Benim amazon hesabına giriş yetkim olmadığı için dosyaları görüntülemek için bir uygulama kullanmam gerekti. Cyberduck kullandım sizde kullanabilirsiniz.

Programı kurup açtığınız zaman “Yeni Bağlantı” butonuna tıklayarak şu şekilde ayarlamalarınızı yapıp sunucuya bağlanabilirsiniz.

Ayrıca bu uygulama üzerinden dosya ekleme, silme vs. işlemleri için permission ayarlarını yapmanız gerekiyor.Düzen > Tercihler menüsünü tıklayıp;

bu şekilde ayarlarınızı yapabilirsiniz.

Amazon sunucusu tarafına pek değinmeyeceğim.O taraf için yetkimiz yoktu çünkü bizim.Daha çok kodlama üzerine olacak yazı.Fakat amazon tarafında bucket oluşturma vs. işlemleri için kaynak olarak eklediğim c-sharpcorner.com’daki yazıya bakabilirsiniz.

Şimdi ufaktan kod tarafına geçelim.Proje Web Api projesi, base64(string) olarak post edilen dosyayı alıp Amazon S3 sunucusuna kaydedeceğiz.

Öncelikle aşağıdaki nuget paketlerini projemize dahil ediyoruz.

  • AWSSDK.Extensions.NETCore.Setup
  • AWSSDK.S3
  • Swashbuckle.AspNetCore
  • Swashbuckle.AspNetCore.Annotations

Amazon tarafından bize verilen AccessKey, SecretKey gibi bilgileri, Octopus tarafında yönetebilmek için “appsettings.json” dosyasında tutacağız.

Bu ayarları modellemek için AWSServiceConfiguration sınıfımızı oluşturuyoruz.

appsettings.json dosyamızda şu şekilde değerleri tutuyoruz.

Bu ayarlar ile Amazon servisini configure etme işlemine geçeceğiz şimdi.

Startup.cs sınıfımızda, aşağıdaki gibi appsettings.json’dan aldığımız değerler ile AWSOptions sınıfımızı oluşturuyoruz ve AddAWSService metoduna bu sınıfı parametre olarak göndererek, IAmazonS3 interface’ini register ediyoruz.

En son AWSServiceConfiguration modelimizi, Helper sınıfımızda kullanacağımız için configure ediyoruz.

IAmazonS3 interface’i lifetime olarak default Singleton tanımlıdır.İsterseniz projenizin yapısına göre değiştirebilirsiniz.

Şimdi AWS S3 işlemlerini yapacağımız FileHelper sınıfımıza geçelim.

FileHelper sınıfımız da bu şekilde.Burada birkaç detaydan bahsetmek istiyorum;

Storage içerisinde klasör yapısı kullanmak istiyorsanız, dosya kaydederken Key değeri olarak “klasörismi/test.jpg” gönderirseniz, verdiğiniz isimde klasör oluşturarak dosyayı onun içerisine kaydeder ve bundan sonra o dosyaya ulaşmak isterseniz tabi key değeri olarak bu ismi kullanmanız gerekir.

Ayrıca dosya kaydetme işleminde CannedACL değerini “S3CannedACL.PublicRead” olarak gönderdik.Bunun sebebi ise kaydedilen dosyaya storage url üzerinden erişebilmekti.Eğer bu değeri göndermezseniz dosyanız private olarak kaydedilir ve url üzerinden erişemezsiniz.

Örnek url; https://*storage_path*.s3-*region*.amazonaws.com/klasörismi/test.jpg

Ben S3 storage’ı sayfa üzerinde gözükecek resimler için kullandığımdan dolayı bu değerle gönderdim.Eğer dışardan erişilmesini istemediğiniz örneğin mail template tarzı dosyalarınız varsa bu property’yi hiç göndermeyebilirsiniz.

Aşağıdaki gibi birçok ayar mevcut.Bunları da inceleyip size uygun olan değer ile de dosyalarınızı kaydedebilirsiniz.

Bu şekilde FileHelper sınıfını yazdıktan sonra, register ederek IFileHelper interface’i üzerinden kullanabilirsiniz.

Görüldüğü üzere SDK’sı sayesinde kullanımı gayet kolay bir servis.Umarım faydalı bir yazı olmuştur.Sorularınız olursa yorum olarak yazabilirsiniz.

Sağlıcakla kalın.

Kaynak:

https://www.c-sharpcorner.com/article/how-upload-any-files-on-amazon-simple-storage-service-aws-s3-in-asp-net-core/

--

--