Step Functions 오류 처리 - AWS Step Functions

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Step Functions 오류 처리

어떤 상태에서든 런타임 오류가 발생할 수 있습니다. 오류는 다음과 같은 다양한 원인으로 발생할 수 있습니다.

  • 상태 머신 정의 문제(예: Choice 상태에 일치하는 규칙 없음)

  • 작업 실패 (예: Lambda 함수에서 예외 발생)

  • 일시적인 문제(예: 네트워크 파티션 이벤트)

기본적으로, 상태가 오류를 보고하는 경우 AWS Step Functions에서 실행에 전체적으로 오류를 발생시킵니다.

오류 이름

Step Functions Functions는 다음과 같이 대소문자를 구분하는 문자열을 사용하여 아마존 미국 언어의 오류를 식별합니다.오류 이름. Amazon States 언어는 잘 알려진 오류의 이름을 지정하는 기본 제공 문자열의 집합을 정의하며, 모든 문자열은States.접두사.

States.ALL

확인된 오류 이름과 일치하는 와일드카드.

참고

이 오류 catchStates.DataLimitExceeded터미널 오류 유형 및 런타임 오류 유형입니다. 이러한 오류 유형에 대한 자세한 내용은 단원을 참조하세요.States.DataLimitExceededStates.Runtime.

States.BranchFailed

의 한 지점Parallel상태가 실패했습니다.

States.DataLimitExceeded

AStates.DataLimitExceeded다음과 같은 경우 예외가 발생합니다.

  • 커넥터의 출력이 페이로드 크기 할당량보다 큰 경우

  • 상태의 출력이 페이로드 크기 할당량보다 큰 경우

  • 언제, 이후Parameters처리 중인 경우 상태 입력이 페이로드 크기 할당량보다 큽니다.

할당량에 대한 자세한 내용은 단원을 참조하세요.할당량.

참고

이 오류는 다음에 의해 포착될 수 없는 터미널 오류입니다.States.ALL오류 유형

States.HeartbeatTimeout

ATask상태보다 오랜 시간 동안 하트비트를 보내지 못했습니다.HeartbeatSecondsUSD 상당.

참고

이 오류는CatchRetry필드.

States.IntrinsicFailure

이 오류는 페이로드 템플릿 내에서 내장 함수를 호출하려는 시도가 실패할 때 발생합니다.

States.NoChoiceMatched

이 런타임 오류는Choicestate가 입력을 선택 규칙에 정의된 조건과 일치하지 않으며 기본값 변환이 지정되지 않았습니다.

States.ParameterPathFailure

이 오류는 주 내에서 발생합니다.Parameters필드, 이름이 로 끝나는 필드를 대치하려는 시도.$경로 사용이 실패합니다.

States.Permissions

지정된 코드를 실행하기에 충분한 권한이 없어 Task 상태에 오류가 발생했습니다.

States.ResultPathMatchFailure

상태ResultPath상태가 수신한 입력에는 field를 적용할 수 없습니다.

States.Runtime

처리할 수 없는 일부 예외로 인해 실행이 실패했습니다. 이러한 문제는 런타임 시 null JSON 페이로드에 InputPath 또는 OutputPath의 적용을 시도하는 등의 오류로 발생하는 경우가 많습니다. States.Runtime 오류는 검색할 수 없으며 이 오류로 인해 실행이 항상 실패합니다. States.Runtime에서 Retry 또는 Catch를 사용해도 States.ALL오류를 포착하지 못합니다.

States.TaskFailed

실행 중에 Task 상태에 오류가 발생했습니다. 재시도 또는 catch에서 사용되는 경우States.TaskFailed을 제외한 확인된 오류 이름과 일치하는 와일드카드 역할을 합니다.States.Timeout.

States.Timeout

Task 상태가 TimeoutSeconds 값보다 오랜 시간을 실행했거나 HeartbeatSeconds 값보다 오랜 시간 동안 하트비트를 보내지 못했습니다.

상태는 다른 이름으로 오류를 보고할 수 있습니다. 단, 해당 이름은 States. 접두사로 시작하지 않아야 합니다.

가장 좋은 방법은 프로덕션 코드가 AWS Lambda 서비스 예외 (Lambda.ServiceExceptionLambda.SdkClientException)를 처리하는지 확인하는 것입니다. 자세한 정보는 Lambda 서비스 예외 처리을 참조하세요.

참고

Lambda에서 처리되지 않은 오류는 다음과 같이 보고됩니다.Lambda.Unknown오류 출력에. 다음이 포함됩니다. out-of-memory 오류 및 함수 타임아웃이 있습니다. Lambda.Unknown, States.ALL 또는 States.TaskFailed를 일치시켜 이러한 오류를 처리할 수 있습니다. Lambda가 최대 호출 수에 이르면 오류는 다음과 같습니다.Lambda.TooManyRequestsException. Lambda 함수 오류에 대한 자세한 내용은 단원을 참조하세요.오류 처리 및 자동 재시도AWS Lambda개발자 안내서.

오류 후 재시도

TaskParallel 상태에 Retry라는 이름의 필드가 있을 수 있습니다. 이 필드의 값은 retriers라는 객체의 어레이여야 합니다. 개별 Retrier는 특정 재시도 횟수를 나타내며, 보통 점점 시간 간격이 증가합니다.

참고

재시도는 상태 변환으로 취급됩니다. 상태 전환이 결제에 미치는 영향에 대한 내용은 단원을 참조하세요.Step Functions.

Retrier에는 다음 필드가 포함됩니다.

ErrorEquals (필수)

오류 이름과 일치하는 문자열 배열(비어 있지 않음). 상태에서 오류를 보고하는 경우 Step Functions 가 Retrier 전체를 검색합니다. 오류 이름이 이 어레이에 표시되면, 이 Retrier에 설명된 재시도 정책이 실행됩니다.

IntervalSeconds(선택 사항)

첫 번째로 재시도하기 전에 기다리는 시간 (초) 을 나타내는 정수입니다 (1기본 설정).IntervalSeconds최대값은 입니다.99999999.

MaxAttempts(선택 사항)

양수로, 최대 재시도 횟수를 나타냅니다(기본값 3). 지정된 횟수보다 많이 오류가 발생하는 경우 재시도가 중지되고 일반 오류 처리가 다시 시작됩니다. 값0오류를 재시도하지 않음을 나타냅니다.MaxAttempts최대값은 입니다.99999999.

BackoffRate(선택 사항)

재시도 간격이 으로 표시되는 곱입니다.IntervalSeconds시도때마다 증가합니다. 기본 설정은BackoffRate값 증가2.0.

다음 예제는Retry3초 동안 기다린 후 첫 번째 재시도가 수행되고 두 번째 재시도는 4.5초 동안 대기하며 두 번째 재시도는 2회 재시도합니다. 전체 예를 보려면 단원을 참조하십시오.stepfunction-error-handling-examples리포지토리 GitHub.

"Retry": [ { "ErrorEquals": [ "States.Timeout" ], "IntervalSeconds": 3, "MaxAttempts": 2, "BackoffRate": 1.5 } ]

Retrier의 ErrorEquals 필드에 표시되는 예약된 이름 States.ALL은 모든 오류 이름을 나타내는 와일드카드입니다. 이 이름은 ErrorEquals 어레이에 하나만 표시되어야 하며, Retry 어레이의 마지막 Retrier에 표시되어야 합니다. 이름States.TaskFailed또한 와일드카드로 작동하며 다음을 제외한 모든 오류와 일치합니다.States.Timeout.

다음은 States.Timeout을 제외한 모든 오류를 재시도하는 Retry 필드의 예입니다.

"Retry": [ { "ErrorEquals": [ "States.Timeout" ], "MaxAttempts": 0 }, { "ErrorEquals": [ "States.ALL" ] } ]

복잡한 재시도 시나리오

Retrier의 파라미터는 단일 상태 실행의 맥락에서 해당 Retrier에 대한 모든 방문에 적용됩니다.

다음 Task 상태를 고려하십시오.

"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" } ] }

이 작업은 연속해서 4번 실패하며 다음 오류 이름이 출력됩니다.ErrorA,ErrorB,ErrorC, 그리고ErrorB. 결과로 다음이 발생합니다.

  • 첫 번째 2개 오류는 첫 Retrier와 연결되며 1초 및 2초의 대기 시간을 유발합니다.

  • 세 번째 오류는 두 번째 Retrier와 연결되며 5초의 대기 시간을 유발합니다.

  • 네 번째 오류는 첫 Retrier와 일치합니다. 그러나 이미 최대 두 번의 재시도에 도달했습니다 (MaxAttempts) 는 특정 오류에 대해 설명합니다. 따라서 해당 리트리어가 실패하고 실행이Z상태를 통해Catch필드.

폴백 상태

Task,MapParallel상태에는 라는 필드가 있을 수 있습니다.Catch. 이 필드의 값은 catchers라는 객체의 어레이이어야 합니다.

Catcher에는 다음 필드가 포함됩니다.

ErrorEquals (필수)

오류 이름에 연결되는 문자열 배열(비어 있지 않음)로, 동일한 이름의 Retrier 필드와 동일하게 지정됩니다.

Next (필수)

상태 머신의 상태 이름 중 하나와 정확히 일치하는 문자열입니다.

ResultPath(선택 사항)

A통로에 지정된 상태로 보낼 입력을 결정합니다.Next필드.

상태에서 오류를 보고하고 다음 중 하나가 없습니다.Retry필드 또는 재시도를 통해 오류가 해결되지 않으면 Step Functions 가 배열에 나열된 순서대로 Catcher를 스캔합니다. Catcher의 ErrorEquals 필드 값에 오류 이름이 표시되면 상태 머신이 Next 필드에 이름이 지정된 상태로 전환됩니다.

Catcher의 ErrorEquals 필드에 표시되는 예약된 이름 States.ALL은 모든 오류 이름을 나타내는 와일드카드입니다. 이 이름은 ErrorEquals 어레이에 하나만 표시되어야 하며, Catch 어레이의 마지막 Catcher에 표시되어야 합니다. 이름States.TaskFailed또한 와일드카드로 작동하며 다음을 제외한 모든 오류와 일치합니다.States.Timeout.

다음 예제는Catch라는 상태로 필드 전환RecoveryStateLambda 함수가 처리되지 않은 Java 예외를 출력하는 경우 그렇지 않으면 필드가 다음과 같이 EndState 상태로 전환됩니다.

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

각 Catcher는 처리할 오류를 여러 개 지정할 수 있습니다.

오류 출력

Step Functions 가 catch 이름에 지정된 상태로 전환되면 객체에는 일반적으로 필드 가 들어 있습니다.Cause. 이 필드 값은 육안으로 읽을 수 있는 오류 설명입니다. 이 객체를 오류 출력이라고 합니다.

예 예에서 첫 번째 Catcher에는 ResultPath 필드가 들어 있습니다. 이 예는 상태의 최상위에 있는 ResultPath 필드와 유사하게 작동하여 다음과 같은 두 가지 작업을 수행할 수 있습니다.

  • 상태 실행 결과를 가져와 상태 입력 부분(또는 상태 입력 전체)을 덮어씁니다.

  • 결과를 가져와 입력에 추가합니다. Catcher에서 오류를 처리하는 경우, 상태 실행 결과가 오류 출력이 됩니다.

따라서 이 예의 첫 번째 Cather의 경우 오류 출력이 error-info(입력에 해당 이름의 필드가 아직 없다고 가정함)라는 필드로 입력에 추가됩니다. 그런 다음 전체 입력이 RecoveryState.로 전송됩니다. 두 번째 Catcher의 경우, 오류 출력이 입력을 덮어쓰고 오류 출력만 EndState에 전송됩니다.

참고

ResultPath 필드를 지정하지 않으면, 기본값이 $로 설정되며 전체 입력을 선택하여 덮어씁니다.

주에 둘 다 있는 경우RetryCatchWithDynamoDynamoDynamoDynamoDyDynamoDynamoDynamoDynamoDynamoDy

페이로드 및 서비스 통합

catcher는 문자열 페이로드를 출력으로 반환합니다. Amazon Athena Athena와 같은 서비스 통합을 사용하여 작업하는 경우AWS CodeBuild을 변환하고 싶을 수 있습니다.Cause문자열을 JSON으로 변경합니다. 내장 함수가 있는 Pass 상태의 다음 예제에서는 Cause 문자열을 JSON으로 변환하는 방법을 보여 줍니다.

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

재시도를 사용하고 Catch를 사용하는 예제

다음 예에 정의된 상태 머신은 두 개의 Lambda 함수가 있다고 가정합니다. 하나는 항상 오류가 발생하는 함수이고 또 하나는 상태 머신에 정의된 시간 제한이 발생할 수 있도록 충분히 오래 기다리는 함수입니다.

다음은 항상 오류가 발생하는 Node.js Lambda 함수입니다.error. 다음 상태 머신 예에서 이 Lambda 함수의 이름은 으로 지정되어 있습니다.FailFunction. Lambda 함수 생성에 대한 자세한 내용은 단원을 참조하세요.1단계: Lambda 함수 생성섹션.

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

다음은 10초 동안 대기 상태를 유지하는 Node.js Lambda 함수입니다. 다음 상태 머신 예에서 이 Lambda 함수의 이름은 으로 지정되어 있습니다.sleep10.

참고

Lambda 콘솔에서 이 Lambda 함수를 생성할 때Timeout의 값고급 설정섹션은 3초 (기본값) 에서 11초까지입니다.

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

재시도를 사용하여 실패 처리

이 상태 머신은 Retry 필드를 사용하여 실패하고 오류 이름 HandledError를 출력하는 함수를 재시도합니다. 재시도 간 지수 백오프를 사용하여 함수가 두 번 재시도됩니다.

{ "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 } } }

이 변형은 사전 정의된 오류 코드를 사용합니다.States.TaskFailed, 는 Lambda 함수가 출력하는 오류와 일치합니다.

{ "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 } } }
참고

모범 사례로서 Lambda 함수를 참조하는 작업이 Lambda 서비스 예외를 처리하는 것이 좋습니다. 자세한 정보는 Lambda 서비스 예외 처리을 참조하세요.

Catch를 사용하여 실패 처리

이 예제에서는 Catch 필드를 사용합니다. Lambda 함수가 오류를 출력하면, 오류가 인식되고 상태 머신이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 } } }

이 변형은 사전 정의된 오류 코드를 사용합니다.States.TaskFailed, 는 Lambda 함수가 출력하는 오류와 일치합니다.

{ "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 } } }

재시도를 사용하여 시간 초과 처리

이 상태 머신은Retry재시도Task에 지정된 시간 초과 값에 따라 시간 초과되는 상태TimeoutSeconds. 다음과 같이 Lambda 함수를 호출할 수 있습니다.Task상태를 두 번 재시도하며 재시도 간 지수 백오프를 사용합니다.

{ "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 } } }

Catch를 사용하여 시간 초과 처리

이 예제에서는 Catch 필드를 사용합니다. 시간 초과가 발생하면 상태 머신이 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 } } }
참고

ResultPath를 사용하여 상태 입력과 오류를 저장할 수 있습니다. ResultPath를 사용하여 Catch에 오류와 입력 포함을 참조하세요.