AWS: S3 ile Veri Saklama

Amazon Web Servisleri (AWS) her gecen popülerliği artan bir konu. Her ne kadar daha önceleri çok heves edip bir iki deneme yapmış olsam, Amazon’da çalışmaya başlayana kadar iş yerinde hiç kullanmamıştım. Şimdi yavaş yavaş projelerde AWS kullandığımızdan, artık bir iki yazı yazmanın zamanı geldi diye düşünüyorum. Yazılar genelde, AWS hakkındaki ön yargılarım, ücretlendirme politikaları ve Java ile nasıl uygulamanızda kullanmaya başlayabileceğiniz üzerine olacak. S3’den başlamamın sebebi ise, S3 (Simple Storage Service) nin en basit servislerden biri olması.

S3 Nedir?

Basitçe, binary formatta verileriniz saklayabileceğiniz, AWS ürünü. Daha detaylı nasıl açıklayabilirim bilmiyorum. Eğer verinizi binary (ikili format, 1 ve 0, byte[] vs) formatta tutabiliyorsanız S3’ye kaydede bilirsiniz. Yani özetle herşeyi kaydede bilirsiniz. Ücretlendirmesinin nasıl yapıldığına birazdan değineceğim ama çok ucuz bir veri saklama yöntemi. Bir kaç örnek uygulama üzerinden anlatayım:

  • S3 kullanarak rahatça dropbox benzeri uygulamalar geliştirebilirsiniz. Hatta yanlış bilmiyorsam Dropbox, hala S3 kullanmakta. Buradaki tartışmadan anlayacağınız üzere buna çok şaşıranlar var.
  • S3 kullanarak, sistemlerinizin yedeklerini saklayabilirsiniz. Hatta isterseniz, sistem yedeklerini alıp S3 saklayan bir uygulama da geliştirebilirsiniz. (Aslında güzel bir açık kaynak kodlu proje olabilir bu.)
  • Sabit web içeriklerinizi, (resimler, ikonlar vs.) S3’de saklayabilirsiniz. Bir ara stackoverflow bile resimleri S3’den çekiyordu. Benzer şekilde sizde daha bir çok şey için S3’yi kullanabilirsiniz.

Ne kadar?

Öncelikle klişe cümleyi söyleyeyim, ne kadar kullanıyorsanız o kadar ödüyorsunuz. Fakat sorun şu ki ne kadar kullanacağımızı bilmiyoruz. Bilmiyorum sizde durum nasıl ama, ben Türkiye’de çalıştığım hiç bir dönemde, ne kadar veri kullanacağımı ölçmedim. Bu sebepten bu tip sistemler hep çok “pahalı” gelmişti bana. Ama durup sisteminizin gerçekten aylık ne kadar veri kullandığını, yedeklerin iki yıl süreyle saklanacağını düşünecek olursak ne kadar yere ihtiyacınız olduğunu falan ölçerseniz S3’nin ne kadar ucuz olduğunu göreceksiniz.

AWS’e ilk kayıt olduktan sonra bir sene boyunca 5GB’lık alanı ücretsiz olarak kullanabiliyorsunuz. Eğer bu süre içerisinde daha fazla veri saklarsanız ücret ödemeniz gerekiyor. Bundan sonrasında ise kullandığınız veri ve yaptığınız request başına para ödemeniz gerekiyor. Bir kaç örnek vereyim.

  • 150 GB’lık alanı, 10.000’lik taleplerle kullandığınızda aylık 4,59$, 100.000’lik taleplerle kullandığınızda aylık 4,87$
  • 1 TB’lık alanı, 100.000’lik taleplerle kullandığınızda aylık 31,09$, 1.000.000’lik taleplerle kullandığınızda aylık 35,95$

Gibi paralar ödüyorsunuz. Kendi ihtiyacınıza göre fiyatı hesaplamak istiyorsanız ya da güncel fiyatlara bakmak istiyorsanız bu aracı kullanabilirsiniz.

Terminoloji

Yazılım ile ilgili kısımlarına geçmeden önce, S3 ile ilgili bilmeniz gereken bir iki terminolojiden bahsedeceğim. Zaten en basit servislerden biri olduğu için çok fazla değinilmesi gereken bir konu da yok. S3’yi uzak sunucudaki dosya sisteminiz gibi düşünebilirsiniz. Verileriniz isterseniz klasör klasör tutarsınız, isterseniz sıkıştırıp tutarsınız, isterseniz kendi dosya formatınızı belirler istediğiniz şekilde tutarsınız.

  • bucket: Dosya sisteminizin ana dizini gibi düşünebilirsiniz. S3 üzerinde tutacağınız herşeyin bir bucket (kova) altında olması gerekiyor. Tek can sıkıcı yanı S3 genelinde, bucket isimleri unique olmak zorunda.
  • key: Dosya sistemi benzetmemizden devam edecek olursak, key dosya adınıza karşılık geliyor. Tek farkı ön ek (prefix) içerebiliyor. Bucket içerisindeki fullpath gibi de düşünebilirsiniz.
  • prefix: Aslında prefix diye bir şey tanımlamıyorsunuza. Prefix bucket’tan sonraki klasörler. Key, prefix/dosyaAdı şeklinde oluşuyor. Eğer S3 nesnelerinizi otomatik üretiyorsanız, belli bir prefix ile üretmek isteyebilirsiniz. Sonrasında bu prefix ile arama yapabiliyorsunuz.
  • metadata: Bucket içerisinde tuttuğunuz her nesnenin bir metadata bilgisi oluyor. S3 nesnesinin ne ya da nelerden oluştuğu bilgisi burada tutuluyor.

Bir örnek üzerinden anlatayım. Bir dosyanız var mesela, veritabanı yedeğiniz olsun, adı da mysql_backup.gzip diyelim. Bunu S3’de tutmak için, öncelikle bucket’a ihtiyacınız var. AWS Console üzerinden bucket’ınızı oluşturmanız gerekiyor. Bu bucket’a bhdrkn-backups diyelim. Başka sistemlerinizin başka yedeklerini de S3’de saklamak isteyebilirsiniz. Ondan dolayı bhdrkn-backups içerisine yeni bir klasör yaratalım ve buna da mysql diyelim. Şimdi ise yine Console’u kullanarak, dosyamızı upload edelim. Bu durumda değerlerimiz aşağıdaki gibi olacak:

  • bucket: bhdrkn-backups
  • key: mysql/mysql_backup.gzip
  • prefıx: mysql
  • metadata: Eğer yüklediğiniz dosyaya tıklayıp özellikler (properties)’i seçerseniz, metadata altında değerleri görebilirsiniz. GZIP türünde bir veri yüklediğimiz için Content-Type:application/x-gzip değerini göreceksiniz. Buraya kendimiz istediğimiz türde bilgiyi yükleyebiliriz. Bu özellikle kendi formatınızı yaratmak istediğinizde çok işinize yarayacak.

Umarım basitçe terminolojinin ne olduğunu anlatabilmişimdir. Bu bilgiler doğrudan bir işinize yaramayabilir ama Java kullanarak S3’e bağlandığımızda, AWS’in Java API’sini anlamanızda size kolaylık sağlayacaktır. Yavaş yavaş java uygulamamıza doğru ilerlemeden önce verinizi silmenizi öneririm. Birazdan Java uygulamasıyla aynı veriyi yaratacağız. Unutmayın 12 ay sonra eğer veri tutuyorsanız ücretlendirilmeye başlayacak.

Yetkilendirme

Yazılım ile ilgili kısımlara geçmeden önce diğer değinmek istediğim konu yetkilendirme. Hemen hemen hiç bir AWS servisini ana yetkiyle kullanmamanızı öneririm. Kullanacağınız her servis için ayrı kullanıcılar yaratıp yetkilendirmelerini ayrı ayrı yapın. Kısaca S3 için nasıl ayrı bir kullanıcı oluşturacağınızı ve yetkilendireceğinizi anlatacağım. Bu işlemler ek bir ücrete tabi değil ondan gönül rahatlıyla yapabilirsiniz.

  • AWS Console üzerinden IAM (Identity and Access Management) servisine gidin.
  • Sol taraftaki menuden Users’a tıklayın
  • Üst taraftaki mavi butona, Create New Users, tıklayın
  • Beğendiğiniz bir kullanıcı adı girin (s3_bhdrkn).
  • Generate Access Key For Each User seçeneği seçili kalsın, sonrasında Create’e tıklayın.
  • Burada isterseniz Show Credentials diyerek, isterseniz Download Credentials diyerek kullanıcı erişim bilgilerini kaydedin. Bu bilgileri java uygulamasını geliştirirken kullanacağız.
  • Sonrasında, Close’a tıklayın. Bu sizi kullanıcıların listelendiği sayfaya götürecek. Burada biraz beklerseniz, yeni yarattığınız kullanıcıları görebilirsiniz.
  • Kullanıcınıza (s3_bhdrkn) tıklayın. Açılan sayfada Permissions sekmesine gelin ve Attach Policy’e tıklayın.
  • Yeni açılan ekrandaki kutucuğa S3 yazıp filtreleyin. Gelen listeden AmazonS3FullAccess i seçin ve attach policy’e tıklayın.

S3 üzerinde full yetkiye sahip bir kullanıcı yarattık. Şimdi tüm bu bilgileri kullanarak basit bir uygulama yazalım.

S3 ve Java

Şimdi basit bir Java uygulaması geliştirelim. Uygulamamız Terminoloji kısmında yaptığımız işlemleri yazılımsal olarak yapacak. Her zaman ki gibi Maven projesi geliştireceğiz. Spring’di context’i dependency’di falan çok detaya girmeyeceğim. Basit bir konsol uygulaması geliştireceğiz. Bundan dolayı her hangi bir Maven projenizi kullanabilirsiniz.

Maven ve Bağımlılıklar

Tek bir bağımlılığa ihtiyacımız var. Aşağıdaki bağımlılığı eklememiz yeterli.

AWS Erişimi

Hangi AWS servisini kullanırsanız kullanın, AWS erişimi için gerekli AccessKey ve SecretKey bilgilerini sağlamanız gerekmektedir. Bunun için farklı yöntemler izleyebilirsiniz. Örneğin, daha önce AWS CLI kullandıysanız, $USER_HOME/.aws dizininden faydalanabilirsiniz. Biz basit ve taşınabilir olması için properties dosyasında okuyacağız. Bunun için src/main/resources altına aws.properties dosyasını yaratıp içerisini aşağıdaki gibi dolduruyorsunuza.

aws.properties

Daha sonrasında bu dosyayı okuyup client’ımızı yaratacağız.

Şimdi uygulamanızı çalıştırdığınızda bir sorun almamanız gerekiyor.

Temel Bucket İşlemleri

Yazının başında anlattığımız işlemleri tekrarlayacağız. Bunun için temel olarak bucket’lar üzerinden işlemler yapmamız gerekiyor. Aşağıdaki örnekte, nasıl bucket yaratacağınız, hesaba ilişkin bucket’ları nasıl listeleyeceğiniz, bucket’ın olup olmadığını nasıl kontrol edebileceğiniz ve bucket’ınızı nasıl silebileceğinize ilişkin örnekler bulunmakta.

Veri Aktarımı

Java kullanarak Bucket’ımızı istediğimiz gibi yönetebildiğimize göre, şimdi sırada bucket’ımıza veri gönderme işlemleri yapmalıyız.

Gördüğünüz gibi veri aktarımını her türlü iki formatta yapmamız mümkün. İster yazının başında bahsettiğimiz gibi gzip dosyası gönderin, isterseniz n tane JSON formatını birleştirin tek bir dosya gibi gönderin. Binary veri saklayabileceğiniz bir alanınız var artık, gerisi hayal gücünüze kalmış.

Verinin Okunması

Şimdi veriyi nasıl okuyacağımıza bakalım. Eğer KEY’inizi biliyorsanız sorununuz yok. Rahatlıkla okuyabilirsiniz.

Sorun key’i bilmediğinizde başlıyor. Şöyle düşünün Loglarınızı belli aralıklarla S3’e atıyorsunuz. Büyük ihtimal belli bir prefix kullanarak yapacaksınız bunu. En azından bu prefix’i kullanarak nesnelerinizi okuyabilmeniz lazım. Bunu şu şekilde yapabilirsiniz. Tabi prefix kullanmadan da yapabilirsiniz ama bunun ne kadar uygun olacağına bucket’ınızın büyüklüğüne göre sizin karar vermeniz gerekiyor.

Burada önemli olan nokta, listeleme sırasında gerçek nesnelerin değil sadece bilgilerinin dönmesidir. Yani siz bir listeleme yapmaya çalıştınız diye S3 size 1GB’lık veriyi göndermeye kalkmıyor. Buradan sadece KEY bilgisini öğreniyorsunuz.

Verilerin Silinmesi

Yazıya bir son vermeden önce yine Bucket’ımızı silelim. Yalnız Bucket’ı doğrudan silmeye kalkarsak hata verecektir. İçerisinde veri olan Bucket’ları doğrudan silemiyoruz. Bunun için önce verileri sonra bucket’ın silinmesi gerekiyor.

Son

S3 tabiki de sadece anlattığım şeylerle sınırlı değil. Bunlar haricinde, sizin için nesnelerinizin verisyonlarını tutabiliyor. İsterseniz yüklediğiniz nesnelere HTTP ile erişime izin verebiliyorsunuz. Nesnelerin Etag bilgisi ve md5 bilgisi de bulunuyor. Client’larınız bu bilgileri kullanarak cache’ing de yapabilir. İsterseniz static web sayfası da yayınlayabilirsiniz. Yani kullanım alanı bir hayli geniş. Ben bu yazı da sadece temel özelliklerine değinerek, sizleri bir nebze AWS dünyasına ısındırmaya çalıştım. Umarım başarabilmişimdir.

Tam bir projemiz

 

  • Emir

    Amazon’da çalışan birisine yakışır şekilde güzel bir yazı olmuş. EMR ve diğer servisler hakkında da yazılar bekliyoruz. Bu blog, AWS Java SDK konusunda Türkçe referans bir kaynak olabilir kanaatindeyim. Başarılar.

    • bhdrkn

      Sağol Emir. Böyle yorumlar almak çok motive ediyor beni. EMR ile ilgili bir yazı yazmayı bende çok istiyorum. Fakat aklıma güzel (SSCCE http://sscce.org/ ) bir örnek gelmiyor. Eğer bir önerin ( ve tercihen örnek veri setin) varsa seve seve bir yazı yazabilirim.

  • Bahadır hocam blogunuzu yeni keşfettim. S3 oluşturarak sunucu yedeklerini otomatik toplama düşüncem vardı. “Aslında güzel bir açık kaynak kodlu proje olabilir bu” demişsiniz. Proje oluşursa beta testlerine hemen katılabilirim 🙂 Oldukça faydalı olmuş. Teşekkürler.

    • bhdrkn

      Benim hala aklımın bir kenarında var ama önce bir aramak lazım. Belki hali hazıda vardır. Yine de olurda gerçekleyebilirsem, haber veririm mutlaka. Teşekkürler.

  • Merhabalar, oldukça yararlı bir yazı olmuş. Benim WordPress konusunda bir sorum olacaktı. 400 MB’lik bir disk kullanımı ve aylık 50 ila 100 GB veri transferi yapılan bir site için AWS S3 kullanımı sizce mantıklı olur mu? Ayrıca medya dosyalarını burada barındırdığımda site hızında gözle görülür bir artış olur mu? Ayrıca aylık ücretlendirme tahmini de yapmanız mümkün mü? Bu konuda baya bir Fransız’ım. (W3TC eklentisi ile kullanacağım.)

    Teşekkürler