Sunucusuz Uygulamalardaki Hataları Ele Alma
(AWS Step Functions ve AWS Lambda Kullanarak)
Bu öğreticide, AWS Step Functions’ı kullanarak iş akışı çalışma zamanı hatalarını nasıl ele alacağınızı öğreneceksiniz. AWS Step Functions, birden fazla Lambda işlevini, hata ayıklaması ve değiştirilmesi kolay esnek iş akışlarına kolayca koordine etmenizi sağlayan sunucusuz bir düzenleme hizmetidir. AWS Lambda, sunucu tedarik etmeden veya yönetmeden kod çalıştırmanıza olanak tanıyan bir işlem hizmetidir.
Lambda işlevleri, örneğin işlenmeyen bir özel durumun tetiklendiği, yapılandırılan zaman aşımından daha uzun süre çalıştıkları veya belleklerinin tükendiği durumlarda zaman zaman hata verebilir. API kısıtlama veya yuva zaman aşımları gibi durumları ele almak için Lambda işlevlerinizin her birinde hata işleme mantığını yazmak ve sürdürmek, özellikle dağıtılmış uygulamalarda zaman alıcı ve karmaşık olabilir. Bu kodun her Lambda işlevine eklenmesi, işlevler arasında bağımlılıklar oluşturur ve değişiklikler meydana geldikçe tüm bu bağlantıları sürdürmek zor olabilir.
Bundan kaçınmak ve yazdığınız hata işleme kodunun miktarını azaltmak için AWS Step Functions’ı kullanarak işleve özel hata işlemeyi destekleyen sunucusuz bir iş akışı oluşturabilirsiniz. Hatanın geliştirici tarafından oluşturulan bir işlev özel durumu (ör. dosya bulunamadı) veya tahmin edilemez (ör. bellek yetersiz) olup olmadığına bakılmaksızın, Step Functions’ı meydana gelen hatanın türüne göre koşullu mantıkla yanıt verecek şekilde yapılandırabilirsiniz. İş akışı mantığınızı iş mantığınızdan bu yöntemle ayırarak iş akışınızın hatalara nasıl yanıt verdiğini Lambda işlevlerinizin iş mantığını değiştirmenize gerek kalmadan değiştirebilirsiniz.
Bu öğreticide, bu hataları incelikle ele alan AWS Step Functions’ı kullanarak sunucusuz bir iş akışı tasarlayıp çalıştıracaksınız. Çağrıları sahte olarak bir RESTful API’ye yönlendirip çeşitli yanıt kodları ve özel durumları döndürecek bir AWS Lambda işlevi oluşturacaksınız. Ardından, tetiklenen özel duruma göre farklı mantıkla yanıt veren Yeniden Dene ve Yakala özelliklerine sahip bir durum makinesi oluşturmak için AWS Step Functions’ı kullanacaksınız.
Bu öğretici için AWS hesabı gerekir
AWS Step Functions veya AWS Lambda için ilave ücretler bulunmamaktadır. Bu öğreticide oluşturduğunuz kaynaklar, Ücretsiz Kullanım için uygundur.
1. Adım. Sahte API Üreten Bir Lambda İşlevi Oluşturma
Bu adımda, sahte birkaç temel API etkileşimi üretecek bir Lambda işlevi oluşturacaksınız. Lambda işlevi, olay parametresi için girdi olarak verdiğiniz hata koduna bağlı olarak hayali bir API’den alınan yanıtları simüle eden özel durumlar tetikler.
a. AWS Management Console’u açın, böylece bu adım adım kılavuzu açık tutabilirsiniz. Ekran yüklendiğinde, başlamak için kullanıcı adınızı ve parolanızı girin. Ardından arama çubuğuna Lambda yazın ve Lambda’yı seçerek hizmet konsolunu açın.
c. Sıfırdan yazar'ı seçili bırakın. Ardından, Lambda işlevinizi aşağıdaki şekilde yapılandırın:
Ad kısmına MockAPIFunction yazın.
Çalışma zamanı için Python 3.6’yı seçin.
Rol için Özel rol oluştur’u seçin.
Yeni bir IAM penceresi açılır. Rol adı’nı lambda_basic_execution olarak bırakıp İzin ver’e tıklayın. Otomatik olarak Lambda konsoluna geri döndürüleceksiniz.
İşlev oluştur’a tıklayın.
d. MockAPIFunction ekranında aşağı doğru inerek İşlev kodu bölümünü bulun. Bu öğreticide, Python’da Lambda işlevleri yazmaya yönelik programlama modeli’ni kullanan bir işlev oluşturacaksınız. Kod penceresinde kodun tamamını aşağıdaki ile değiştirip Kaydet’i seçin.
class TooManyRequestsException(Exception): pass
class ServerUnavailableException(Exception): pass
class UnknownException(Exception): pass
def lambda_handler(event, context):
statuscode = event["statuscode"]
if statuscode == "429":
raise TooManyRequestsException('429 Too Many Requests')
elif statuscode == "503":
raise ServerUnavailableException('503 Server Unavailable')
elif statuscode == "200":
return '200 OK'
else:
raise UnknownException('Unknown error')
e. Lambda işleviniz oluşturulduktan sonra pencerenin üst kısmına gidip sayfanın sağ üst köşesinde bulunan Amazon Resource Name’i (ARN) not alın. Amazon Resource Name’ler (ARN’ler), AWS kaynaklarının benzersiz tanımlayıcıları olup AWS öğe ve politikalarını AWS hizmetleri ile API çağrıları genelinde izleyip kullanmanıza yardımcı olur. Step Functions’tan belirli bir kaynağa başvurmanız gerektiğinde sizden bir ARN talep ederiz.
2. Adım. Bir AWS Identity and Access Management (IAM) Rolü Oluşturma
AWS Step Functions, kod yürütebilir ve diğer AWS kaynaklarına (örneğin, Amazon S3 klasörlerinde depolanan veriler) erişebilir. Güvenliği sürdürmek için Step Functions’a AWS Identity and Access Management’ı (IAM) kullanarak bu kaynaklara erişim izni vermeniz gerekir.
3. Adım. Bir Step Functions Durum Makinesi Oluşturma
Artık sahte bir API yanıtı üreten basit Lambda işlevinizi oluşturduğunuza göre, API’yi çağırıp özel durumları işleyecek bir Step Functions durum makinesi oluşturabilirsiniz.
Bu adımda, Step Functions konsolunu kullanarak çeşitli API yanıtı kodlarını işlemek için Yeniden Dene ve Yakala alanına sahip bir Görev durumundan faydalanan bir durum makinesi oluşturacaksınız. Durum makinenize girdi olarak sunduğunuz API durum kodunu verecek olan sahte API Lambda işlevini çağırmak için bir Görev durumu kullanacaksınız.
a. AWS Step Functions konsolunu açın. Durum makinesi oluştur sayfasında Sıfırdan yazar’ı seçin. Ayrıntılar bölümünde durum makinenize MyAPIStateMachine adını verin ve ardından Mevcut bir rolü kullanacağım’ı seçin.
b. Ardından, sahte API’nizden aldığı yanıta göre farklı eylemler uygulayacak olan bir durum makinesi tasarlayacaksınız. API’ye erişilemezse, iş akışı tekrar deneyecektir. Yeniden deneme işlemi, geçici hataları ele almak açısından kullanışlı bir yöntemdir. İş akışı, sahte API tarafından oluşturulan farklı özel durumları da yakalar.
Durum makinesi tanımı bölümünün içeriğini aşağıdaki kodla değiştirin:
{
"Comment": "An example of using retry and catch to handle API responses",
"StartAt": "Call API",
"States": {
"Call API": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next" : "OK",
"Comment": "Catch a 429 (Too many requests) API exception, and resubmit the failed request in a rate-limiting fashion.",
"Retry" : [ {
"ErrorEquals": [ "TooManyRequestsException" ],
"IntervalSeconds": 1,
"MaxAttempts": 2
} ],
"Catch": [
{
"ErrorEquals": ["TooManyRequestsException"],
"Next": "Wait and Try Later"
}, {
"ErrorEquals": ["ServerUnavailableException"],
"Next": "Server Unavailable"
}, {
"ErrorEquals": ["States.ALL"],
"Next": "Catch All"
}
]
},
"Wait and Try Later": {
"Type": "Wait",
"Seconds" : 1,
"Next" : "Change to 200"
},
"Server Unavailable": {
"Type": "Fail",
"Error":"ServerUnavailable",
"Cause": "The server is currently unable to handle the request."
},
"Catch All": {
"Type": "Fail",
"Cause": "Unknown error!",
"Error": "An error of unknown type occurred"
},
"Change to 200": {
"Type": "Pass",
"Result": {"statuscode" :"200"} ,
"Next": "Call API"
},
"OK": {
"Type": "Pass",
"Result": "The request has succeeded.",
"End": true
}
}
}
4. Adım. Hata İşleme İş Akışınızı Test Etme
Hata işleme iş akışınızı test etmek için durum makinenize hata kodunu girdi olarak sağlayarak sahte API’nizi çağırma çağrısı yapacaksınız.
c. Yürütme ayrıntıları ekranında, durum makinenize girdiğiniz girdiyi görmek için Girdi’ye tıklayın. Ardından, durum makinesi yürütme işleminizin sonucunu görmek için Çıktı’ya tıklayın. İş akışının durum kodu 200’ü başarılı bir API çağrısı olarak yorumladığını görebilirsiniz.
d. Görsel iş akışı altında her yürütme işleminin yürütme yolunu (iş akışında yeşil renkle gösterilir) görebilirsiniz. “API’yi Çağır” Görev durumuna tıklayıp Adım ayrıntıları ekranında Girdi ve Çıktı alanlarını genişletin.
Bu Görev durumunun, sağladığınız girdiyle sahte API Lambda işlevinizi başarıyla çağırdığını ve bu Lambda işlevinin çıktısını (“200 OK”) yakaladığını görebilirsiniz.
e. Ardından, görsel iş akışında “Tamam” Görev durumuna tıklayın. Adım ayrıntıları altında, bir önceki adımın (API’yi Çağır Görev durumu) çıktısının bu adıma girdi olarak aktarılmış olduğunu görebilirsiniz. Tamam durumu, bir Geçiş durumudur; hiçbir çalışma gerçekleştirmeden girdisinin çıktısına geçtiğini ifade eder. Geçiş durumları, durum makinelerini yapılandırırken ve bu makinelerdeki hataları ayıklarken faydalıdır.
5. Adım. Durum Makinenizin Yürütülmesini Denetleme
c. Yürütme olayı geçmişi bölümünde her yürütme adımını genişleterek iş akışınızın beklenen davranışı gösterdiğini onaylayın. Bu yürütmenin başarısız olmasını bekliyorduk; bu yüzden, panik yapmayın! Şunları fark edeceksiniz:
- Step Functions’ın Girdinizi yakaladığını
- Bu girdinin API’yi Çağır Görev durumuna aktarıldığını
- API’yi Çağır Görev durumunun bu girdiyi kullanarak MockAPIFunction’ınızı çağırdığını
- MockAPIFunction’ın yürütüldüğünü
- MockAPIFunction’ın bir ServerUnavailableException ile hata verdiğini
- API’yi Çağır Görev durumunuzun yakalama ifadesinin bu özel durumu yakaladığını
- Yakalama ifadesinin iş akışını başarısızlığa uğrattığını
- Durum makinenizin yürütmesini tamamladığını
e. Şimdi, iş akışınızın yeniden deneme davranışını denetleyeceksiniz. Yürütme olayı geçmişi bölümünde her yürütme adımını bir kez daha genişleterek Step Functions’ın MockAPILambda işlevini çağırmayı iki kez daha denediğini ve bunların her ikisinin de başarısız olduğunu onaylayın. Bu noktada, iş akışınız API’nin sadece geçici olarak yanıt vermediği umuduyla Bekle ve Daha Sonra Dene durumuna (sağdaki görüntüde gösterilmektedir) geçiş yapmıştır.
Ardından, Bekle durumu kaba kuvvet uygulayarak yanıt kodunu 200 olarak değiştirmeye çalışmış ve iş akışınız yürütmeyi başarıyla tamamlamıştır. Bir 429 özel durumunu gerçek bir uygulamada muhtemelen bu şekilde işlemezsiniz ancak öğreticiyi anlaşılır kılmak için işi basit tutuyoruz.
f. İş akışınızın bir örneğini daha yürütün ve bu kez durum makineniz tarafından işlenmeyen rastgele bir API yanıtı sağlayın:
{
"statuscode": "999"
}
Yürütme olayı geçmişi’ni kullanarak yürütmeyi tekrar denetleyin. Tamamlandığında, MyAPIStateMachine’e bir kez daha tıklayın. Yürütmeler bölmesinde iş akışınızdaki tüm yürütmelerin geçmişini görebilir ve her birine dilediğiniz gibi ayrı ayrı girebilirsiniz.
6. Adım. Kaynaklarınızı Sonlandırma
Bu adımda, AWS Step Functions ve AWS Lambda ile ilgili kaynaklarınızı sonlandıracaksınız.
Önemli: Aktif olarak kullanılmayan kaynakları sonlandırmak maliyeti azaltır ve iyi bir uygulamadır. Kaynaklarınızı sonlandırmamak ücret ödemenize neden olabilir.
b. Durum makineleri penceresinde, MyAPIStateMachine’e tıklayıp Sil’i seçin. İletişim kutusunda Durum makinesini sil’i seçerek işlemi doğrulayın. Step Functions, devam eden tüm yürütmelerin tamamlandığını doğruladığında, Durum makineniz bir veya iki dakika içinde silinecektir.
Tebrikler!
AWS Step Functions ve AWS Lambda’yı kullanarak bir ağ API’si için hata işleme iş akışı oluşturdunuz. AWS Lambda’yı kullanarak hiçbir yönetim işlemi gerekmeden neredeyse her tür uygulama veya arka uç hizmeti için kod çalıştırabilirsiniz. Kodunuzu yüklemeniz yeterlidir. Lambda, kodunuzu yüksek erişilebilirlikle çalıştırmak ve ölçeklemek için gereken her şeyle ilgilenir.
AWS Step Functions ile AWS Lambda’nın bir arada kullanılması, sunucusuz uygulamalarda AWS Lambda işlevlerinin uyum içinde kullanılmasını kolaylaştırır. Step Functions, arka plandaki uygulama yönetimi işlemlerine ve durumu düzenlemeye gerek kalmadan karmaşık iş akışlarını Lambda işlevlerini kullanarak kontrol etmenize olanak sağlar. Step Functions'tan mikro hizmetlerin Amazon EC2 ve Amazon ECS gibi işlem kaynaklarını kullanarak düzenlenmesinde de faydalanabilirsiniz.