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. 

Ücretsiz Kullanım hakkında daha fazla bilgi >>


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.

01a

(büyütmek için tıklayın)


b. İşlev oluştur’u seçin.

01b

(büyütmek için tıklayı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.

01c

(büyütmek için 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')
01d

(büyütmek için tıklayın)


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.

01e

(büyütmek için tıklayın)


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.


a. Başka bir tarayıcı penceresinde AWS Management Console’a gidip arama çubuğuna IAM yazın. IAM’a tıklayarak hizmet konsolunu açın.

02a

(büyütmek için tıklayın)


b. Roller’e tıklayıp Rol Oluştur’u seçin.

02b

(büyütmek için tıklayın)


c. Güvenilen varlık türü seçin sayfasında AWS hizmetinin altındaki listeden Step Functions’ı ve ardından Sonraki: İzinler’i seçin.

02c

(büyütmek için tıklayın)


d. İzin politikası ekle sayfasında Sonraki: İnceleme’yi seçin.

 

02d

(büyütmek için tıklayın)


e. İnceleme sayfasında Rol adı olarak step_functions_basic_execution yazıp Rol oluştur’a tıklayın.

02e

(büyütmek için tıklayın)


f. Yeni IAM rolünüz oluşturulur ve Lambda işleviniz için IAM rolünün altındaki listede görüntülenir.

02f

(büyütmek için tıklayın)


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.

03c

(büyütmek için tıklayın)


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
    }
  }
}
03d

(büyütmek için tıklayın)


c. “API’yi çağır” Görev durumunda “Kaynak” satırını bulun (7. satır). Bu ARN’yi güncelleyerek yeni oluşturduğunuz sahte API işlevinin ARN’sine dönüştürmek için ARN metnine tıklayıp listeden ARN’yi seçin.

03e

(büyütmek için tıklayın)


d. Step Functions’ın yeni tasarladığınız iş akışına karşılık gelen bir durum makinesi diyagramı oluşturmasını sağlamak için görsel iş akışı bölmesinin yanındaki yenile düğmesine tıklayın. Görsel iş akışını inceledikten sonra Durum makinesi oluştur’a tıklayın.

03f

(büyütmek için tıklayın)


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.


a. Yürütmeyi başlat’a tıklayın.

04a

(büyütmek için tıklayın)


b. Durum makineniz için girdi girebileceğiniz yeni bir yürütme iletişim kutusu belirir. Siz API rolü oynayacak ve sahte API’nin döndürmesini istediğimiz hata kodunu sağlayacaksınız. Mevcut metni aşağıdaki kodla değiştirip Yürütmeyi başlat’ı seçin:

{
    "statuscode": "200"
}
04b

(büyütmek için tıklayın)


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.

04c

(büyütmek için tıklayın)


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.

04d

(büyütmek için tıklayın)


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.

04e

(büyütmek için tıklayın)


5. Adım. Durum Makinenizin Yürütülmesini Denetleme


a. Yürütme ayrıntıları ekranının üst kısmına gidip MyAPIStateMachine’e tıklayın.

05a

(büyütmek için tıklayın)


b. Yürütmeyi başlat’a tekrar tıklayın, bu kez aşağıdaki girdiyi sağlayın ve ardından Yürütmeyi başlat’a tıklayın.

{
    "statuscode": "503"
}
05b

(büyütmek için tıklayın)


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:

  1. Step Functions’ın Girdinizi yakaladığını
  2. Bu girdinin API’yi Çağır Görev durumuna aktarıldığını
  3. API’yi Çağır Görev durumunun bu girdiyi kullanarak MockAPIFunction’ınızı çağırdığını
  4. MockAPIFunction’ın yürütüldüğünü
  5. MockAPIFunction’ın bir ServerUnavailableException ile hata verdiğini
  6. API’yi Çağır Görev durumunuzun yakalama ifadesinin bu özel durumu yakaladığını
  7. Yakalama ifadesinin iş akışını başarısızlığa uğrattığını
  8. Durum makinenizin yürütmesini tamamladığını
05c

(büyütmek için tıklayın)


d. Bir sonraki adımda, bir 429 özel durumunu simüle edeceksiniz. Yürütme ayrıntıları ekranının üst kısmına gidip MyAPIStateMachine’e tıklayın. Yürütmeyi başlat’a tıklayın, aşağıdaki girdiyi sağlayın ve ardından Yürütmeyi başlat’a tıklayın:

{
    "statuscode": "429"
}
05d

(büyütmek için tıklayı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.

05e

(büyütmek için tıklayın)


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.

05f

(büyütmek için tıklayın)


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.


a. AWS Step Functions konsolu penceresinin üst kısmında, Durum makineleri’ne tıklayın.

06a

(büyütmek için tıklayın)


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.

06b

(büyütmek için tıklayın)


c. Sonra da Lambda işlevlerinizi sileceksiniz. AWS Management Console menüsünde Hizmetler’e tıklayın ve ardından Lambda’yı seçin.

06c

(büyütmek için tıklayın)


d. İşlevler ekranında, MockAPIFunction’ınıza tıklayıp Eylemler’i ve ardından Sil’i seçin. Sil’e tekrar tıklayarak silme işlemini doğrulayın.

06d

(büyütmek için tıklayın)


e. Son olarak, IAM rollerini sileceksiniz. AWS Management Console menüsünde Hizmetler’e tıklayın ve ardından IAM’ı seçin.

06e

(büyütmek için tıklayın)


f. Bu öğretici için oluşturduğunuz her iki IAM rolünü de seçin ve ardından Rolü sil’e tıklayın. İletişim kutusunda Evet, Sil’e tıklayarak silme işlemini onaylayın.


Şimdi, AWS Management Console oturumunuzu kapatabilirsiniz.

06f

(büyütmek için tıklayın)


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.