Mengatasi Kesalahan dalam Aplikasi Tanpa Server

dengan AWS Step Functions dan AWS Lambda

Dalam tutorial ini, Anda akan mempelajari cara menggunakan AWS Step Functions untuk menangani berbagai kesalahan runtime alur kerja. AWS Step Functions merupakan sebuah layanan pengaturan tanpa server yang memungkinkan Anda dengan mudah mengoordinasikan beberapa fungsi Lambda ke dalam alur kerja fleksibel yang mudah di-debug dan mudah diubah. AWS Lambda adalah layanan komputasi yang memungkinkan Anda menjalankan kode tanpa menyediakan atau mengelola server. 

Fungsi Lambda dapat sesekali menemui kegagalan, misalnya jika terjadi pengecualian yang tidak tertangani, jika fungsi ini berjalan lebih lama daripada waktu henti yang telah dikonfigurasikan, atau jika fungsi ini kehabisan memori. Menulis dan memelihara logika penanganan kesalahan dalam masing-masing fungsi Lambda untuk menangani situasi seperti kemacetan API atau waktu habis socket dapat memakan banyak waktu dan rumit, terutama untuk aplikasi terdistribusi. Menyematkan kode ini dalam setiap fungsi Lambda akan menciptakan ketergantungan di antara fungsi tersebut, dan dapat menyulitkan dalam memelihara semua koneksi saat terjadi banyak perubahan.

Untuk menghindarinya, dan untuk mengurangi jumlah kode penanganan kesalahan yang Anda tulis, Anda dapat menggunakan AWS Step Functions untuk membuat sebuah alur kerja tanpa server yang mendukung penanganan kesalahan fungsi. Terlepas dari apakah kesalahan merupakan pengecualian fungsi yang dibuat oleh pengembang (misal, file tidak ditemukan), atau tidak diprediksi (misal, kehabisan memori), Anda dapat mengonfigurasikan Step Functions untuk merespons dengan logika kondisional yang didasarkan pada jenis kesalahan yang terjadi. Dengan memisahkan logika alur kerja dari logika bisnis dengan cara ini, Anda dapat memodifikasi bagaimana alur kerja Anda merespons kesalahan tanpa mengubah logika bisnis fungsi Lambda Anda.

Dalam tutorial ini, Anda akan merancang alur kerja tanpa server menggunakan AWS Step Functions yang akan menangani kesalahan ini dengan mulus. Anda akan membuat fungsi AWS Lambda yang akan membuat tiruan panggilan ke RESTful API dan menghasilkan berbagai kode respons dan pengecualian. Kemudian, Anda akan menggunakan AWS Step Functions untuk emmbuat mesin status dengan kemampuan Coba Ulang dan Tangkap yang merespons dengan logika berbeda, bergantung pada pengecualian yang diberikan.

Tutorial ini memerlukan akun AWS

Tidak ada biaya tambahan untuk AWS Step Functions atau AWS Lambda. Sumber daya yang Anda buat dalam tutorial ini memenuhi syarat untuk Tingkat Gratis. 

Selengkapnya tentang Tingkat Gratis >>


Langkah 1. Buat Fungsi Lambda untuk Meniru API

Dalam langkah ini, Anda akan membuat fungsi Lambda yang akan meniru beberapa interaksi API dasar. Fungsi Lambda akan memberikan pengecualian untuk menyimulasikan respons dari API fiksi, bergantung pada kode kesalahan yang Anda berikan sebagai input dalam parameter kejadian.


a.  Buka AWS Management Console, agar panduan langkah demi langkah ini selalu terbuka. Ketika layar memuat, masukkan nama pengguna dan kata sandi untuk memulai. Berikutnya, ketik Lambda dalam bilah pencarian dan pilih Lambda untuk membuka konsol layanan.

01a
01a

( klik untuk memperbesar )


b. Pilih Buat fungsi.

01b
01b

( klik untuk memperbesar )


c. Biarkan Tulis dari awal dipilih. Berikutnya, konfigurasikan fungsi Lambda sebagai berikut:

Untuk Nama, ketik MockAPIFunction.
Untuk Runtime, pilih Python 3.6.
Untuk Peran, pilih Buat peran kustom.

Jendela IAM baru akan terbuka. Biarkan Nama peran sebagai lambda_basic_execution dan klik Izinkan. Anda akan secara otomatis dikembalikan ke konsol Lambda.

Pilih Buat fungsi.

01c
01c

( klik untuk memperbesar )


d. Pada layar MockAPIFunction, gulir ke bawah ke bagian Kode fungsi. Dalam tutorial ini, Anda akan membuat fungsi yang menggunakan model pemrograman untuk menulis fungsi Lambda di Python. Dalam jendela kode, ganti semua kode dengan berikut, kemudian pilih Simpan.

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
01d

( klik untuk memperbesar )


e. Setelah fungsi Lambda Anda dibuat, gulir ke bagian atas jendela dan perhatikan Amazon Resource Name (ARN) fungsi di sudut kanan atas halaman. Amazon Resource Names (ARN) secara unik mengidentifikasi sumber daya AWS, dan membantu melacak dan menggunakan berbagai item dan kebijakan AWS di seluruh layanan AWS dan panggilan API. Kita memerlukan ARN saat Anda perlu mereferensikan sumber daya tertentu dari Step Functions.

01e
01e

( klik untuk memperbesar )


Langkah 2. Buat Peran AWS Identity and Access Management (IAM)

AWS Step Functions dapat menjalankan kode dan mengakses sumber daya AWS lainnya (misal, data yang disimpan dalam bucket Amazon S3). Untuk mempertahankan keamanan, Anda harus memberi Step Functions akses ke sumber daya ini menggunakan AWS Identity and Access Management (IAM).


a. Di jendela browser lainnya, navigasikan ke AWS Management Console dan ketik IAM di bilah pencarian. Klik IAM untuk membuka konsol layanan.

02a
02a

( klik untuk memperbesar )


b. Klik Peran, lalu pilih Buat Peran.

02b
02b

( klik untuk memperbesar )


c. Pada halaman Pilih jenis entitas tepercaya, di bawah layanan AWS, pilih Step Functions dari daftar, kemudian Berikutnya: Izin.

02c
02c

( klik untuk memperbesar )


d. Pada halaman Lampirkan kebijakan izin, pilih Berikutnya: Tinjau.

 

02d
02d

( klik untuk memperbesar )


e. Pada halaman Tinjau, ketik step_functions_basic_execution untuk Nama peran dan klik Buat peran.

02e
02e

( klik untuk memperbesar )


f. Peran IAM baru Anda dibuat dan muncul dalam daftar di balik peran IAM untuk fungsi Lambda Anda.

02f
02f

( klik untuk memperbesar )


Langkah 3. Buat Mesin Status Step Functions

Sekarang setelah Anda membuat fungsi Lambda sederhana yang meniru respons API, Anda dapat membuat mesin status Step Functions untuk memanggil API dan menangani pengecualian.

Dalam langkah ini, Anda akan menggunakan konsol Step Functions untuk membuat mesin status yang menggunakan status Tugas dengan bidang Coba Ulang dan Ambil untuk menangani berbagai kode respons API. Anda akan menggunakan status Tugas untuk meminta fungsi API Lambda Anda, yang akan menghasilkan kode status API yang Anda berikan sebagai input ke mesin status Anda.


a. Buka konsol AWS Step Functions. Pada halaman Buat mesin status, pilih Tulis dari awal. Dalam bagian Detail, beri nama untuk mesin status Anda MyAPIStateMachine, kemudian pilih Saya akan menggunakan peran yang sudah ada.

03c
03c

( klik untuk memperbesar )


b. Berikutnya, Anda akan merancang mesin status yang akan mengambil tindakan berbeda, tergantung respons dari mock API Anda. Jika API tidak dapat dijangkau, alur kerja akan mencoba kembali. Percobaan ulang adalah cara yang berguna untuk mengatasi kesalahan yang bersifat sementara. Alur kerja ini juga akan mengambil pengecualian berbeda yang dihasilkan oleh mock API.

Ganti konten Definisi mesin status dengan kode berikut:

{
  "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
03d

( klik untuk memperbesar )


c. Temukan baris “Sumber Daya” di status Tugas “Panggil API” (baris 7). Untuk memperbarui ARN ini ke ARN fungsi mock API Lambda yang baru Anda buat, klik pada teks ARN kemudian pilih ARN dari daftar.

03e
03e

( klik untuk memperbesar )


d. Klik tombol segarkan di samping panel alur kerja visual untuk membuat Step Functions membuat diagram mesin status yang sesuai dengan alur kerja yang baru saja Anda rancang. Setelah meninjau alur kerja visual, klik Buat mesin status.

03f
03f

( klik untuk memperbesar )


Langkah 4. Uji Alur Kerja Penanganan Kesalahan Anda

Untuk menguji alur kerja penanganan kesalahan, Anda akan meminta mesin status memanggil mock API Anda dengan memberikan kode kesalahan sebagai input.


a. Klik Mulai eksekusi.

04a
04a

( klik untuk memperbesar )


b. Kotak dialog eksekusi baru akan muncul, tempat Anda dapat memasukkan input untuk mesin status Anda. Anda akan memainkan peran API, dan menyuplai kode kesalahan yang ingin dihasilkan oleh mock API. Ganti teks yang sudah ada dengan kode di bawah, kemudian pilih Mulai eksekusi:

{
    "statuscode": "200"
}
04b
04b

( klik untuk memperbesar )


c. Pada layar Detail eksekusi, klik Input untuk melihat input yang Anda berikan pada mesin status. Berikutnya, klik Output untuk melihat eksekusi mesin status Anda. Anda dapat melihat alur kerja yang menginterpretasikan statuscode 200 sebagai panggilan API yang sukses.

04c
04c

( klik untuk memperbesar )


d. Di bawah Alur kerja visual, Anda dapat melihat jalur eksekusi masing-masing eksekusi, yang ditampilkan dengan warna hijau dalam alur kerja. Klik pada status Tugas "Panggil API", kemudian perluas bidang Input dan Output di layar Detail langkah.

Anda dapat melihat bahwa status Tugas ini berhasil meminta fungsi mock API Lambda Anda dengan input yang Anda berikan, dan mengambil output fungsi Lambda tersebut, “200 OK”.

04d
04d

( klik untuk memperbesar )


e. Berikutnya, klik pada status Tugas “OK” di alur kerja visual. Di bawah Detail langkah Anda dapat melihat bahwa output langkah sebelumnya (status Tugas Panggil API) telah diteruskan sebagai input ke langkah ini. Status OK adalah status Teruskan, yang cukup meneruskan inputnya ke outputnya, tanpa melakukan apa pun. Status Teruskan berguna saat membangun dan melakukan debug pada mesin status.

04e
04e

( klik untuk memperbesar )


Langkah 5. Periksa Eksekusi Mesin Status Anda


a. Gulir ke bagian atas layar Detail eksekusi dan klik pada MyAPIStateMachine.

05a
05a

( klik untuk memperbesar )


b. Klik pada Mulai eksekusi lagi, dan kali ini berikan input berikut, kemudian klik Mulai eksekusi.

{
    "statuscode": "503"
}
05b
05b

( klik untuk memperbesar )


c. Dalam bagian Riwayat kejadian eksekusi, perluas setiap langkah eksekusi untuk mengonfirmasi bahwa alur kerja Anda berperilaku seperti seharusnya Besar kemungkinkan eksekusi ini akan gagal, jadi jangan kaget! Anda akan menyadari bahwa:

  1. Step Functions mengambil Input Anda
  2. Input tersebut diteruskan ke Status Tugas Panggil API
  3. Status Tugas Panggil API memanggil MockAPIFunction Anda menggunakan input tersebut
  4. MockAPIFunction dijalankan
  5. MockAPIFunction gagal dengan ServerUnavailableException
  6. Pernyataan ambil dalam status Tugas Panggil API Anda mengambil pengecualian tersebut.
  7. Pernyataan ambil menggagalkan alur kerja
  8. Mesin status Anda menyelesaikan eksekusinya
05c
05c

( klik untuk memperbesar )


d. Berikutnya, Anda akan menyimulasikan pengecualian 429. Gulir ke bagian atas layar Detail eksekusi dan klik pada MyAPIStateMachine. Klik pada Mulai eksekusi, berikan input berikut, dan klik Mulai eksekusi:

{
    "statuscode": "429"
}
05d
05d

( klik untuk memperbesar )


e. Sekarang, Anda akan memeriksa perilaku coba ulang alur kerja Anda. Dalam bagian Riwayat kejadian eksekusi, perluas setiap langkah eksekusi sekali lagi untuk mengonfirmasikan bahwa Step Functions mencoba memanggil fungsi MockAPILambda dua kali lagi, dan keduanya gagal. Pada tahap tersebut, alur kerja Anda bertransisi ke status Tunggu dan Coba Nanti (ditampilkan dalam gambar di sebelah kanan), dengan harapan bahwa API hanya tidak merespons sementara.

Berikutnya, status Tunggu menggunakan paksaan untuk mengubah kode respons ke 200, dan alur kerja Anda berhasil menyelesaikan eksekusi. Mungkin bukan begitu cara Anda menangani pengecualian 429 dalam aplikasi sesungguhnya, tetapi kami berusaha menyederhanakannya untuk kebutuhan tutorial ini.

05e
05e

( klik untuk memperbesar )


f. Jalankan satu lagi instans alur kerja Anda, dan kali ini, berikan respons API acak yang tidak ditangani oleh mesin status Anda:

{
    "statuscode": "999"
}

Periksa eksekusi lagi menggunakan Riwayat kejadian eksekusi. Setelah selesai, klik pada MyAPIStateMachine sekali lagi. Di panel Eksekusi, Anda akan melihat riwayat semua pengecualian dalam alur kerja Anda, dan melangkah ke dalam masing-masing sesuka Anda.

05f
05f

( klik untuk memperbesar )


Langkah 6. Hentikan Sumber Daya Anda

Dalam langkah ini, Anda akan menghentikan sumber daya yang terkait dengan AWS Step Functions dan AWS Lambda.

Penting: Menghentikan sumber daya yang tidak digunakan secara aktif mengurangi biaya dan merupakan praktik terbaik. Tidak menghentikan sumber daya Anda akan menimbulkan biaya.


a. Di bagian atas jendela konsol AWS Step Functions, klik pada Mesin status.

06a
06a

( klik untuk memperbesar )


b. Di jendela Mesin status, klik pada MyAPIStateMachine dan pilih Hapus. Konfirmasikan tindakan dengan memilih Hapus mesin status di kotak dialog. Mesin status Anda akan dihapus dalam beberapa menit setelah Step Functions mengonfirmasi bahwa setiap proses eksekusi telah selesai.

06b
06b

( klik untuk memperbesar )


c. Berikutnya, Anda akan menghapus fungsi Lambda. Klik Layanan dalam menu AWS Management Console, kemudian pilih Lambda.

06c
06c

( klik untuk memperbesar )


d. Di layar Fungsi, klik pada MockAPIFunction, pilih Tindakan,kemudian Hapus. Konfirmasikan penghapusan dengan mengeklik Hapus lagi.

06d
06d

( klik untuk memperbesar )


e. Terakhir, Anda akan menghapus peran IAM Anda. Klik Layanan dalam menu AWS Management Console, kemudian pilih IAM.

06e
06e

( klik untuk memperbesar )


f. Pilih kedua peran IAM yang Anda buat untuk tutorial ini, kemudian klik Hapus peran. Konfirmasikan penghapusan dengan mengeklik Ya, Hapus pada kotak dialog.


Kini Anda dapat keluar dari AWS Management Console.

06f
06f

( klik untuk memperbesar )


Selamat!

Anda telah menggunakan AWS Step Functions dan AWS Lambda untuk membuat alur kerja penanganan kesalahan untuk API jaringan. Dengan menggunakan AWS Lambda, Anda dapat menjalankan kode untuk hampir semua jenis aplikasi atau layanan backend – semua tanpa administrasi. Cukup unggah kode Anda dan Lambda menangani segala yang diperlukan untuk menjalankan dan menskalakan kode Anda dengan ketersediaan yang sangat baik.

Menggabungkan AWS Step Functions dengan AWS Lambda memudahkan dalam mengatur fungsi AWS Lambda untuk aplikasi tanpa server. Step Functions memungkinkan Anda mengontrol alur kerja kompleks menggunakan berbagai fungsi Lambda tanpa aplikasi utama yang mengelola dan mengatur status. Anda juga dapat menggunakan Step Functions untuk pengaturan layanan mikro menggunakan sumber daya komputasi seperti Amazon EC2 dan Amazon ECS.