AWS Türkçe Blog

Amazon CodeWhisperer kullanarak Python’da sunucusuz bir uygulama geliştirin

Orijinal makale: Link (Rafael Ramos, Dmitry Balabanov, Caroline Gluck ve Jason Varghese)

Geliştiriciler, uygulama geliştirmek için kod yazarken birden çok programlama dili, çerçeve, yazılım kitaplığı ve AWS gibi sağlayıcıların sunduğu popüler bulut hizmetlerine ayak uydurmalıdır. Geliştiriciler için, geliştirici topluluklarında onlardan öğrenmek veya kodu yeniden kullanmak için kod parçacıklarını bulabilse de, parçacıkları tam veya benzer bir kullanım durumuyla manuel olarak aramak dikkat dağıtıcı ve zaman alıcı bir süreçtir. Doğru programlama söz dizimini ve en iyi kodlama uygulamalarını takip ettiklerinden emin olarak tüm bunları yapmak zorundadırlar.

Geliştiriciler için makine öğrenimi (ML) destekli bir kodlama yardımcısı olan Amazon CodeWhisperer, bu zorlukların üstesinden gelmenizi sağlar. Geliştiriciler, “upload a file to S3.” (S3’e bir dosya yükleyin) gibi düz bir İngilizce ile belirli bir görevi özetleyen bir yorum yazabilirler. Buna dayanarak CodeWhisperer, belirtilen görev için hangi bulut hizmetlerinin ve genel kitaplıklarının en uygun olduğunu otomatik olarak belirler, anında belirli kodu oluşturur ve ardından oluşturulan kod parçacıklarını doğrudan IDE’de önerir. Ve bu, web’den kodu kopyalayıp yapıştırmakla ilgili değildir, dosyanızın bağlamına, örneğin sahip olduğunuz kitaplıklara ve sürümlere ve mevcut koda dayalı olarak kod oluşturmakla ilgilidir. Ayrıca CodeWhisperer, Visual Studio Code ve JetBrains IDE’lerinizle sorunsuz bir şekilde bütünleşir, böylece odaklanmaya devam edebilir ve geliştirme ortamından asla ayrılamazsınız. Bu yazının yazıldığı sırada CodeWhisperer, Java, Python, JavaScript, C# ve TypeScript’i desteklemektedir.

Bu gönderide, görüntü tanıma için tam teşekküllü, olay odaklı, sunucusuz bir uygulama oluşturacağız. CodeWhisperer’ın yardımıyla, görüntü tanıma gerçekleştirmek üzere Amazon Rekognition, Amazon DynamoDB, Amazon Simple Notification Service (Amazon SNS), Amazon Simple Queue Service (Amazon SQS), Amazon Simple Storage Service (Amazon S3) ve üçüncü taraf HTTP API’leriyle etkileşim kurmak için AWS Lambda üzerinde çalışan kendi kodunuzu yazacaksınız. Uygulamanın kullanıcıları, işlenmek üzere bir görüntünün URL’ini göndererek veya görüntüleri ve her görüntüde bulunan nesneleri listeleyerek onunla etkileşim kurabilir.

Çözüme genel bakış

Uygulamamızın anlaşılmasını kolaylaştırmak için onu üç bölüme ayıracağız:

  1. Resim indirme (Image download) – Kullanıcı, ilk API’ya bir resim URL’i sağlar. Bir Lambda işlevi, görüntüyü URL’den indirir ve bir S3 klasöründe depolar. Amazon S3, bir Amazon SNS konusuna otomatik olarak yeni bir görüntünün işlenmeye hazır olduğunu bildiren bir bildirim gönderir. Amazon SNS daha sonra mesajı bir Amazon SQS kuyruğuna teslim eder.
  2. Görüntü tanıma (Image recognition) – İkinci bir Lambda işlevi, görüntünün orkestrasyonunu ve işlenmesini yönetir. Amazon SQS kuyruğundan mesajı alır, görüntüyü işlemesi için Amazon Rekognition’a gönderir, tanıma sonuçlarını bir DynamoDB tablosunda depolar ve bu sonuçlarla birlikte üçüncü bölümde kullanılan ikinci bir Amazon SNS konusuna JSON olarak bir mesaj gönderir. Bir kullanıcı, DynamoDB tablosunu sorgulayan ikinci bir API’ı çağırarak her bir görüntüde bulunan görüntüleri ve nesneleri listeleyebilir.
  3. 3. parti entegrasyonu (3rd-party integration) – Son Lambda işlevi, ikinci Amazon SQS kuyruğundaki mesajı okur. Bu noktada Lambda işlevi, bu mesajı yalnızca XML yüklerini destekleyen hayali bir harici e-posta sunucusu HTTP API’ına teslim etmelidir. Bu nedenle, Lambda işlevi JSON mesajını XML’e dönüştürür. Son olarak işlev, XML nesnesini HTTP POST aracılığıyla e-posta sunucusuna gönderir.

Aşağıdaki şema, uygulamamızın mimarisini göstermektedir:

Architecture diagram depicting the application architecture. It contains the service icons with the component explained on the text above

Şekil 1. Uygulama mimarisini gösteren mimari diyagramı. Yukarıdaki metinde açıklanan bileşene sahip hizmet simgelerini içerir.

Ön koşullar

Başlamadan önce, aşağıdaki ön koşullara sahip olmanız gerekir:

Ortamı yapılandırma

Bu Git deposunda bulabileceğiniz, oluşturacağımız uygulama için yapı iskelesini zaten oluşturduk. Bu uygulama, yukarıdaki mimari diyagrama göre altyapıyı açıklayan bir CDK uygulamasıyla temsil edilir. Ancak, uygulamanın gerçek iş mantığı sağlanmaz. Bunu CodeWhisperer kullanarak uygulayacaksınız. Bu, API Gateway uç noktaları, DynamoDB tablosu ve konular ve kuyruklar gibi AWS CDK bileşenlerini zaten kullandığımızı beyan ettiğimiz anlamına gelir. AWS CDK’de yeniyseniz daha sonra CDK atölyesini incelemenizi öneririz.

AWS CDK uygulamalarını bir AWS ortamına (bir AWS hesabı ve bölgesinin birleşimi) dağıtmak, dağıtımı gerçekleştirmek için AWS CDK’in ihtiyaç duyduğu kaynakları sağlamanızı gerektirir. Bu kaynaklar, dosyaları depolamak için bir Amazon S3 klasörünü ve dağıtımları gerçekleştirmek için gereken izinleri veren IAM rollerini içerir. Bu ilk kaynakları sağlama işlemine önyükleme (bootstrapping) denir. Gerekli kaynaklar, önyükleme yığını adı verilen ve genellikle CDKToolkit olarak adlandırılan bir AWS CloudFormation yığınında tanımlanır. Herhangi bir CloudFormation yığını gibi dağıtıldıktan sonra CloudFormation konsolunda görünür.

Depoyu klonladıktan sonra, uygulamayı konuşlandıralım (daha sonra CodeWhisperer kullanarak uygulayacağımız iş mantığı olmadan). Bu gönderi için, uygulamayı Python’da uygulayacağız. Bu nedenle, python dizini altında olduğunuzdan emin olun. Ardından, AWS CDK için bir AWS ortamını önyüklemek üzere cdk bootstrap komutunu kullanın. Önce {AWS_ACCOUNT_ID} ve {AWS_REGION} değerlerini ilgili değerlerle değiştirin:

cdk bootstrap aws://{AWS_ACCOUNT_ID}/{AWS_REGION}
Bash

Önyükleme hakkında daha fazla bilgi için belgelere bakın.

Ortamınızı hazırlamanın son adımı, IDE’nizde CodeWhisperer’ı etkinleştirmektir. Hangi IDE’yi kullandığınıza bağlı olarak bunu nasıl yapacağınızı öğrenmek için CodeWhisperer’ı VS Code için Kurma veya JetBrains için Amazon CodeWhisperer’ı Kurma bölümlerine bakın.

Resim indirme

Sağlanan URL’den bir görüntü indirmekten ve bu görüntüyü bir S3 klasöründe depolamaktan sorumlu olan ilk Lambda işlevini uygulayarak başlayalım. python/api/runtime/ dizininden get_save_image.py dosyasını açın. Bu dosya, boş bir Lambda işlev işleyicisini ve bu Lambda işlevini entegre etmek için gerekli giriş parametrelerini içerir.

  • url, kullanıcı tarafından sağlanan giriş görüntüsünün URL’idir,
  • name, kullanıcı tarafından sağlanan resmin adıdır, ve
  • S3_BUCKET, uygulama altyapımız tarafından tanımlanan S3 klasör adıdır.

Gerekli işlevselliği açıklayan doğal dilde bir yorum yazın, örneğin:

# Function to get a file from url
Bash

CodeWhisperer’ı tetiklemek için yorumu girdikten sonra Enter tuşuna basın ve bir kod önerisi bekleyin. CodeWhisperer’ı manuel olarak tetiklemek istiyorsanız, MacOS’ta Option + C veya Windows’ta Alt + C tuşlarına basabilirsiniz. Ok tuşlarıyla birden çok öneriye (varsa) göz atabilirsiniz. Tab tuşuna basarak bir kod önerisini kabul edin. Esc tuşuna basarak veya bir karakter yazarak bir öneriyi iptal edin.

CodeWhisperer ile nasıl çalışılacağı hakkında daha fazla bilgi için bkz. VS Code’da CodeWhisperer ile Çalışma veya JetBrains’ten Amazon CodeWhisperer ile Çalışma.

Belirli bir URL’i kullanarak bir dosyayı indiren bir işlevin önerilen bir uygulamasını edinmelisiniz. Aşağıdaki resimde, CodeWhisperer’ın önerdiği kod parçacığının bir örneği gösterilmektedir:

Screenshot of the code generated by CodeWhisperer on VS Code. It has a function called get_file_from_url with the implementation suggestion to download a file using the requests lib

Şekil 2. CodeWhisperer tarafından VS Code üzerinde oluşturulan kodun ekran görüntüsü. “requests” kütüphanesini kullanarak bir dosya indirmek için uygulama önerisiyle get_file_from_url adlı bir işleve sahiptir.

CodeWhisperer’ın kod önerileri sağlamak için yapay zeka (AI) kullandığını ve bunun belirleyici olmadığını unutmayın. IDE’nizde aldığınız sonuç yukarıdaki görseldekinden farklı olabilir. Gerekirse, CodeWhisperer temel mantığı oluşturduğundan kodda ince ayar yapın, ancak gereksinimlerinize bağlı olarak ayrıntıları özelleştirmek isteyebilirsiniz.

Bu kez görüntüyü bir S3 klasörüne yüklemek için başka bir işlem deneyelim:

# Function to upload image to S3
Bash

Sonuç olarak, CodeWhisperer aşağıdakine benzer bir kod parçacığı oluşturur:

Screenshot of the code generated by CodeWhisperer on VS Code. It has a function called upload_image with the implementation suggestion to download a file using the requests lib and upload it to S3 using the S3 client

Şekil 3. CodeWhisperer tarafından VS Code üzerinde oluşturulan kodun ekran görüntüsü. “requests” kütüphanesini kullanarak bir dosyayı indirmek ve S3 istemcisini kullanarak S3’ye yüklemek için uygulama önerisiyle birlikte upload_image adlı bir işleve sahiptir.

Artık web’den bir görüntü indirme ve onu bir S3 klasörüne yükleme fonksiyonlarına sahip işlevlere sahip olduğunuza göre, her işlevi doğru girdilerle çağırarak Lambda işleyici işlevindeki her iki fonksiyonu da bağlayabilirsiniz.

Görüntü tanıma

Şimdi, görüntüyü işlenmek üzere Amazon Rekognition’a göndermekten, sonuçları bir DynamoDB tablosunda depolamaktan ve bu sonuçlarla ikinci bir Amazon SNS konusuna JSON olarak bir mesaj göndermekten sorumlu Lambda işlevini uygulayalım. python/recognition/runtime/ dizininden image_recognition.py dosyasını açın. Bu dosya, boş bir Lambda ve bu Lambda işlevini entegre etmek için gerekli giriş parametrelerini içerir.

  • queue_url, bu Lambda işlevinin abone olduğu Amazon SQS kuyruğunun URL’idir,
  • table_name, DynamoDB tablosunun ismidir, ve
  • topic_arn, bu Lambda işlevinin yayınlandığı Amazon SNS konusunun ARN’idir.

CodeWhisperer’ı kullanarak, bir sonraki Lambda işlevinin iş mantığını önceki bölümde yaptığınız gibi uygulayın. Örneğin, Amazon Rekognition kullanarak bir görüntüdeki etiketleri algılamak için aşağıdaki yorumu yazın:

# Detect labels from image with Rekognition
Bash

Ve sonuç olarak, CodeWhisperer size aşağıdaki görüntüdekine benzer bir kod parçacığı vermelidir:

Screenshot of the code generated by CodeWhisperer on VS Code. It has a function called detect_labels with the implementation suggestion to use the Rekognition SDK to detect labels on the given image

Şekil 4. CodeWhisperer tarafından VS Code üzerinde oluşturulan kodun ekran görüntüsü. Belirli bir görüntüdeki etiketleri algılamak için Rekognition SDK’i kullanmak üzere uygulama önerisiyle birlikte detect_labels adlı bir işleve sahiptir.

Lambda işlevinizin iş mantığını tam olarak uygulamak için ihtiyacınız olan diğer işlevleri oluşturmaya devam edebilirsiniz. İşte kullanabileceğiniz bazı örnekler:

  • # Save labels to DynamoDB
  • # Publish item to SNS
  • # Delete message from SQS

Aynı yaklaşımı izleyerek, DynamoDB tablosundaki tüm etiketleri listeleme mantığını uygulamak için python/recognition/runtime/ dizininden list_images.py dosyasını açın. Daha önce yaptığınız gibi, düz İngilizce bir yorum yazın:

# Function to list all items from a DynamoDB table
Bash

Diğer sık ​​kullanılan kod

CodeWhisperer’dan yararlanmanın tek yolu AWS ile etkileşim kurmak değildir. Birim testleri oluşturmak ve mesaj biçimlerini dönüştürmek gibi tekrarlayan görevleri uygulamak veya sıralama ve dize eşleştirme ve ayrıştırma gibi algoritmaları uygulamak için kullanabilirsiniz. Bu gönderi kapsamında uygulayacağımız son Lambda işlevi, Amazon SQS’ten alınan bir JSON yükünü XML’e dönüştürmektir. Ardından, bu XML’i bir HTTP uç noktasına POST yapacağız.

python/integration/runtime/ dizininden send_email.py dosyasını açın. Bu dosya boş bir Lambda işlev işleyicisi içeriyor. event, işlenecek bir Lambda işlevi için veri içeren JSON biçimli bir belgedir. Kod parçacığını almak için bir yorum yazın:

# Transform json to xml
Bash

CodeWhisperer, kod oluşturmak için dosyalarınızın bağlamını kullandığından, dosyanızda yaptığınız içe aktarmalara bağlı olarak, aşağıdaki görüntüdeki gibi bir uygulama alırsınız:

Screenshot of the code generated by CodeWhisperer on VS Code. It has a function called json_to_xml with the implementation suggestion to transform JSON payload into XML payload

Şekil 5. CodeWhisperer tarafından VS Code üzerinde oluşturulan kodun ekran görüntüsü. JSON yükünü XML yüküne dönüştürmek için uygulama önerisiyle birlikte json_to_xml adlı bir işleve sahiptir.

Son işlev uygulamasını almak için # Send XML string with HTTP POST gibi bir yorumla aynı işlemi tekrarlayın. E-posta sunucusunun bu uygulamanın parçası olmadığını unutmayın. Bunu taslak olarak bırakabilir veya bu HTTP POST adımını yok sayabilirsiniz. Son olarak, her bir işlevi doğru girdilerle çağırarak Lambda işleyici işlevindeki her iki fonksiyonu da bağlayın.

Uygulamayı dağıtın ve test edin

Uygulamayı dağıtmak için cdk deploy --all komutunu çalıştırın. Bir onay mesajı almalısınız ve birkaç dakika sonra uygulamanız AWS hesabınızda çalışır durumda olacaktır. Çıktı olarak, APIStack ve RekognitionStack, API Gateway uç nokta URL’lerini yazdırır. Bu örneğe benzer görünecektir:

Outputs:
...
APIStack.RESTAPIEndpoint01234567 = https://examp1eid0.execute-
api.{your-region}.amazonaws.com/prod/
Bash
  1. İlk uç nokta iki dize parametresi bekler: url (indirilecek resim dosyası URL’i) ve name (S3 klasöründe depolanacak hedef dosya adı). İstediğiniz herhangi bir resim URL’ini kullanın, ancak özel karakterlerden kaçmak için bir resim URL’ini bir sorgu dizesi parametresi olarak geçirmeden önce kodlamanız gerektiğini unutmayın. Bunun için seçtiğiniz bir çevrimiçi URL kodlayıcı kullanın. Ardından, API Gateway uç noktasını çağırmak için curl komutunu kullanın:
curl -X GET 'https://examp1eid0.execute-api.eu-east- 2.amazonaws.com/prod?url={encoded-image-URL}&name={file-name}'
Bash

{encoded-image-URL} ve {file-name} öğelerini karşılık gelen değerlerle değiştirin. Ayrıca, yukarıda belirtildiği gibi AWS CDK deploy komutu çıktısında not ettiğiniz doğru API uç noktasını kullandığınızdan emin olun.

  1. İşlemin arka planda gerçekleşmesi birkaç saniye sürecektir. Hazır olduğunda, List Images API’ı çağırarak DynamoDB tablosunda nelerin depolandığını görün (dağıtılan AWS CDK yığınınızın çıktısından doğru URL’i kullandığınızdan emin olun):
curl -X GET 'https://examp1eid7.execute-api.eu-east-2.amazonaws.com/prod'
Bash

İşiniz bittiğinde, hesabınıza beklenmeyen masraflar gelmesini önlemek için AWS CDK yığınlarınızı temizlediğinizden emin olun. Yığınları silmek için cdk destroy komutunu kullanın.

Sonuç

Bu gönderide, makine öğreniminin yardımıyla nasıl önemli bir üretkenlik artışı elde edebileceğimizi gördük. Bununla, bir geliştirici olarak, IDE’nize odaklanmaya devam edebilir ve kullanım durumunuzla alakalı kod parçacıklarını çevrimiçi aramak için harcadığınız zamanı azaltabilirsiniz. Doğal dilde yorumlar yazarken, tam teşekküllü uygulamaları uygulamak için bağlama dayalı parçacıklar elde edersiniz. Ayrıca CodeWhisperer, bir kod önerisinin belirli CodeWhisperer eğitim verilerine benzer olup olmadığını algılayan referans izleyici adlı bir mekanizma ile birlikte gelir. Referans izleyici, bu referans kodunu kolayca bulup incelemenizi ve başka bir proje bağlamında nasıl kullanıldığını görmenizi sağlar. Son olarak CodeWhisperer, güvenlik açıklarını tespit etmek için kodunuz üzerinde (CodeWhisperer tarafından oluşturulan ve sizin tarafınızdan yazılan) taramalar çalıştırma yeteneği sağlar.

Ön izleme döneminde, CodeWhisperer dünyadaki tüm geliştiricilere ücretsiz olarak sunulmaktadır. JetBrains, VS Code veya AWS Cloud9’daki ücretsiz ön izlemeyi kullanmaya başlayın.