Merhaba sevgili okuyucu, bugün bu bulog yazısında sizlerle birlikte bir binary dosyasını(ses, görüntü vs.) API invoke URL aracılığla AWS Lambda’ya gönderip oradaki belirli işlemlerle birlikte oluşturacağımız bir AWS S3 Bucket bölümüne aktaracağız. Burada kodlama olarak Python kodlama dilini kullanacağız. Gelin birlikte ilk başta bu servisler ne işe yarıyor? onlara baktıktan sonra yavaş yavaş işlemlere geçeceğiz. Peki biz bunu neden yapıyoruz? Diye soracak olursanız ya bir şirkettesiniz ve göreviniz var ya da eğlence için. Benim için eğlence amaçlı bu durum. Şimdiden iyi okumalar.
AWS API Nedir?
Kısaca Amazon Web Services(AWS) API servisi, geliştiricilere ve işletmelere AWS platformunda bulunan çeşitli hizmetlere programatik olarak erişim sağlar. Bu API’ler, bulut tabanlı altyapı kaynaklarını yönetmek, otomatize etmek ve ölçeklendirmek için kullanılır. Örnek olarak vermek gerekirse, bir uygulama sunucusunu oluşturmak, depolama kaynaklarını yönetmek, veritabanlarına erişmek veya yapay zeka servislerini kullanmak gibi çeşitli işlevleri programlama aracılığıyla gerçekleştirmek için kullanılabilirler. Biz burada AWS Lambda servisiyle iletişime geçmek için kullanacağız. Şimdi AWS Lambda servisi ne işe yarıyor ve nedir sorularına cevap arayalım.
AWS Lambda Nedir?
Kısaca AWS Lambda servisi, kullanıcıların kodlarını çalıştırmak için bir altyapı sağlayan bir serverless hesaplama hizmetidir. Bu hizmet sayesinde, kullanıcılar kodlarını yönetmek ve çalıştırmak için sunucu altyapısıyla ilgilenmek zorunda kalmazlar; bunun yerine, Lambda, gereksinim duydukları anda otomatik olarak ölçeklendirilmiş bir ortam sağlar. Kullanıcılar(bizler), Lambda’yı tetikleyen olayları belirleyerek( API servisi gibi), kodlarını bu olaylarla ilişkilendirebilir ve böylece belirli bir olay gerçekleştiğinde kodları otomatik olarak çalıştırabilirler. Bu geliştiricilere uygulamalarını daha hızlı bir şekilde dağıtmalarını maliyetlerini azaltmalarını ve altyapı yönetimiyle ilgilenmeden odaklarını iş mantığına daha çok yoğunlaştırmalarını sağlar. Biz bu blog yazısında API’dan gelen binary verisini Lambda’ya ulaştırdıktan sonra binary dosyasını normal bir dosyaya çevirerek AWS S3 Bucket’ine göndereceğiz. Şimdi son aşama olan AWS S3 servisine kısaca göz atalım.
AWS S3 Nedir?
Kısaca AWS S3(Simple Storage Service), kullanıcılara internet üzerinden büyük miktarda veri depolama imkanı sunan bir bulut depolama hizmetidir. S3, verileri yüksek dayanıklılıkta ve düşük maliyetle depolamak için kullanılır ve geniş bir uygulama yelpazesinde kullanılabilir. Kullanıcılar, dosyaları depolamak, yedeklemek, paylaşmak veya dağıtmak için S3’ü kullanabilirler. Biz burada ne için kullanacağız diye soracak olursanız, biz burada AWS Lambda’dan giden binary verisini depolamak için kullanacağız. Basit yani fazla korkmayın :D.
Binary Dosyasının AWS S3 Bucket Dosyasına Eklenmesi
AWS S3 Bucket Açma
Bu örnekte en basitten en zoruna doğru başlamak istiyorum. Öncelikle en basit olan S3 Bucket’ini açmayı göstermek istiyorum. Çünkü bu bölüm çok kolay . İleriki aşamalarda bunu Terraform ile yapacağız. Şimdilik görsellerle anlatmak istiyorum.
Burada “Create bucket” butonuna tıklayıp yeni bir Bucket açacağız. Burada önemli nokta tüm servislerin aynı Regionda bulunması gerekiyor. Lütfen dikkat edelim.
Burada eğer Costing kaygınız yoksa sadece isim yazın ve “Create bucket” butonuna tıklayın. Ben burada “deneme1-blog” bucket’ini oluşturacağım.
Bu kadar basit aslında kurmak sadece girip isim yazıyorsunuz. Diğer özellikler işlemlerinize göre, gizliliğinize göre değişecektir. Burada ekstra bir dosya oluşturarak bu dosyanın içine atacağım.
Burada “Create folder” butonuna tıklayıp yeni bir klasör ekleyeceğiz.
burada klasör ismini “deneme-klasor” olarak oluşturacağım.
Evet sevgili dostum buraya kadar geldiysen en basit olayı halletmişsin demektir. Şimdi birazcık işleri zorlaştıralım birlikte.
Gitlab Hesabında Project Oluşturma
Evet burada aslında apayrı bir duruma giriyoruz ancak neden girmeyelim? :D. Şimdi bu bölümde Gitlab Hesabında yeni bir project açacağız ve kodları (Local Python kodlarını ve AWS Lambda’da bulunan kodları) buraya ekleyeceğim
Burada “New project” butonuna tıklayarak projemizi açıyoruz.
Blank project bölümünü seçtikten sonra otomatik olarak yukarıdaki resim gelecek ve ben “blog-codes” ismini kullanarak sizlerle paylaşacağım.
Bu link’ten ulaşabilirsiniz. Şimdi AWS Lambda servisini basit bir şekilde kuralım.
AWS Lambda’da bir Function Oluşturma
Evet sevgili okuyucu burada aslında bir function oluşturup son bölüme geçeceğiz.
Burada “Create function” butonuna tıklayarak bir fonksiyon oluşturacağız.
Burada değiştireceğimiz şeyler 2 tane durum var. 1. olarak isim oluşturmamız gerekiyor. 2. olarak ise python programlama dilini seçmemiz gerekiyor. Ekran görüntüleri aşağıda yer alacaktır.
Burada oluşturduktan sonra Configuration bölümünde yer alan permission alanında gerekli olan role tıklayıp S3 Bucket bölümüne gerekli acces’i vermemiz gerekiyor. Onun da gerekli ekran görüntüleri aşağıda yer alacaktır.
Role name bölümünün altında yer alan linke tıklamamız gerekiyor.
Burada “Add permissions” bölümüne tıklayıp “Attach policies” bölümnde yeni bir izin vereceğiz.
Burada arama bölümüne S3FullAccess bölümünü alacağız. Örnek olacağı için sizin projenize göre belirli Bucket’e verebilirsiniz.
Burada yapacaklarımız bu kadar diyip en son kısım olan AWS API servisine geçiyoruz. Burada trick dediğimiz bölümü özellikle dikkat etmeniz gerekiyor. Çünkü bu hiçbir yerde yok. önemli durumlardan birisi ise binary verilerini bozulmadan aktarılması lazım.
AWS API Servisini Oluşturma ve Gerekli Configuration Ayarları
Aslında sevgili okuyucu buraya kadar herkes yapabiliyor. Önemli olan bu kısım diyebilirim. Burada trick olan kısım ayarlar bölümünden gerekli ayarı yapabilmek yoksa dosyanız/veriniz bozuk/hiç gelmemiş olayıyla karşılaşacaksınız. O zaman gelin birlikte ilk oluşumu yapalım.
Burada “Create API” butonuna tıklayıp “REST API” bölümünü seçeceğiz.
Burada yapacağımız şey “API name” bölümünü ekleyip isterseniz Description bölümünü yazıp “Create API” butonuna tıklayarak oluşturacağız.
Evet burada ilk başta “Create resource” bölümünü ekleyerek kendimize özel bir sub resource ardından o resource’in altında POST method’u oluşturacağız.
Burada sağ tarafta olan “Create method” butonuna tıklayıp POST methodu oluştururken Lambda’daki fonksiyonuna birleştireceğiz.
Burada Post dedikten sonra Lambda function bölümünde az önce oluşturduğumuz Lambda function’a bağlayacağız. Method Request settings bölümünde var olan bilgileri ekleyeceğiz.
Burada “URL query string parameters” ve “HTTP request headers” bölümü sabit kalacaktır. O yüzden göstermiyorum. “Request body” bölümünde eklememiz gereken model vardır. bu da şöyle olacaktır.
Son olarak bu şekilde yaptıktan sonra “Create method” butonuna tıklayarak oluşturacağız.
Şimdi en önemli kısım olan trick kısmına geldik. Sevgili okuyucu, burada sistem olarak şunu demekteyim. Buradaki ayarı yaparken “API settings” bölümüne geldikten sonra “Binary media types” bölümüne gelip yeni bir Media type ekleyeceğiz.
Buradaki mantık aslında resim kullanacağımız için “image/png” kullanarak sadece resimleri kabul etme demektir. Çünkü sıkıntı olan tarafı eğer application/octet-stream yaparsak yine de kabul etmeyecektir. Eğer video, ses veya sesle ilgili başka bir durumla karşılaşılırsa “*/*” eklenmesi gerekmektedir.
Buradan sonra son olarak Resources bölümüne gelip yeni bir stage oluşturmamız lazım. oradaki “Deploy API” butonuna tıklayıp new stage diyip oluşturacağız. Bunun nedeni bu sistemi yayınlamak ve dış ortama aktarmak için gereklidir. Ben burada sadece ismi belirledikten sonra yayınlayacağım.
artık her şey tamam oluyor demektir. Şimdi işin en basit tarafı kod kısımlarıdır. Şimdi burada isterseniz kendiniz yazın isterseniz gerekli AI sitelerini kullanın ancak ben burada örnek olarak iki kodu da vereceğim ve blogu tamamlayacağız.
AWS Lambda Kodu
Ben burada kodu hem ekran görüntüsü olarak koyacağım hem de buradaki link’ten otomatik olarak Github hesabımdaki önceden birlikte oluşturduğumuz projenin içindeki “Lambda-code” klasörünün içinde bulabileceksiniz merak etmeyin. İşte gerekli çıktılar aşağıdadır.
Burada “data_name” bölümü subbucket olduğu için eklemek zorunda kaldım. Eğer yoksa direkt yazabilirsiniz. Örnek Lambda kodu bu şekildedir. Şimdi Local bilgisayarımızdaki koda geçiyoruz.
Local Bilgisayardaki Python Kodu
Evet son adım olarak nereden göndereceğimize karar vermemiz gerekiyor. Bunun için ben Python programlama dilini kullandım. Siz istediğiniz programlama dilini kullanabilirsiniz. Zaten bu örnektir önemli olan durum burada gönderme biçimidir. Ben kodda resmi ilk başta binary’e çevirdim. (Eğer sizin binary dosyanız varsa kodun belli kısmını silebilirsiniz.) Ardından oluşturduğumuz API Invoke URL ile bunu S3 bucket’ine Lambda aracılığıyla aktaracağız. Ben burada kodu hem ekran görüntüsü olarak koyacağım hem de buradaki link’ten otomatik olarak Github hesabımdaki önceden birlikte oluşturduğumuz projenin içindeki “Local-python-code” klasörünün içinde bulabileceksiniz merak etmeyin. İşte gerekli çıktılar aşağıdadır.
Uygulama
Evet Sevgili okuyucu, ben bu blog yazısında gerekli olan tüm configuration adımlarını tamamladım. Buna göre kodları yerleştirip veya benden aldığınız kodların bir kısmını aldıktan sonra gönül rahatlığıyla sistemini çalıştırabilirsiniz. Biz burada uygulama için bir örnek resim seçtik. Örnek resmi ilk başta binary veriyle (“ascii”) modeliyle decode işlemi yaptık ardından headers bölümüne “application/octet-stream” yerleştirmemizin ardından invoke url ile birlikte gönderdik. AWS API bu veriyi düzgün karşıladıktan sonra AWS Lambda’ya gönderdi ve orada da herhangi veri fazlası veya eksiği yaşanmasın diye metadata verisini sıfırladık. ardından resmi doğal haliyle AWS S3 bucket’ine yerleştirdik. Gelin birlikte bunu ekran görüntüleriyle gösterelim ve blogu kapatalım.
Burada eğer sizde “base64” kütüphanesi yüklü değilse yüklemeniz gerekiyor. Ben şimdi “python .\local-code.py” yazarak çalıştıracağım.
Ben özellikle resmin boyutunu göstermesini istedim herhangi bir hata çıkmaması içindir. Bundan sonraki adım, AWS CloudWatch servisine gidip Log gruplarında oluşturduğumuz Lambda’daki Loglara bakacağız. Düzgün ulaştı mı diye.
Burada gördüğünüz üzere oluşturduğum API’in Log bölümleri de vardır. Bunun sebebi, her zaman veri Lambda’ya ulaşmayabilir. Bunun için API bölümünde Settings kısmında açmanız gerekiyor.
Süper! Şimdi her şey hazır ve AWS S3 bucket’ine gitmemizin vakti geldi.
Buradan indire tıklayarak verimizi alacağız.
Sonuç
Evet sevgili okuyucu, bugün bir resmi bozmadan binary veriye çevirerek Python programlama dili aracılığıyla AWS API servisine gönderdik. AWS API’da gerekli ayarları ve işlemleri yapıp hazır haline getirmemiz gerekiyordu. Getirdikten sonra veriyi karşıladık ve hiçbir şekilde bozmadan AWS Lambda’ya gönderdik. AWS Lambda S3 bucket’ine göndermeden önce permission’ları yaptık. Ardından gerekli kodlar aracılığıyla gönderdik. En sonunda ana resimle karşılaştırdık. Ben başta çok hata aldım ancak size en temiz haliyle verdim. Burada eğer “internal server error” hatası alırsanız tekrardan deneyin ya da API kısmına girerek “deploy API” yaparak yenileyin, çalışacaktır. Youtube kanalıma videoyu daha yüklemedim ancak en yakında yükleyip buraya linki atacağım. Sağlıcakla kalın.
Ali Kılıçarslan.
İlk Yorumu Siz Yapın