Penanganan kesalahan dalam Step Functions - AWS Step Functions

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Penanganan kesalahan dalam Step Functions

Semua status, kecuali Pass dan Wait status, dapat mengalami kesalahan runtime. Kesalahan dapat terjadi karena berbagai alasan, seperti contoh berikut:

  • Masalah ketentuan mesin status (misalnya, tidak ada aturan yang cocok dalam status Choice)

  • Kegagalan tugas (misalnya, pengecualian dalam suatu AWS Lambda fungsi)

  • Masalah transien (misalnya, peristiwa partisi jaringan)

Secara default, ketika keadaan melaporkan kesalahan, AWS Step Functions menyebabkan eksekusi gagal sepenuhnya.

Tip

Untuk menerapkan contoh alur kerja yang menyertakan penanganan kesalahan ke AndaAkun AWS, lihat Modul 8 - Penanganan Kesalahan Lokakarya. AWS Step Functions

Nama kesalahan

Step Functions mengidentifikasi kesalahan dalam Bahasa Status Amazon menggunakan string peka huruf besar-kecil, yang dikenal sebagai nama kesalahan. Bahasa Status Amazon menentukan satu set string built-in yang menamai kesalahan terkenal, semua dimulai dengan prefiks States..

States.ALL

Sebuah wildcard yang cocok dengan nama kesalahan yang dikenal.

catatan

Jenis kesalahan ini tidak dapat menangkap jenis kesalahan States.DataLimitExceeded terminal dan jenis kesalahan runtime. Untuk informasi selengkapnya tentang jenis kesalahan ini, lihat States.DataLimitExceededdan States.Runtime.

States.DataLimitExceeded

Step Functions melaporkan States.DataLimitExceeded pengecualian dalam kondisi berikut:

  • Ketika output konektor lebih besar dari kuota ukuran muatan.

  • Ketika output status lebih besar dari kuota ukuran muatan.

  • Ketika, setelah pengolahan Parameters, input status lebih besar dari kuota ukuran muatan.

Untuk informasi lebih lanjut tentang kuota, lihat Kuota.

catatan

Ini adalah kesalahan terminal yang tidak dapat ditangkap oleh jenis States.ALL kesalahan.

States.ExceedToleratedFailureThreshold

MapStatus gagal karena jumlah item yang gagal melebihi ambang batas yang ditentukan dalam definisi mesin status. Untuk informasi selengkapnya, lihat Ambang kegagalan yang ditoleransi untuk status Peta Terdistribusi.

States.HeartbeatTimeout

Sebuah Task negara gagal mengirim detak jantung untuk jangka waktu yang lebih lama dari HeartbeatSeconds nilainya.

catatan

Kesalahan ini hanya tersedia di dalam Catch dan Retry bidang.

States.IntrinsicFailure

Upaya untuk menjalankan fungsi intrinsik dalam template payload gagal.

States.ItemReaderFailed

MapStatus gagal karena tidak dapat membaca dari sumber item yang ditentukan di ItemReader bidang. Untuk informasi selengkapnya, lihat ItemReader.

States.NoChoiceMatched

ChoiceStatus gagal mencocokkan input dengan kondisi yang ditentukan dalam Aturan Pilihan dan transisi Default tidak ditentukan.

States.ParameterPathFailure

Upaya untuk mengganti bidang, dalam Parameters bidang status, yang namanya berakhir .$ dengan menggunakan jalur gagal.

States.Permissions

TaskStatus gagal karena memiliki hak istimewa yang tidak memadai untuk menjalankan kode yang ditentukan.

States.ResultPathMatchFailure

Step Functions gagal menerapkan ResultPath bidang status ke input status yang diterima.

States.ResultWriterFailed

MapStatus gagal karena tidak dapat menulis hasil ke tujuan yang ditentukan di ResultWriter bidang. Untuk informasi selengkapnya, lihat ResultWriter.

States.Runtime

Eksekusi gagal karena beberapa pengecualian yang tidak dapat diproses. Sering kali ini disebabkan oleh kesalahan saat waktu aktif, seperti mencoba untuk menerapkan InputPath atau OutputPath pada muatan JSON null. States.RuntimeKesalahan tidak dapat diambil kembali, dan akan selalu menyebabkan eksekusi gagal. Sebuah retry atau catch on States.ALL won't catch States.Runtime error.

States.TaskFailed

Status Task gagal selama eksekusi. Ketika digunakan dalam coba lagi atau menangkap, States.TaskFailed bertindak sebagai wildcard yang cocok dengan nama kesalahan yang diketahui kecuali untuk States.Timeout.

States.Timeout

Status Task berjalan lebih lama daripada nilai TimeoutSeconds, atau gagal untuk mengirim detak jantung untuk jangka waktu lebih lama dari nilai HeartbeatSeconds.

Selain itu, jika mesin status berjalan lebih lama dari TimeoutSeconds nilai yang ditentukan, eksekusi gagal dengan States.Timeout kesalahan.

Status dapat melaporkan kesalahan dengan nama lain. Namun, nama kesalahan ini tidak dapat dimulai dengan States. awalan.

Sebagai praktik terbaik, pastikan kode produksi dapat menangani pengecualian layanan AWS Lambda (Lambda.ServiceException dan Lambda.SdkClientException). Untuk informasi selengkapnya, lihat Menangani pengecualian layanan Lambda.

catatan

Kesalahan tidak tertangani di Lambda dilaporkan sebagai Lambda.Unknown dalam output kesalahan. Ini termasuk out-of-memory kesalahan dan batas waktu fungsi. Anda dapat mencocokkan di Lambda.Unknown, States.ALL, atau States.TaskFailed untuk menangani kesalahan ini. Ketika Lambda mencapai jumlah maksimum permintaan, kesalahannya adalah Lambda.TooManyRequestsException. Untuk informasi selengkapnya tentang kesalahan fungsi Lambda, lihat Penanganan kesalahan dan percobaan ulang otomatis di Panduan PengembangAWS Lambda.

Mencoba kembali setelah kesalahan

Task,Parallel, dan Map status dapat memiliki bidang bernamaRetry, yang nilainya harus berupa array objek yang dikenal sebagai retrier. Pencoba ulang individu mewakili sejumlah percobaan kembali, biasanya pada interval waktu yang meningkat.

Ketika salah satu status ini melaporkan kesalahan dan ada Retry bidang, Step Functions memindai melalui retrier dalam urutan yang tercantum dalam array. Ketika nama kesalahan muncul di nilai ErrorEquals bidang retrier, mesin status melakukan upaya coba lagi seperti yang didefinisikan di Retry bidang.

Jika redriven eksekusi Anda menjalankan ulang statusStatus tugas,Paralel, atau Peta Sebaris, yang telah Anda tetapkan percobaan ulang, jumlah upaya coba lagi untuk status ini diatur ulang ke 0 untuk memungkinkan jumlah upaya maksimum. redrive Untuk redriven eksekusi, Anda dapat melacak upaya percobaan ulang individual dari status ini menggunakan konsol. Untuk informasi selengkapnya, lihat Coba lagi perilaku eksekusi redriven di Redrivingeksekusi.

Retrier berisi bidang-bidang berikut:

catatan

Percobaan ulang diperlakukan sebagai transisi status. Untuk informasi tentang cara transisi status mempengaruhi penagihan, lihat Harga Step Functions.

ErrorEquals (Wajib)

Sebuah array string nonkosong yang cocok dengan nama kesalahan. Ketika status melaporkan kesalahan, Step Functions memindai melalui retrier. Ketika nama kesalahan muncul dalam array ini, array menerapkan kebijakan coba lagi yang dijelaskan dalam retier ini.

IntervalSeconds (Opsional)

Sebuah bilangan bulat positif yang mewakili jumlah detik sebelum percobaan ulang pertama (secara 1 default). IntervalSecondsmemiliki nilai maksimum 99999999.

MaxAttempts (Opsional)

Sebuah bilangan bulat positif yang mewakili jumlah maksimum percobaan coba lagi (3 secara default). Jika kesalahan berulang kali lebih dari yang ditentukan, percobaan ulang berhenti dan penanganan kesalahan normal dilanjutkan. Nilai 0 menentukan bahwa kesalahan tidak pernah dicoba lagi. MaxAttemptsmemiliki nilai maksimum 99999999.

BackoffRate (Opsional)

Pengganda dimana interval coba lagi dilambangkan dengan IntervalSeconds peningkatan setelah setiap upaya coba lagi. Secara default, BackoffRate nilainya meningkat sebesar2.0.

Misalnya, katakanlah Anda IntervalSeconds adalah 3, MaxAttempts adalah 3, dan BackoffRate 2. Upaya coba lagi pertama dilakukan tiga detik setelah kesalahan terjadi. Percobaan kedua berlangsung enam detik setelah upaya coba lagi pertama. Sedangkan percobaan ulang ketiga berlangsung 12 detik setelah upaya coba lagi kedua.

MaxDelaySeconds (Opsional)

Bilangan bulat positif yang menetapkan nilai maksimum, dalam hitungan detik, hingga interval coba lagi dapat meningkat. Bidang ini berguna untuk digunakan dengan BackoffRate bidang. Nilai yang Anda tentukan di bidang ini membatasi waktu tunggu eksponensial yang dihasilkan dari pengganda tingkat backoff yang diterapkan pada setiap upaya percobaan ulang berturut-turut. Anda harus menentukan nilai yang lebih besar dari 0 dan kurang dari 31622401 untuk. MaxDelaySeconds

Jika Anda tidak menentukan nilai ini, Step Functions tidak membatasi waktu tunggu antara percobaan ulang.

JitterStrategy (Opsional)

String yang menentukan apakah akan menyertakan jitter dalam waktu tunggu antara upaya coba lagi berturut-turut. Jitter mengurangi upaya percobaan ulang simultan dengan menyebarkannya melalui interval penundaan acak. String ini menerima FULL atau NONE sebagai nilainya. Nilai bawaannya adalah NONE.

Misalnya, Anda telah menetapkan MaxAttempts sebagai 3, IntervalSeconds sebagai 2, dan BackoffRate sebagai 2. Upaya coba lagi pertama dilakukan dua detik setelah kesalahan terjadi. Percobaan kedua berlangsung empat detik setelah percobaan ulang pertama dan percobaan ulang ketiga berlangsung delapan detik setelah upaya coba lagi kedua. Jika Anda menetapkan JitterStrategy sebagaiFULL, interval coba ulang pertama diacak antara 0 dan 2 detik, interval coba lagi kedua diacak antara 0 dan 4 detik, dan interval coba ulang ketiga diacak antara 0 dan 8 detik.

Coba lagi contoh bidang

Bagian ini mencakup contoh Retry bidang berikut.

Tip

Untuk menerapkan contoh alur kerja penanganan kesalahan ke AndaAkun AWS, lihat modul Penanganan Kesalahan dari Lokakarya. AWS Step Functions

Contoh 1 — Coba lagi dengan BackoffRate

Contoh berikut ini Retry membuat dua percobaan lagi dengan percobaan ulang pertama terjadi setelah menunggu selama tiga detik. Berdasarkan yang BackoffRate Anda tentukan, Step Functions meningkatkan interval antara setiap percobaan ulang hingga jumlah maksimum percobaan ulang tercapai. Dalam contoh berikut, upaya coba lagi kedua dimulai setelah menunggu selama tiga detik setelah percobaan ulang pertama.

"Retry": [ { "ErrorEquals": [ "States.Timeout" ], "IntervalSeconds": 3, "MaxAttempts": 2, "BackoffRate": 1 } ]
Contoh 2 — Coba lagi dengan MaxDelaySeconds

Contoh berikut membuat tiga upaya coba lagi dan membatasi waktu tunggu yang dihasilkan dari BackoffRate 5 detik. Coba lagi pertama dilakukan setelah menunggu selama tiga detik. Upaya coba lagi kedua dan ketiga terjadi setelah menunggu selama lima detik setelah upaya coba lagi sebelumnya karena batas waktu tunggu maksimum yang ditetapkan oleh. MaxDelaySeconds

"Retry": [ { "ErrorEquals": [ "States.Timeout" ], "IntervalSeconds": 3, "MaxAttempts": 3, "BackoffRate":2, "MaxDelaySeconds": 5, "JitterStrategy": "FULL" } ]

TanpaMaxDelaySeconds, upaya coba lagi kedua akan berlangsung enam detik setelah percobaan ulang pertama, dan upaya coba lagi ketiga akan berlangsung 12 detik setelah percobaan ulang kedua.

Contoh 3 - Coba lagi semua kesalahan kecuali States.Timeout

Nama terpesan States.ALL yang muncul di bidang ErrorEquals adalah wildcard yang cocok dengan setiap nama kesalahan. Ini harus muncul sendirian di array ErrorEquals dan harus muncul dalam retrier terakhir di array Retry. Nama States.TaskFailed juga bertindak wildcard dan cocok dengan kesalahan kecuali untukStates.Timeout.

Contoh Retry bidang berikut mencoba ulang kesalahan apa pun kecualiStates.Timeout.

"Retry": [ { "ErrorEquals": [ "States.Timeout" ], "MaxAttempts": 0 }, { "ErrorEquals": [ "States.ALL" ] } ]
Contoh 4 - Skenario coba lagi yang kompleks

Parameter retrier A ini berlaku di semua kunjungan ke retrier dalam konteks eksekusi status tunggal.

Pertimbangkan status Task berikut.

"X": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:task:X", "Next": "Y", "Retry": [ { "ErrorEquals": [ "ErrorA", "ErrorB" ], "IntervalSeconds": 1, "BackoffRate": 2.0, "MaxAttempts": 2 }, { "ErrorEquals": [ "ErrorC" ], "IntervalSeconds": 5 } ], "Catch": [ { "ErrorEquals": [ "States.ALL" ], "Next": "Z" } ] }

Tugas ini gagal empat kali berturut-turut, mengeluarkan nama kesalahan ini:ErrorA,, ErrorBErrorC, dan. ErrorB Berikut ini terjadi sebagai hasilnya:

  • Dua kesalahan pertama cocok dengan retrier pertama dan menyebabkan menunggu satu dan dua detik.

  • Kesalahan ketiga cocok dengan retrier kedua dan menyebabkan menunggu lima detik.

  • Kesalahan keempat juga cocok dengan retrier pertama. Namun, itu sudah mencapai maksimum dua percobaan ulang (MaxAttempts) untuk kesalahan tertentu. Oleh karena itu, retrier itu gagal dan eksekusi mengalihkan alur kerja ke Z status melalui bidang. Catch

Status fallback

Task, Map dan Parallel negara masing-masing dapat memiliki bidang bernamaCatch. Nilai bidang ini harus berupa array obyek, yang dikenal sebagai penangkap.

Penangkap berisi bidang berikut.

ErrorEquals (Wajib)

Sebuah array string non-kosong yang cocok dengan nama kesalahan, ditentukan persis seperti mereka dengan bidang retrier dengan nama yang sama.

Next (Wajib)

Sebuah string yang harus sama persis dengan salah satu nama status mesin status.

ResultPath (Opsional)

Jalur yang menentukan input apa yang dikirimkan oleh penangkap ke status yang ditentukan di Next bidang.

Ketika status melaporkan kesalahan dan tidak ada bidang Retry, atau jika mencoba ulang gagal untuk menyelesaikan kesalahan, Step Functions memindai penangkap dalam urutan yang tercantum dalam array. Ketika nama kesalahan muncul dalam nilai bidang ErrorEquals penangkap, mesin status bertransisi ke status bernama dalam bidang Next.

Nama terpesan States.ALL yang muncul di bidang ErrorEquals penangkap adalah wildcard yang cocok dengan nama kesalahan. Ini harus muncul sendirian di array ErrorEquals dan harus muncul di penangkap terakhir di array Catch. Nama States.TaskFailed juga bertindak wildcard dan cocok dengan kesalahan kecuali untuk States.Timeout.

Contoh berikut dari bidang transisi Catch ke status bernama RecoveryState ketika fungsi Lambda meng-output pengecualian Java yang tidak tertangani. Jika tidak, bidang bertransisi ke status EndState.

"Catch": [ { "ErrorEquals": [ "java.lang.Exception" ], "ResultPath": "$.error-info", "Next": "RecoveryState" }, { "ErrorEquals": [ "States.ALL" ], "Next": "EndState" } ]
catatan

Setiap penangkap dapat menentukan beberapa kesalahan untuk menangani.

Output kesalahan

Ketika Step Functions bertransisi ke status yang ditentukan dalam nama penangkapan, objek biasanya berisi bidang Cause. Nilai bidang ini adalah deskripsi yang dapat dibaca manusia dari kesalahan. Objek ini dikenal sebagai output kesalahan.

Dalam contoh ini, penangkap pertama berisi bidang ResultPath. Ini bekerja sama dengan ResultPath di tingkat atas status, menghasilkan dua kemungkinan:

  • Dibutuhkan hasil eksekusi negara itu dan menimpa semua, atau sebagian, masukan negara.

  • Dibutuhkan hasil dan menambahkannya ke input. Dalam kasus kesalahan yang ditangani oleh penangkap, hasil eksekusi status adalah output kesalahan.

Jadi, untuk penangkap pertama dalam contoh, penangkap menambahkan output kesalahan ke input sebagai bidang bernama error-info jika belum ada bidang dengan nama ini di input. Kemudian, penangkap mengirimkan seluruh input keRecoveryState. Untuk penangkap kedua, output kesalahan menimpa input dan penangkap hanya mengirimkan output kesalahan ke. EndState

catatan

Jika Anda tidak menentukan bidang ResultPath, bidang tersebut default ke $, yang memilih dan menimpa seluruh input.

Ketika status memiliki keduanya Retry dan Catch bidang, Step Functions menggunakan retrier yang sesuai terlebih dahulu. Jika kebijakan coba lagi gagal menyelesaikan kesalahan, Step Functions akan menerapkan transisi penangkap yang cocok.

Muatan penyebab dan integrasi layanan

Sebuah penangkap mengembalikan muatan string sebagai output. Ketika bekerja dengan integrasi layanan seperti Amazon Athena atau AWS CodeBuild, Anda mungkin ingin mengonversi string Cause ke JSON. Contoh berikut dari Pass keadaan dengan fungsi intrinsik menunjukkan bagaimana untuk mengkonversi Cause string ke JSON.

"Handle escaped JSON with JSONtoString": { "Type": "Pass", "Parameters": { "Cause.$": "States.StringToJson($.Cause)" }, "Next": "Pass State with Pass Processing" },

Nyatakan contoh mesin menggunakan Coba Ulang dan menggunakan Catch

Mesin-mesin status yang ditentukan dalam contoh berikut memakai dua fungsi Lambda: salah satu yang selalu gagal dan satu yang menunggu cukup lama untuk mengizinkan batas waktu yang ditentukan dalam mesin status terjadi.

Ini adalah definisi dari fungsi Lambda Node.js yang selalu gagal, mengembalikan pesan. error Dalam contoh mesin status yang mengikuti, fungsi Lambda ini bernama FailFunction. Untuk informasi tentang membuat fungsi Lambda, lihat Langkah 1: Membuat fungsi Lambda bagian.

exports.handler = (event, context, callback) => { callback("error"); };

Ini adalah definisi dari fungsi Lambda Node.js yang tidur selama 10 detik. Dalam contoh mesin status yang mengikuti, fungsi Lambda ini bernama sleep10.

catatan

Bila Anda membuat fungsi Lambda ini di konsol Lambda, ingat untuk mengubah nilai Waktu habis dalam bagian Pengaturan lanjutan dari 3 detik (default) hingga 11 detik.

exports.handler = (event, context, callback) => { setTimeout(function(){ }, 11000); };

Menangani kegagalan menggunakan Coba Lagi

Mesin status ini menggunakan Retry untuk mencoba kembali fungsi yang gagal dan output nama kesalahan HandledError. Ini mencoba ulang fungsi ini dua kali dengan backoff eksponensial antara percobaan ulang.

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction", "Retry": [ { "ErrorEquals": ["HandledError"], "IntervalSeconds": 1, "MaxAttempts": 2, "BackoffRate": 2.0 } ], "End": true } } }

Varian ini menggunakan kode kesalahan yang telah ditentukan States.TaskFailed, yang cocok dengan kesalahan yang fungsi Lambda output.

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction", "Retry": [ { "ErrorEquals": ["States.TaskFailed"], "IntervalSeconds": 1, "MaxAttempts": 2, "BackoffRate": 2.0 } ], "End": true } } }
catatan

Sebagai praktik terbaik, tugas-tugas yang referensi fungsi Lambda harus menangani pengecualian layanan Lambda. Untuk informasi selengkapnya, lihat Menangani pengecualian layanan Lambda.

Menangani kegagalan menggunakan Catch

Contoh ini menggunakan bidang Catch. Ketika fungsi Lambda mengeluarkan kesalahan, ia menangkap kesalahan dan mesin status bertransisi ke status. fallback

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction", "Catch": [ { "ErrorEquals": ["HandledError"], "Next": "fallback" } ], "End": true }, "fallback": { "Type": "Pass", "Result": "Hello, AWS Step Functions!", "End": true } } }

Varian ini menggunakan kode kesalahan yang telah ditetapkan States.TaskFailed, yang cocok dengan kesalahan yang fungsi Lambda output.

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction", "Catch": [ { "ErrorEquals": ["States.TaskFailed"], "Next": "fallback" } ], "End": true }, "fallback": { "Type": "Pass", "Result": "Hello, AWS Step Functions!", "End": true } } }

Menangani batas waktu menggunakan Retry

Mesin status ini menggunakan Retry bidang untuk mencoba kembali Task status yang habis waktu, berdasarkan nilai batas waktu yang ditentukan. TimeoutSeconds Step Functions mencoba ulang pemanggilan fungsi Lambda dalam status Task ini dua kali, dengan backoff eksponensial di antara percobaan ulang.

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:sleep10", "TimeoutSeconds": 2, "Retry": [ { "ErrorEquals": ["States.Timeout"], "IntervalSeconds": 1, "MaxAttempts": 2, "BackoffRate": 2.0 } ], "End": true } } }

Menangani batas waktu menggunakan Catch

Contoh ini menggunakan bidang Catch. Ketika batas waktu terjadi, mesin status bertransisi ke status fallback.

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:sleep10", "TimeoutSeconds": 2, "Catch": [ { "ErrorEquals": ["States.Timeout"], "Next": "fallback" } ], "End": true }, "fallback": { "Type": "Pass", "Result": "Hello, AWS Step Functions!", "End": true } } }
catatan

Anda dapat mempertahankan input status dan kesalahan dengan menggunakan ResultPath. Lihat Gunakan ResultPath untuk Menyertakan Kesalahan dan Input dalam Catch.