AWS Lambda ile Hizmet Odaklı Mimari: Adım Adım Eğitim

Yayınlanan: 2022-03-11

Web uygulamaları oluştururken, bunları taahhüt ettiğinizde gelecekte uygulamanıza yardımcı olabilecek veya uygulamanızı engelleyebilecek birçok seçenek vardır. Dil, çerçeve, barındırma ve veritabanı gibi seçenekler çok önemlidir.

Böyle bir seçim, Hizmet Odaklı Mimari (SOA) kullanarak hizmet tabanlı bir uygulama mı yoksa geleneksel, monolitik bir uygulama mı oluşturulacağıdır. Bu, girişimleri, ölçek büyütmeleri ve kurumsal şirketleri benzer şekilde etkileyen yaygın bir mimari karardır.

Hizmet Odaklı Mimari, Google, Facebook, Twitter, Instagram ve Uber gibi çok sayıda tanınmış tek boynuzlu at ve en iyi teknoloji şirketi tarafından kullanılmaktadır. Görünüşe göre, bu mimari model büyük şirketler için çalışıyor, peki sizin için işe yarayabilir mi?

AWS Lambda ile Hizmet Odaklı Mimari: Adım Adım Eğitim

AWS Lambda ile Hizmet Odaklı Mimari: Adım Adım Eğitim
Cıvıldamak

Bu makalede, Hizmet Odaklı mimari konusunu ve Python ile birlikte AWS Lambda'nın ölçeklenebilir, uygun maliyetli hizmetler oluşturmak için nasıl kullanılabileceğini tanıtacağız. Bu fikirleri göstermek için Python, AWS Lambda, Amazon S3 ve diğer birkaç ilgili araç ve hizmeti kullanarak basit bir görüntü yükleme ve yeniden boyutlandırma hizmeti oluşturacağız.

Hizmet Odaklı Mimari Nedir?

Hizmet Odaklı Mimari (SOA) yeni değil, kökleri birkaç on yıl öncesine dayanıyor. Son yıllarda bir model olarak popülaritesi, web'e yönelik uygulamalar için birçok fayda sağlaması nedeniyle artmaktadır.

SOA, özünde, büyük bir uygulamanın birçok iletişim halindeki daha küçük uygulamaya soyutlanmasıdır. Bu, ayrıştırma, endişelerin ayrılması ve tek sorumluluk mimarisi gibi en iyi yazılım mühendisliği uygulamalarını takip eder.

SOA uygulamaları, ayrıntı düzeyi açısından farklılık gösterir: geniş işlevsellik alanlarını kapsayan çok az sayıda hizmetten, "mikro hizmet" mimarisi olarak adlandırılan onlarca veya yüzlerce küçük uygulamaya kadar. Ayrıntı düzeyi ne olursa olsun, SOA uygulayıcıları arasında genel olarak kabul edilen şey, bunun hiçbir şekilde ücretsiz bir öğle yemeği olmadığıdır. Yazılım mühendisliğindeki birçok iyi uygulama gibi ekstra planlama, geliştirme ve test etme gerektiren bir yatırımdır.

AWS Lambda nedir?

AWS Lambda, Amazon Web Services platformu tarafından sunulan bir hizmettir. AWS Lambda, Amazon tarafından yönetilen isteğe bağlı bir kapsayıcıda çalıştırılacak kodu yüklemenize olanak tanır. AWS Lambda, kodu çalıştırmak için sunucuların sağlanmasını ve yönetilmesini yönetecektir; bu nedenle, kullanıcıdan tek gereken, çalıştırılacak paketlenmiş bir kod kümesi ve sunucunun çalıştığı bağlamı tanımlamak için birkaç yapılandırma seçeneğidir. Bu yönetilen uygulamalara Lambda işlevleri denir.

AWS Lambda'nın iki ana çalışma modu vardır:

Eşzamansız/Olay güdümlü:

Lambda işlevleri, zaman uyumsuz modda bir olaya yanıt olarak çalıştırılabilir. S3, SNS vb. gibi herhangi bir olay kaynağı engellenmez ve Lambda işlevleri, bazı olaylar zinciri için bir işleme hattı oluşturmak gibi birçok yönden bundan yararlanabilir. Birçok bilgi kaynağı vardır ve kaynağa bağlı olarak olaylar, olay kaynağından bir Lambda işlevine gönderilir veya olaylar için AWS Lambda tarafından yoklanır.

Senkron/Talep->Yanıt:

Bir yanıtın eşzamanlı olarak döndürülmesini gerektiren uygulamalar için Lambda, eşzamanlı modda çalıştırılabilir. Genellikle bu, AWS Lambda'dan son kullanıcıya HTTP yanıtları döndürmek için API Gateway adlı bir hizmetle birlikte kullanılır, ancak Lambda işlevleri, AWS Lambda'ya doğrudan çağrı yoluyla eşzamanlı olarak da çağrılabilir.

AWS Lambda işlevleri, işleyicinin çalışması için gereken tüm bağımlılıklara ek olarak işleyici kodunu içeren bir zip dosyası olarak yüklenir. Yüklendikten sonra, AWS Lambda gerektiğinde bu kodu yürütür ve tüketici tarafından herhangi bir ek müdahale gerekmeden sunucu sayısını gerektiğinde sıfırdan binlere ölçeklendirir.

SOA'nın Evrimi Olarak Lambda İşlevleri

Temel SOA, bu makalenin önceki bölümlerinde açıklanan şekillerde bir uygulamadan yararlanmak için kod tabanınızı küçük uygulamalar halinde yapılandırmanın bir yoludur. Bundan yola çıkarak, bu uygulamalar arasındaki iletişim yöntemi ön plana çıkmaktadır. Olaya dayalı SOA (diğer adıyla SOA 2.0), yalnızca SOA 1.0'ın geleneksel doğrudan hizmetten hizmete iletişimine değil, aynı zamanda değişimi iletmek için olayların mimari boyunca yayılmasına da izin verir.

Olay güdümlü mimari, doğal olarak gevşek bağlantı ve birleştirilebilirliği destekleyen bir kalıptır. Olaylar oluşturarak ve bunlara tepki vererek, hizmetler mevcut bir olaya yeni işlevsellik eklemek için geçici olarak eklenebilir ve daha zengin işlevsellik sağlamak için birkaç olay oluşturulabilir.

AWS Lambda, SOA 2.0 uygulamalarını kolayca oluşturmak için bir platform olarak kullanılabilir. Lambda işlevini tetiklemenin birçok yolu vardır; Amazon SNS ile geleneksel mesaj kuyruğu yaklaşımından Amazon S3'e yüklenen bir dosya veya Amazon SES ile gönderilen bir e-posta tarafından oluşturulan olaylara kadar.

Basit Bir Resim Yükleme Hizmeti Uygulamak

AWS yığınını kullanarak görüntüleri yüklemek ve almak için basit bir uygulama oluşturacağız. Bu örnek proje iki lambda işlevi içerecektir: biri basit web önyüzümüze hizmet etmek için kullanılacak istek->yanıt modunda çalışan ve diğeri yüklenen görüntüleri algılayıp yeniden boyutlandıracak.

İlk lambda işlevi, yüklenen görüntüleri barındıracak olan S3 klasöründe tetiklenen bir dosya yükleme olayına yanıt olarak eşzamansız olarak çalışacaktır. Sağlanan görüntüyü alacak ve 400x400 görüntüye sığacak şekilde yeniden boyutlandıracaktır.

Diğer lambda işlevi, HTML sayfasına hizmet edecek ve hem bir kullanıcının diğer Lambda işlevimiz tarafından yeniden boyutlandırılan resimleri görüntülemesi için işlevsellik hem de bir resim yüklemek için bir arayüz sağlayacaktır.

İlk AWS Yapılandırması

Başlamadan önce, IAM ve S3 gibi bazı gerekli AWS hizmetlerini yapılandırmamız gerekecek. Bunlar, web tabanlı AWS konsolu kullanılarak yapılandırılacaktır. Ancak yapılandırmanın çoğu, daha sonra kullanacağımız AWS komut satırı yardımcı programı kullanılarak da gerçekleştirilebilir.

S3 Kovaları Oluşturma

S3 (veya Basit Depolama Hizmeti), herhangi bir verinin güvenilir ve uygun maliyetli depolanmasını sağlayan bir Amazon nesne deposu hizmetidir. Yüklenecek görüntülerin yanı sıra işlediğimiz görüntülerin yeniden boyutlandırılmış sürümlerini depolamak için S3 kullanacağız.

S3 hizmeti, AWS konsolundaki "Depolama ve İçerik Teslimi" alt bölümünün altındaki "Hizmetler" açılır menüsünde bulunabilir. Bir kova oluştururken, bir bölge seçmenizin yanı sıra hem kova adını girmeniz istenecektir. Kullanıcılarınıza yakın bir bölge seçmek, S3'ün gecikme ve maliyetin yanı sıra bazı düzenleyici faktörleri optimize etmesine olanak tanır. Bu örnek için “ABD Standardı” bölgesini seçeceğiz. Aynı bölge daha sonra AWS Lambda işlevlerini barındırmak için kullanılacaktır.

S3 grup adlarının benzersiz olması gerektiğini belirtmekte fayda var, bu nedenle seçilen ad alınırsa yeni, benzersiz bir ad seçmeniz gerekecektir.

Bu örnek proje için, "test-upload" ve "test-resize" isimli iki depolama paketi oluşturacağız. "Test-upload" kovası, görüntüleri yüklemek ve yüklenen görüntüyü işlenmeden ve yeniden boyutlandırılmadan önce depolamak için kullanılacaktır. Yeniden boyutlandırıldığında, resim "test için yeniden boyutlandırılmış" kovaya kaydedilir ve yüklenen ham resim kaldırılır.

S3 Yükleme İzinleri

Varsayılan olarak, S3 İzinleri kısıtlayıcıdır ve harici kullanıcıların ve hatta yönetici olmayan kullanıcıların paket üzerindeki herhangi bir izni veya nesneyi okumasına, yazmasına, güncellemesine veya silmesine izin vermez. Bunu değiştirmek için, AWS paket izinlerini yönetme haklarına sahip bir kullanıcı olarak oturum açmamız gerekecek.

AWS konsolunda olduğumuzu varsayarsak, kepçeyi isme göre seçip ekranın sağ üst kısmındaki “Özellikler” butonuna tıklayarak ve daraltılmış “İzinler” bölümünü açarak yükleme kovamızın izinlerini görebiliriz.

Anonim kullanıcıların bu pakete yükleme yapmasına izin vermek için, yüklemeye izin veren belirli izne izin vermek için paket politikasını düzenlememiz gerekecek. Bu, JSON tabanlı bir yapılandırma politikası aracılığıyla gerçekleştirilir. Bu tür JSON ilkeleri, IAM hizmetiyle bağlantılı olarak AWS'de yaygın olarak kullanılır. "Paket Politikasını Düzenle" düğmesine tıkladıktan sonra, aşağıdaki metni yapıştırın ve herkese açık resim yüklemelerine izin vermek için "Kaydet"i tıklayın:

 { "Version": "2008-10-17", "Id": "Policy1346097257207", "Statement": [ { "Sid": "Allow anonymous upload to /", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::test-upload/*" } ] }

Bunu yaptıktan sonra, kovaya bir resim yüklemeye çalışarak kova politikasının doğru olduğunu doğrulayabiliriz. Aşağıdaki cURL komutu işinizi görecektir:

 curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F '[email protected]'

200 aralıklı bir yanıt döndürülürse, yükleme paketi yapılandırmasının başarıyla uygulandığını bileceğiz. S3 kovalarımız artık (çoğunlukla) yapılandırılmalıdır. Resim yükleme olaylarımızı yeniden boyutlandırma işlevimizin çağrısına bağlamak için daha sonra konsoldaki bu hizmete döneceğiz.

Lambda için IAM İzinleri

Lambda rollerinin tümü, bu durumda IAM hizmeti tarafından tanımlanan bir "rol" olan bir izin bağlamında çalışır. Bu rol, Lambda işlevinin çağrılması sırasında sahip olduğu tüm izinleri tanımlar. Bu örnek projenin amaçları doğrultusunda, her iki Lambda işlevi arasında kullanılacak genel bir rol oluşturacağız. Ancak, bir üretim senaryosunda, herhangi bir güvenlik istismarının yalnızca tanımlanan izin bağlamında izole edilmesini sağlamak için izin tanımlarında daha ince ayrıntı düzeyi önerilir.

IAM hizmeti, "Hizmetler" açılır menüsünün "Güvenlik ve Kimlik" alt bölümünde bulunabilir. IAM hizmeti, AWS hizmetleri arasında erişimi yönetmek için çok güçlü bir araçtır ve benzer araçlara aşina değilseniz, sağlanan arabirim ilk başta biraz fazla bunaltıcı olabilir.

IAM kontrol paneli sayfasında bir kez, sayfanın sol tarafında "Roller" alt bölümü bulunabilir. Buradan, rolün izinlerini tanımlamak için çok adımlı bir sihirbazı getirmek için “Yeni Rol Oluştur” düğmesini kullanabiliriz. Jenerik iznimizin adı olarak “lambda_role” kullanalım. İsim tanımlama sayfasından devam ettikten sonra size bir rol tipi seçme seçeneği sunulacaktır. Yalnızca S3 erişimine ihtiyacımız olduğundan, “AWS Hizmet Rolleri”ne tıklayın ve seçim kutusunda “AWS Lambda”yı seçin. Size bu role eklenebilecek bir politika sayfası sunulacaktır. “AmazonS3FullAccess” politikasını seçin ve oluşturulacak rolü onaylamak için bir sonraki adıma geçin.

Oluşturulan rolün adını ve ARN'sini (Amazon Kaynak Adı) not etmek önemlidir. Bu, işlev çağırma için kullanılacak rolü belirlemek için yeni bir Lambda işlevi oluşturulurken kullanılacaktır.

Not: AWS Lambda, bir günlük kaydı hizmeti olan AWS Cloudwatch'daki işlev çağrılarından gelen tüm çıktıları otomatik olarak günlüğe kaydeder. Bir üretim ortamı için önerilen bu işlevsellik isteniyorsa, bu rol için politikalara bir Cloudwatch günlük akışına yazma izni eklenmelidir.

Kod!

genel bakış

Artık kodlamaya başlamaya hazırız. Bu noktada “awscli” komutunu kurduğunuzu varsayacağız. Henüz yapmadıysanız, bilgisayarınızda awscli'yi kurmak için https://aws.amazon.com/cli/ adresindeki talimatları takip edebilirsiniz.

Not: Bu örneklerde kullanılan kod, ekran görüntüleme kolaylığı için kısaltılmıştır. Daha eksiksiz bir sürüm için https://github.com/gxx/aws-lambda-python/ adresindeki depoyu ziyaret edin.

Öncelikle projemiz için bir iskelet yapı oluşturalım.

 aws-lambda-python/ - image_list/ - handler.py - list.html - Makefile - requirements.txt - image_resize/ - handler.py - resize.py - Makefile - requirements.txt - .pydistutils.cfg

Yapımızda, lambda fonksiyonlarımızın her biri için bir tane olmak üzere iki alt dizinimiz var. Bunların her birinde ortak handler.py, Makefile ve gereksinimleri.txt dosyalarına sahibiz. handler.py dosyası, lambda işlevlerinin her birinin çağrılması için çağrılacak yöntemi içerir ve işlevler için giriş noktası olarak kabul edilebilir. Gereksinimler.txt dosyası, gereksinimleri kolayca belirleyebilmemiz ve güncelleyebilmemiz için bağımlılıklarımızın bir listesini içerecektir. Son olarak, awscli ile etkileşim için kolay bir mekanizma sağlamak için kullanacağımız Makefile komutu. Bu, lambda işlevimizi oluşturma ve güncelleme sürecini çok daha kolay hale getirecektir.

Proje dizinimizin kök dizininde .pydistutils.cfg dosyasını göreceksiniz. Homebrew altında Python ile çalışıyorsanız bu dosya gereklidir. Bir Lambda işlevini dağıtma yöntemi nedeniyle (aşağıdaki bölümde ele alınmıştır) bu dosyaya ihtiyaç vardır. Daha fazla ayrıntı için depoya bakın.

Resmi Yeniden Boyutlandır Lambda İşlevi

kod

resize_image işleviyle başlayarak, Wand==0.4.2 0.4.2'yi gereksinim.txt dosyasına kaydederek, görüntü işleme kitaplığımız olan Wand bağımlılığını donduracağız. Bu, image_resize lambda işlevimiz için tek bağımlılık olacaktır. resize.py içindeki resize_image işlevinin Wand kitaplığından bir görüntü kaynağını işlemesi ve belirtilen genişlik ve yükseklik parametrelerine göre yeniden boyutlandırması gerekir. Yeniden boyutlandırılmakta olan görüntüyü korumak için, orijinal görüntünün görüntü oranını korurken görüntü boyutunu belirtilen genişlik ve yüksekliğe sığdırmak için küçültecek “en uygun” bir yeniden boyutlandırma algoritması kullanacağız.

 def resize_image(image, resize_width, resize_height): ... original_ratio = image.width / float(image.height) resize_ratio = resize_width / float(resize_height) # We stick to the original ratio here, regardless of what the resize ratio is if original_ratio > resize_ratio: # If width is larger, we base the resize height as a function of the ratio of the width resize_height = int(round(resize_width / original_ratio)) else: # Otherwise, we base the width as a function of the ratio of the height resize_width = int(round(resize_height * original_ratio)) if ((image.width - resize_width) + (image.height - resize_height)) < 0: filter_name = 'mitchell' else: filter_name = 'lanczos2' image.resize(width=resize_width, height=resize_height, filter=filter_name, blur=1) return image

Bunun dışında, S3'e yüklenen bir görüntü tarafından oluşturulan olayı kabul etmek, onu resize_image işlevine teslim etmek ve elde edilen yeniden boyutlandırılmış görüntüyü kaydetmek için bir işleyici işlevi gerekir.

 from __future__ import print_function import boto3 from wand.image import Image from resize import resize_image def handle_resize(event, context): # Obtain the bucket name and key for the event bucket_name = event['Records'][0]['s3']['bucket']['name'] key_path = event['Records'][0]['s3']['object']['key'] response = boto3.resource('s3').Object(bucket_name, key_path).get() # Retrieve the S3 Object # Perform the resize operation with Image(blob=response['Body'].read()) as image: resized_data = resize_image(image, 400, 400).make_blob() # And finally, upload to the resize bucket the new image s3_connection.Object('test-resized', key_path).put(ACL='public-read', Body=resized_data) # Finally remove, as the bucket is public and we don't want just anyone dumping the list of our files! s3_object.delete()

dağıtma

Kodun tamamlanmasıyla, yeni bir Lambda işlevi olarak Amazon Lambda'ya yüklenmesi gerekecektir. Dizin yapısına eklenen Makefile burada devreye giriyor. Bu Makefile, oluşturduğumuz Lambda işlev tanımlarını dağıtmak için kullanılacak.

 ROLE_ARN = arn:aws:iam::601885388019:role/lambda_role FUNCTION_NAME = ResizeImage REGION = us-west-1 TIMEOUT = 15 MEMORY_SIZE = 512 ZIPFILE_NAME = image_resize.zip HANDLER = handler.handle_resize clean_pyc : find . | grep .pyc$ | xargs rm install_deps : pip install -r requirements.txt -t . build : install_deps clean_pyc zip $(ZIPFILE_NAME) -r * create : build aws lambda create-function --region $(REGION) \ --function-name $(FUNCTION_NAME) \ --zip-file fileb://$(ZIPFILE_NAME) \ --role $(ROLE_ARN) \ --handler $(HANDLER) \ --runtime python2.7 \ --timeout $(TIMEOUT) \ --memory-size $(MEMORY_SIZE) update : build aws lambda update-function-code --region $(REGION) \ --function-name $(FUNCTION_NAME) \ --zip-file fileb://$(ZIPFILE_NAME) \ --publish

Bu Makefile'ın ana işlevleri “oluştur” ve “güncelle” dir. Bu işlevler önce, Lambda işlevini çalıştırmak için gerekli tüm kodu temsil eden geçerli dizini paketler. Ardından, requirements.txt dosyasında belirtilen tüm bağımlılıklar, paketlenecek geçerli alt dizine yüklenecektir. Paketleme adımı, dizinin içeriğini daha sonra “awscli” komutuyla yüklenmek üzere sıkıştırır. Makefile dosyamız diğer Lambda fonksiyon tanımında kullanılmak üzere uyarlanabilir.

Makefile yardımcı programında, imajımızı oluşturmak/güncellemek için gerekli olan birkaç değişkeni tanımlıyoruz. Makefile komutlarının sizin için düzgün çalışması için bunları gerektiği gibi yapılandırın.

  • ROLE_ARN : Bu, Lambda işlevini çalıştıracağımız rolümüzü tanımlayan Amazon Kaynak Adıdır.
  • FUNCTION_NAME : Oluşturduğumuz/güncellediğimiz Lambda fonksiyonunun adı.
  • REGION : Lambda işlevinin oluşturulacağı/güncelleneceği bölge.
  • TIMEOUT : Bir Lambda çağrısı sonlandırılmadan önceki saniye cinsinden zaman aşımı.
  • MEMORY_SIZE : Lambda işlevinin çağrıldığında erişebileceği megabayt cinsinden bellek boyutu.
  • ZIPFILE_NAME : Lambda işlev kodunu ve bağımlılıklarını içeren sıkıştırılmış paketin adı.
  • HANDLER : İşleyici işlevinin nokta gösterimiyle mutlak içe aktarma yolu.

Yapılandırıldıktan sonra, make create komutunu çalıştırmak aşağıdaki çıktıya benzer bir şey üretecektir:

 $ make create pip install -r requirements.txt -t . ... find . | grep .pyc| xargs rm zip image_resize.zip -r * ... aws lambda create-function --region ap-northeast-1 \ --function-name ResizeImage2 \ --zip-file fileb://image_resize.zip \ --role arn:aws:iam::11111111111:role/lambda_role \ --handler handler.handle_resize \ --runtime python2.7 \ --timeout 15 \ --memory-size 512 { "CodeSha256": "doB1hsujmZnxZHidnLKP3XG2ifHM3jteLEBvsK1G2nasKSo=", "FunctionName": "ResizeImage", "CodeSize": 155578, "MemorySize": 512, "FunctionArn": "arn:aws:lambda:us-west-1:11111111111:function:ResizeImage", "Version": "$LATEST", "Role": "arn:aws:iam::11111111111:role/lambda_role", "Timeout": 15, "LastModified": "2016-01-10T11:11:11.000+0000", "Handler": "handler.handle_resize", "Runtime": "python2.7", "Description": "" }

Test yapmak

Oluşturma komutunu yürüttükten sonra, görüntülerimiz için yeniden boyutlandırma işlevi kullanılabilir, ancak olayları almak için S3 kovasına bağlanmamıştır. İşlevin S3 dosya yükleme olaylarını düzgün bir şekilde işlediğini iddia etmek için işlevi AWS Konsolu aracılığıyla test edebiliriz. "Hizmetler" açılır menüsünün "Hesaplama" alt bölümünün altında bulunan AWS Lambda panosunda, oluşturduğumuz işlevin adını seçin. Bu Lambda işlevi ayrıntıları sayfası, "Test Olayını Yapılandır" etiketli seçeneği içeren "Eylemler" etiketli bir açılır menü sağlar.

Buna tıklamak, bir test olayı ve bazı örnek şablonlar belirlemenize izin veren bir modal açacaktır. "S3 Put" örneğini seçin ve bir kepçe adından bahsedenleri, kurulmuş olan kepçenin adıyla değiştirin. Bu yapılandırıldıktan sonra, Lambda işlevi sayfasındaki “Test” düğmesinin sonraki kullanımı, sanki önceden yapılandırılmış olay gerçekten meydana gelmiş gibi Lambda işlevini çağıracaktır.

Herhangi bir hata yığını izini veya günlük mesajlarını izlemek için günlük akışını Cloudwatch'da görüntüleyebilirsiniz. Lambda işlevi oluşturulurken aynı anda yeni bir günlük grubu da oluşturulmuş olacaktır. Bu günlük akışları yararlıdır ve diğer hizmetlere aktarılabilir.

S3 Bucket Events'e Bağlanma

S3 panosuna geri döndüğünüzde, "Olay Bildirimleri" formunu göstermek için "Özellikler" menüsünde bulunan daraltılmış "Olaylar" bölümünü genişletin. Doldurmamız gereken zorunlu alanlar “Etkinlikler” ve “Gönder” girişleridir. “Olaylar”dan “Nesne Oluşturuldu (Tümü)” olayını seçin. Bu, yükleme paketinde bir nesne oluşturan tüm olayların durdurulmasına izin verecektir. "Gönderilen" girişi için "Lambda işlevi" radyo düğmesini seçin. Seçenek olarak yapılandırdığımız “ResizeImage” lambda işlevini içeren bir açılır menü ile yeni bir bölüm görünecektir. "Kaydet" tıklandığında, "Nesne Oluşturuldu" olayları artık "ResizeImage" Lambda işlevinin çağrılması için bir girdi olarak yönlendirilecektir.

Artık uygulamanın temel işlevlerine sahibiz. Her şeyin beklendiği gibi çalıştığından emin olmak için başka bir cURL testi yapalım. S3 kovasına bir görüntü yüklemek için cURL'yi kullanın ve görüntünün yeniden boyutlandırma kovasına yüklenip yüklenmediğini manuel olarak kontrol edin.

 curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F '[email protected]'

Bu komutu yürüttükten sonra, Lambda işlevinin zaten "ısınmış" olup olmamasına bağlı olarak 50-1000ms sonra yeniden boyutlandırılan görüntü "test yeniden boyutlandırılmış" kovada oluşturulmalıdır.

Liste Görüntüsü Lambda İşlevi

kod

ListImage Lambda işlevi, yeniden boyutlandırılmış görüntülerin bir listesini alır ve bunları kullanıcı için bir HTML sayfasında görüntüler. Bu HTML sayfası ayrıca kullanıcının kendi resimlerini yüklemesi için işlevsellik sağlar. Jinja2, işlevde bir şablon tanımından HTML oluşturmak için kullanılır. Daha önce olduğu gibi, bu gereksinimler requirements.txt dosyasında belirtilir.

 from __future__ import print_function import os import boto3 from jinja2 import Environment from jinja2 import FileSystemLoader def _render_template(image_urls): env = Environment(loader=FileSystemLoader(os.path.abspath(os.path.dirname(__file__)))) template = env.get_template('list.html') rendered_template = template.render(image_urls=image_urls) return rendered_template def handle_list_image(event, context): bucket = boto3.resource('s3').Bucket('test-resized') image_summaries = sorted((image_summary for image_summary in bucket.objects.all()), key=lambda o: o.last_modified) image_urls = [] for summary in image_summaries: image_urls.append( boto3.client('s3').generate_presigned_url( 'get_object', Params={ 'Bucket': summary.bucket_name, 'Key': summary.key } ) ) return {'htmlContent': _render_template(image_urls)}
 <html> <head> <title>List Images</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> <script> var uploadImage = (function () { var inProgress = false; return function () { if (inProgress) { return; } inProgress = true; var formData = new FormData(); var fileData = $('#image-file').prop('files')[0]; formData.append('key', parseInt(Math.random() * 1000000)); formData.append('acl', 'public-read'); formData.append('file', fileData); $.ajax({ url: 'https://test-upload.s3.amazonaws.com/', type: 'POST', data: formData, processData: false, contentType: false, success: function (data) { window.location.reload(); } }); } })(); </script> <style type="text/css"> .image__container { float: left; width: 30%; margin-left: 2.5%; margin-right: 2.5%; max-width: 400px; } </style> </head> <body> <nav> <input type="file" onchange="uploadImage()" value="Upload Image" /> </nav> <section> {% for image_url in image_urls %} <div class="image__container"> <img src="{{ image_url }}" /> </div> {% endfor %} </section> </body> </html>

Bir kez daha, önceki Makefile'ı değiştirebilir ve lambda işlevimizi dağıtmak için create komutunu kullanabiliriz.

API Ağ Geçidi

ImageList Lambda işlevi tamamlanmıştır, ancak herhangi bir kullanıcıya sunulamaz. Bunun nedeni, Lambda işlevlerinin yalnızca başka bir hizmetten gelen bir olaya yanıt olarak veya program aracılığıyla çağrılabilmesidir. Amazon AWS API Gateway hizmetinin devreye girdiği yer burasıdır. API Gateway, “Uygulama Hizmetleri” alt bölümünde bulunabilir.

API Ağ Geçidi, uç noktaları bir dizi kaynak ve yöntem, esasen bir REST arabirimi olarak modellemenin bir yoludur. API Gateway, istekleri doğrulamak ve dönüştürmek için bir olanak sağlamanın yanı sıra, kısıtlama/hız sınırlama istekleri sağlama gibi diğer işlevleri de gerçekleştirir.

API Ağ Geçidi panosundan ListImage işlevine hizmet etmek için yeni bir API oluşturun. İsim ve açıklama tercihinize göre ayarlanabilir. Oluşturulduktan sonra, API ayrıntılarına erişmek için yeni API'nin adına tıklayın. “/” kök URL'si için yeni bir kaynak oluşturun. Bu URL, HTML sayfasını sunmak için kullanılacaktır.

Kök kaynak sayfasının ayrıntılarını görüntülerken bir GET yöntemi ekleyin. “Entegrasyon Türü”nü “Lambda İşlevi” olarak ayarlayın, “Lambda Bölgesi”ni “us-west-1” veya seçtiğiniz bölge olarak ayarlayın ve ListImage Lambda işlevinin adını yazın.

Yanıtımızı bir HTML çıktısına eşlemeye başlamadan önce, bu yanıtı bir içerik türüne eşlemeye ek olarak sunucudan yanıt için bir şema tanımlayacak bir “model” tanımlamamız gerekir. API için “Modeller” bölümünü seçin ve yeni bir model oluşturmak için “Oluştur”a tıklayın. Modele "text/html" içerik türüyle "HTML" adını verin ve şemayı aşağıdaki gibi tanımlayın:

 { "$schema": "http://json-schema.org/draft-04/schema#", "title" : "HTML", "type" : "object" }

API panosuna geri dönün, oluşturduğumuz kaynağı seçin ve "Entegrasyon Yanıtı" bölümüne gidin. Bu bölüm, yanıtı son adıma aktarmadan önce Lambda işlevinden bir yanıt aldıktan sonra işlenecek herhangi bir dönüşümü tanımlar.

“Eşleme Şablonları” bölümünü açın ve yeni bir “İçerik Türü” “metin/html” ekleyin. Eski “İçerik Türü”nü aynı anda kaldırın. Sağda, açılır menüyü "Çıktı Geçişi"nden "Eşleme şablonu"na değiştirin. Bu, API Gateway tarafından kabul edilen ham JSON'u değiştirmemize ve bunun yerine döndürülen verilerimizin "htmlContent" özelliği içindeki HTML içeriğini kullanmamıza izin verecektir. Eşleme şablonu için şablon olarak "$input.htmlContent" öğesini belirtin. Son olarak, “200 için Yanıt Modelleri”nden “application/json” öğesini kaldırarak ve bunun yerine “text/html” ekleyerek “Method Response” bölümünü değiştirin.

API için kontrol paneline geri dönersek, sayfanın sol üst köşesinde “API Dağıt” etiketli bir düğme vardır. API'yi belirtilen kaynaklar, yöntemler, modeller ve eşlemelerle güncellemek veya oluşturmak için bu düğmeye tıklayın. Bu yapıldıktan sonra, seçilen dağıtım aşaması için bir URL görüntülenecektir (varsayılan olarak aşamalandırma). Sonunda, örnek tamamlandı! Yeniden boyutlandırılmış görüntüleri test etmek ve görüntülemek için birkaç dosya yükleyebilirsiniz.

Toplama

AWS büyük bir hizmettir ve yakın zamanda ortadan kalkmayacaktır. Satıcı kilitlemesi her zaman dikkatli olunması gereken bir konu olsa da AWS Lambda, zengin bir dizi yardımcı yapılandırma seçeneğiyle nispeten ince bir hizmet sunar. Kolayca ölçeklenebilir ve bakımı yapılabilir uygulamaları uygulamak için AWS tarafından sağlanan hizmetlerden yararlanmak, AWS platformunu kullanmanın en büyük avantajını sağlayacaktır. AWS Lambda, çok sayıda tüketici tarafından kullanılan kurumsal düzeyde bir platform tarafından desteklenen zarif, ölçeklenebilir ve uygun maliyetli bir çözüm sunar. “Sunucusuz” uygulamaların geleceğin yolu olduğuna inanıyorum. Aşağıdaki yorumlarda ne düşündüğünüzü bize bildirin.