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:
- 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.
- 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. 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:
Ön koşullar
Başlamadan önce, aşağıdaki ön koşullara sahip olmanız gerekir:
- Bir AWS hesabı ve Yönetici kullanıcı
- AWS CLI’ı yükleyin ve kimliğini doğrulayın. Bir AWS Identity and Access Management (IAM) kullanıcısı veya bir AWS Security Token Service (AWS STS) belirteci ile kimlik doğrulaması yapabilirsiniz.
- Python 3.7 veya üstünü yükleyin.
- Node Package Manager (npm) yükleyin.
- AWS CDK Toolkit yükleyin.
- VS Code veya JetBrains için AWS Toolkit yükleyin.
- Git yükleyin.
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:
Ö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, veS3_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:
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:
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:
Sonuç olarak, CodeWhisperer aşağıdakine benzer bir kod parçacığı oluşturur:
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, vetopic_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:
Ve sonuç olarak, CodeWhisperer size aşağıdaki görüntüdekine benzer bir kod parçacığı vermelidir:
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:
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:
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:
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:
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:
- İlk uç nokta iki dize parametresi bekler:
url
(indirilecek resim dosyası URL’i) vename
(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çincurl
komutunu kullanın:
{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.
- İş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):
İş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.