Herkese merhabalar,
Bu makalede göz atacağımız teknoloji AWS’in bizlere kazandırdığı, projelerimizin dosyalarını saklayabileceğimiz, dosya versiyonlanmasına imkan tanıyan, verileri güvenle tutabileceğimiz bir dosya alanı olan Simple Storage Service…
Simple Storage Service Nedir?
Bir projedeki temel yapıtaşlarımızın başında proje verilerimizin depolanması gelmekte. Verinin nasıl saklanacağı, kimlerin bu verilere nasıl erişebileceği, güvenli olarak saklanması için güvenlik kriterleri, dosyanın şifrelenerek saklanması, yedeklenmesi, geçmişe yönelik versiyonması gibi birçok kriter ile birlikte projelerimize entegrasyon imkanı sağlayan S3, bizi bu sistemleri kurarken OS katmanına bağlı sorunlardan da korumakta.
Basitçe düşünürsek, S3 size bir uzak dosya sunucusu sağlamakta. Sizin ilgilenmeniz gereken konu, bu dosya sunucusunu projenize entegre etmek ve geriye kalan tüm işler için AWS’i sorumlu tutmak.
Güvenlik
Projeniz için bir S3 oluşturduğumuzda, bu S3 bucket’ı onu oluşturan kullanıcı ve bu kullanıcının (veya root kullanıcısının) izin verdiği IAM Policy yetkileri ile belirlenen kullanıcılar için erişilebilir kılıyoruz. Ayrıca istersek her bir dosyaya ya da bucket’a ayrı ayrı izinler tanımlayarak erişim yönetimini de sağlayabiliyoruz. Yine parametrik olarak hangi kullanıcıların ne sıklıkla dosyalara erişebileceğinize karar verebiliyoruz. Otomatik şifrelemesi yapabiliyor olması sayesinde, verilerimizin güvenliğinden emin olabiliyoruz. Ayrıca s3 bucket’a kimlerin ne zaman ulaştığı, hangi dosyaların kimler tarafından yüklendiği/değiştirildiği gibi monitoring işlemleri de S3 ile birlikte gelen özelliklerden birisi.
Ölçeklenebilirlik
Eğer söz konusu verilerin depolanması ise, akla ilk gelen sorunlardan birisi de “günün birinde ayırdığım depolama alanı yetersiz kalırsa bu alanı nasıl sistemi durdurmadan genişletebilirim?”. S3 bu konuda neredeyse limitsiz bir alan sağlayarak, “pay as you go” prensibiyle, herhangi bir limit olmadan, verilerin depolanmasına imkan tanımakta.
Diyelim ki bir projeniz var ve bir anda sosyal medyada patladı, yüzlerce insan uygulamaya giriş yaparak kayıt olmaya başladı ve inanılmaz bir dosya yükü geldi. S3 bu yükü gayet rahat bir şekilde yöneterek, kontrollü bir şekilde ilerlememizi sağlıyor.
Dayanıklılık
Veri kaybı yaşamak heralde her şirketin / projenin en son isteyeceği şeylerden. S3’nin varsayılan olarak sunulan seviyesinde dayanıklılık % 99.9999999 . Bu değeri hayal edebilmek için şöyle bir örnek verirsem sanırım gözümüzde canlandırmak daha kolay olacaktır;
Eğer S3’te yüz milyar nesne depolarsak en fazla 1 dosya kaybederiz.
Uygun Fiyatlandırma Politikası
Bu tarz özellikler saymaya başlandığında bir teknolojide akla ilk gelen “herşey iyi güzel de, bu kadar özellik için ne kadar fazla ödemem gerekecek acaba?” düşüncesi. Ancak S3 budget içerisinde verileri hangi sıklıkla çağıracağınız, bu verinin nasıl saklanacağı, nasıl yedekleneceği ve ne şekilde korunacağına göre farklı fiyatlara sahip bir politikası mevcut ve her biri alternatiflerine oranla ciddi fiyat avantajına sahip. Fiyatlandırma politikası (Ekim 2022 itibariyle) $0.022 / GB ve~$0.0125 / GB arasında değişken fiyatlara sahip. Detaylara indiğimizde görebileceğimiz “Glacier” türünde ise fiyat daha daha uygun hale gelip ~$0.004 / GB a kadar düşmekte.
Kullanım Kolaylığı
Veri depolamak dendiğinde hepimizin aklına sunucu odaları, bu odalardaki klimalar ve SSD’ler ile dolu soğuk bir ortam gelebilir, ancak S3 ile yüzlerce terabaytlık verinizi yönetmek / kullanmak için bunların hiçbirisi ile uğraşmanıza gerek yok. 3 şekilde verinizi yönetmek mümkün;
- GUI (Graphical User Interface)
AWS Management Console, web uygulamaları ve her bir görevin tek bir tıklamayla veya bir dokunuşla yürütülebildiği mobil uygulamalar ile kontrol edebilirsiniz. - CLI (Command Line Interface):
AWS, komutları doğrudan çalıştırarak görevlerimizi yürütmek için komut satırı program paketini sağlar. - API (Application Program Interface):
AWS, firmaların platformu kullanımdaki diğer teknolojilerle hızlı bir şekilde entegre etmesine olanak tanıyan API’ler sağlar.
Özetleyecek olursak;
- Tamamen yönetilen bir obje tabanlı yapı
- En yaygın veri deplomal yöntemlerinden birisi
- Birçok senaryo ile başedebilecek bir altyapı
- Diğer birçok AWS hizmetiyle entegre
- Highly Available ve Dayanıklı
- Uygun maliyetli
- Kolay ölçeklenebilir ve erişilebilir
- (neredeyse) Sınırsız depolama alanı
- Son derece ölçeklenebilir
- En küçük 0 byte ve en yüksek 5 terabayta kadar dosya büyüklüğü desteği
- Dosyanın farklı AZ lerde depolanmasına oluşturulma anına karar verilebilmesine imkan tanıyan bir yapı
- Dosyanın diğer zone’lara kolayca kopyalanmasına ve/veya çoğaltılmasına imkan tanıması
- Her türlü veri uzantısının barındırılabilmesi (video, muzik, ses, text ve daha birçoğu)
- 99.99999999999% dayanıklılık
“Neden AWS S3?” sorusuna dair artık cevabımız olduğuna göre, Django ile S3’i nasıl kullanabileceğimize artık başlayabiliriz.
Amazon S3 Ortamının Kurulumu
AWS’ye giriş yapıp, S3’yi açıyoruz;


Birçok projenin standardında S3 dışarıdan ulaşılmayacak şekilde konumlandırıldığından, dışarıdan erişime kapalıdır. Örneğimizde biz direkt olarak erişeceğimiz için dışarıya erişimi aktif ediyoruz;

Eğer dosyalarımızın versiyonlanmasını istiyorsak (örnek kapsamında değil, ancak projenizde ihtiyaç duyarsanız) ya da verimizin şifrelenmesini istiyorsak, burada seçenekler kısmından aktif etmemiz gerekiyor, örneğimiz dışında olsa da ayarları burada görebiliyoruz, bu ayarları sonrasında da değiştirmek mümkün, ancak sonradan eklendiğinde birkaç işlem daha yapmak gerekeceğinden, mümkünse s3 bucket oluşturulurken bu kararın verilmiş olması gerekiyor;

S3 Bucket’ımızı oluşturalım;

IAM Erişim Ayarlarının Yapılandırılması
Şimdiyse oluşturduğumuz s3 Bucket’a Django üzerinden erişebilmek için kullanıcı ayarlarını yapmaya başlayalım. IAM yapısı temelde 2 yapıtaşından oluşmakta. Uygulamamız için oluşturacağımız bir kullanıcı ve bu kullanıcının sahip olacağı yetkileri belirlediğimiz yetki grupları ve bu grubun sahip olacağı yetkileri tanımlıyoruz. Önce tanımlamak istediğimiz yetkileri ve bu yetkilere sahip olacak grubu tanımlayalım;



Burada örneği basit tutmak amacıyla tüm s3 bucket’lara erişim veren varsayılan s3 erişim policy yapısını ekleyeceğiz, ancak limitlendirmek istiyorsanız, “create policy” diyerek ARN bilgisi üzerinden limitlendirme yapmakta pek tabii mümkün;

Örnek olması açısından özelleştirilmiş şekilde erişim için şöyle bir grup oluşturmak mümkün, bu policy sayesinde, sadece belirlediğiniz s3 bucket üzerinde erişim yetkisi vermiş oluyoruz;

Oluşturduğumuz yetki grubumuz ve ve policy bilgisini atadığımıza göre, kullanıcımızı oluşturmaya başlayabiliriz;
Yetkili Programatik Kullanıcı Oluşturma
Kullanıcı grubumuzu oluşturduk, yetkilerini atadık, şimdi Django’nun erişmek için kullanabileceği bir k.adı ve parola oluşturup, S3 Bucket ile haberleşmesini sağlayacağız, IAM sayfasına dönüyoruz, kullanıcı sekmesinden yeni kullanıcı oluşturuyoruz;

burada dikkat etmemiz gereken, kullanıcımızı oluştururken “Programmatic access”i seçmemiz, yani AWS’ye bu kullanıcı ile uygulamam AWS ile haberleşecek, dolayısıyla bir Access Key ve secret gerekli demiş oluyoruz. Sonraki adımda, bir önceki bölümde oluşturduğumuz custom yetkilendirmeyi (ya da varsayılan s3FullAccess) yetkisini kullanıcımıza atıyoruz;

Son adımda kullanıcımızın yetkilerini kontrol ediyoruz;

Kullanıcımızı oluşturduktan sonra, çıkan sayfadaki bilgileri bir köşeye not ediyoruz (uygulamamız içerisinde kullanacağız):

Django Projesini Oluşturma
AWS tarafında herşey hazır olduğunda göre, Django uygulamamızı tasarlamaya başlayabiliriz. Standart kurulum adımlarını geçiyorum, eğer o adımlarda eksiğiniz var ise buradan bakabilirsiniz, bizim için kritik olan projemizin s3 entegrasyonunu yapmak, ihtiyacımız olan “boto3” ve “django-storages” paketlerini kurmak;
pip install boto3 django-storages
kurulum tamamlandıktan sonra Django’ya kullanmak istediğimiz Storager’ı gösteriyoruz ve konfigürasyon bilgilerimi ekliyoruz:
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
...
'django.contrib.staticfiles',
'aws_sample.apps.AwsSampleConfig', # uygulamamizin ayarlari
'storages', # AWS konfigurasyonları için varsayılan app
]
AWS_ACCESS_KEY_ID = '#######'
AWS_SECRET_ACCESS_KEY = '######'
AWS_STORAGE_BUCKET_NAME = 'django-sample-storage'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_STATIC_LOCATION = 'static'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION)
Eğer herşey yolundaysa, collectstatic komutunu verdiğimizde dosyalarımız s3 Bucket’a “static” altında yüklenmiş olmalı;

Hadi test edelim, http://127.0.0.1:8000/admin/ sayfasına gittiğimizde, eğer dosyalarımız doğru şekilde s3 bucket’a aktarılmışsa CSS dizaynının geldiğini görebiliriz. Sayfa kaynağını görüntüleyerek, bu dosyaların s3 tarafından servis edildiğini görebiliriz;

Projenin kaynak koduna şuradan ulaşabilirsiniz.
Kaynaklar;
https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html
https://www.educative.io/courses/detailed-workings-aws-s3/qZ4ApmolOr3
https://www.blazeclan.com/blog/5-key-benefits-of-amazon-s3/
https://www.quora.com/What-are-the-benefits-of-using-Amazon-S3
https://testdriven.io/blog/storing-django-static-and-media-files-on-amazon-s3/
https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html
https://medium.com/analytics-vidhya/file-uploads-with-amazon-s3-in-a-django-project-54fb989e992d
Bir sonraki yazımda görüşmek üzere 🙂