GO & AWS Lambda ile Image Resizer

Özgür Kara
2 min readMar 29, 2019

--

Uzun bir aradan sonra tekrar bir şeyler yazıp paylaşmak istedim. Son 2 aydır Yemeksepeti Platform ekibi olarak tüm ağırlığımızı yeni market ürünümüz “BanaBi” projesine harcıyoruz. Projeyi Nisan ayının ilk haftasında kullanıcılara açmayı planlanıyoruz. Bu süreçle alakalı başka bir yazıda projede neler kullandığımızı ve nasıl geliştirdiğimizi anlattım.

Dönelim asıl konumuza;

Birçok büyük projede olduğu gibi bu projede de resimlerin boyutlandırmaları için bir yapıya ihtiyacımız vardı. Yani amacımız kullanıcıya 100x80 boyutunda bir resim gösterilecek iken resmin daha büyük ebattaki orjinalini göndermemek.

Böyle bir yapı kurulurken amaçlanan;

1- Uygulama performansının arttırılması

2- Kullanıcının internet paketinin gereksiz tüketilmesinin engellenmesi

3- Fazladan oluşacak network trafiğinin engellenmesi

Resimlerin boyutlandırılması için kullanılan yöntemlerden bazıları;

1– ImageResizing gibi bir uygulama ile resim boyutlarının on the fly olarak generate edilmesi. (güçlü bir donanım gerekiyor)

2- Resimler upload edilirken belirlenmiş boyutlarla beraber generate edilip yüklenmesi.

3- Cloudinary gibi third party bir servisin kullanılması. (pahalı bir çözüm)

Bu seçenekleri düşünürken aklıma katılmış olduğum AWS eğitiminde bahsedilen, S3 üzerindeki işlemler için event fırlatılabilme özelliği geldi. Bu özellik ile resmin orjinalini S3 e gönderdiğimde bir event ile bir api nin tetiklenip resmin diğer boyutlarının generate edilmesini sağlayabilirdim. Bunla ilgili araştırmalar yaparken S3 Events olarak AWS Lambda yı da desteklediğini farkettim. Serverless uygulama geliştirme şansımı da burda yakalamış oldum. Bu uygulamayı da bir süredir incelemekte olduğum GO dili ile geliştirmeye karar verdim.

Yapılacak geliştirme kısaca şu adımlardan oluşacaktı;

1- Resim S3 storage a yüklenecek

2- AWS Lambda trigger edilecek

3- Lambda GO dilinde yazılan uygulama ile resmin istenilen boyutları generate edilip aynı S3 teki farklı bir folder a yüklenecek.

Sonuç olarak;

2 gün gibi kısa bir zamanda bu geliştirmeyi yapıp yayına aldık.

Bu çözümle birlikte;

1- AWS Lambda deneyimi kazandık

2- GO ile bir başlangıç yapmış olduk

3- Resim problemini maliyeti düşük, performansı yüksek bir yöntem ile çözmüş olduk.

GO dili hakkında;

1- Büyük harfle başlayan fonksiyonların Public, küçük harfle başlayanların Private olarak davranması çok hoşuma gitti.

2- Kullanmadığın bir değişken varsa hata vermesi performans için gayet güzel kural.

3- Klasörün namespace gibi kullanılması ilk başta tuhaf geldi ama kolay adapte oluyorsun.

4- En fazla hoşuma giden tarafı access modifiers olmaması ve variable type kullanımını azaltması ( func addUser(name,surname,address string)) gibi özellikler sayesinde kodun daha okunabilir hale gelmesi oldu. Kısaca bu dili sevdim ve GO ile daha fazla proje geliştirmek niyetindeyim.

AWS Lambda hakkında;

1- Kurulumu ve kullanımı oldukça basit.

2- Birçok dili desteklemesi büyük avantaj.

3- Schedule olarak çalışacak uygulamalar için çok iyi bir çözüm.

4- Serverless yaklaşımı beğendim ve bazı API leri bu yapıya aktarmak niyetindeyim.

Kodları incelemek isteyenler için..

https://github.com/ozgurkara/imagenation

--

--