AWS Step Functions
개발자 안내서

상태 시스템을 사용하여 오류 조건 처리

이 자습서에서는 Catch 필드를 포함하는 AWS Step Functions 상태 시스템을 만들어 봅니다. 이 필드는 AWS Lambda 함수를 사용하여 오류 메시지 유형인 함수 오류 처리라는 메서드 기반의 조건 논리로 응답합니다. 자세한 내용은 AWS Lambda Developer Guide함수 오류 처리를 참조하십시오.

참고

시간 초과 시 Retry하거나 오류나 시간 초과 발생 시 Catch를 사용하여 특정 상태로 전환되는 상태 시스템도 생성할 수 있습니다. 오류 처리 기술의 예는 Retry 및 Catch 사용 예제를 참조하십시오.

1단계: Lambda용 IAM 역할 만들기

Lambda 및 Step Functions는 모두 코드를 실행하고 AWS 리소스(예: Amazon S3 버킷에 저장된 데이터)에 액세스할 수 있습니다. 보안을 유지하기 위해, 사용자는 이러한 리소스에 대해 Lambda 및 Step Functions 액세스 권한을 부여해야 합니다.

Lambda에서는 Step Functions가 상태 머신을 생성할 때 IAM 역할을 지정하도록 요구하는 것과 동일한 방식으로 Lambda 함수를 생성할 때 IAM 역할을 지정하도록 요구합니다.

Lambda용 역할을 만들려면

  1. IAM 콘솔에 로그인하여 [Roles], [Create role]을 선택합니다.

  2. 신뢰할 수 있는 유형의 엔터티 선택 페이지의 [AWS service]에서 목록의 [Lambda]을 선택한 후 [Next: Permissions]를 선택합니다.

    참고

    Lambda이 역할을 사용할 수 있도록 허용하는 신뢰 관계가 역할에 자동으로 제공됩니다.

  3. [Attach permissions policy] 페이지에서 [Next: Review]를 선택합니다.

  4. [Review] 페이지에서 [Role Name]에 MyLambdaRole를 입력한 다음 [Create role]을 선택합니다.

역할 목록에 IAM 역할이 표시됩니다.

2단계: 실패하는 Lambda 함수 만들기

Lambda 함수를 사용하면 오류 조건을 시뮬레이션할 수 있습니다.

중요

Lambda 함수는 상태 머신과 동일한 AWS 계정과 리전으로 되어 있어야 합니다.

실패하는 Lambda 함수를 만들려면

  1. Lambda 콘솔에 로그인한 후 함수 만들기를 선택합니다.

  2. [Blueprints] 섹션에서 필터에 step-functions를 입력하고 [step-functions-error] 블루프린트를 선택합니다.

  3. Basic information(기본 정보) 섹션에서 Lambda 함수를 구성합니다.

    1. NameFailFunction를 입력합니다.

    2. [Role]에서 [Choose an existing role]을 선택합니다.

    3. Existing role에서 앞에서 생성한 Lambda 역할을 선택합니다.

      참고

      생성한 IAM 역할이 목록에 표시되지 않으면 역할이 Lambda에 전파되도록 몇 분 더 기다려야 할 수 있습니다.

  4. Lambda 함수 코드 창에 다음 코드가 표시됩니다.

    'use strict'; exports.handler = (event, context, callback) => { function CustomError(message) { this.name = 'CustomError'; this.message = message; } CustomError.prototype = new Error(); const error = new CustomError('This is a custom error!'); callback(error); };

    context 객체가 오류 메시지 This is a custom error!를 반환합니다.

  5. [Create function]을 선택합니다.

    Lambda 함수가 생성되면 페이지 오른쪽 위의 Amazon 리소스 이름(ARN)을 적어 둡니다. 예:

    arn:aws:lambda:us-east-1:123456789012:function:FailFunction

3단계: Lambda 함수 테스트

Lambda 함수의 작동 상태를 보기 위해 이를 테스트합니다.

Lambda 함수를 테스트하려면

  1. [FailFunction] 페이지에서 [Test]를 선택합니다.

  2. [Configure test event] 대화 상자에서 [Event name]에 FailFunction을 입력한 후 [Create]를 선택합니다.

  3. FailFunction 페이지에서 Test를 선택하여 Lambda 함수를 테스트합니다.

    테스트(오류 시뮬레이션)의 결과는 페이지 아래쪽에 표시됩니다.

4단계: Catch 필드가 있는 상태 시스템 생성

Step Functions 콘솔을 사용하면 Catch 필드와 함께 Task 상태를 사용하는 상태 시스템을 생성할 수 있습니다. Task 상태의 Lambda 함수에 참조를 추가합니다. Lambda 함수가 호출되어 실행 중에 실패합니다. Step Functions은 재시도들 간의 지수 백오프를 사용하여 함수를 두 배로 재시도합니다.

상태 시스템을 생성하려면

  1. Step Functions 콘솔에 로그인한 후 Create state machine을 선택합니다.

  2. [Create a state machine] 페이지에서 [Templates]를 선택하고 [Catch failure]를 선택합니다.

  3. 상태 시스템에 이름을 지정합니다(예: Catchfailure).

    참고

    상태 머신 이름은 1~80자 길이로 해당 계정과 리전 내에서 고유해야 하며 다음을 포함해서는 안 됩니다.

    • 공백

    • 와일드카드 문자 (? *)

    • 괄호 문자(< > { } [ ])

    • 특수 문자 (: ; , \ | ^ ~ $ # % & ` ")

    • 제어 문자(\\u0000 - \\u001f 또는 \\u007f - \\u009f).

    Step Functions를 통해 비 ASCII 문자를 포함하는 상태 머신, 실행 및 활동 이름을 생성할 수 있습니다. 이러한 비 ASCII 이름은 Amazon CloudWatch에서는 유효하지 않습니다. CloudWatch 지표를 추적할 수 있도록 하려면 ASCII 문자만 사용하는 이름을 선택하십시오.

  4. Code 창에서 앞에서 생성한 Lambda 함수의 ARN을 Resource 필드에 다음과 같이 추가합니다.

    { "Comment": "A Catch example of the Amazon States Language using an AWS Lambda function", "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction", "Catch": [ { "ErrorEquals": ["CustomError"], "Next": "CustomErrorFallback" }, { "ErrorEquals": ["States.TaskFailed"], "Next": "ReservedTypeFallback" }, { "ErrorEquals": ["States.ALL"], "Next": "CatchAllFallback" } ], "End": true }, "CustomErrorFallback": { "Type": "Pass", "Result": "This is a fallback from a custom Lambda function exception", "End": true }, "ReservedTypeFallback": { "Type": "Pass", "Result": "This is a fallback from a reserved error code", "End": true }, "CatchAllFallback": { "Type": "Pass", "Result": "This is a fallback from any error code", "End": true } } }

    이 예는 Amazon States 언어을 사용하는 상태 시스템의 설명입니다. 이 예에서는 CreateAccount라는 하나의 Task 상태를 정의합니다. 자세한 내용은 상태 시스템 구조를 참조하십시오.

    Retry 필드의 구문에 대한 자세한 내용은 오류 발생 후 재시도를 참조하십시오.

    참고

    Lambda에서 처리하지 않은 오류는 오류 출력에 Lambda.Unknown으로 보고됩니다. 여기에는 메모리 부족 오류, 함수 시간 초과 및 동시 Lambda 호출 제한에 도달이 포함됩니다. Lambda.Unknown, States.ALL 또는 States.TaskFailed를 일치시켜 이러한 오류를 처리할 수 있습니다. Lambda HandledUnhandled 오류에 대한 자세한 내용은 AWS Lambda Developer GuideFunctionError를 참조하십시오.

  5. [Visual Workflow] 창에서 그래프를 사용하면 Amazon States 언어 코드가 상태 머신을 올바르게 설명하고 있는지 확인할 수 있습니다.

    그래프가 보이지 않으면 [Visual Workflow] 창에서 
       refresh
    를 선택합니다.

  6. [Next]를 선택합니다.

  7. IAM 역할을 생성하거나 입력합니다.

    • Step Functions에 대한 새 IAM 역할을 생성하려면 [Create a role for me]를 선택한 다음 [I acknowledge that Step Functions will create an IAM role which allows access to my Lambda functions.]를 선택합니다.

    • 이전에 Step Functions에 대한 IAM 역할을 생성한 경우, [I will provide an IAM role ARN]을 선택하고 기존 [IAM role ARN]을 입력합니다.

    참고

    Step Functions가 생성하는 IAM 역할을 삭제하면 Step Functions에서 나중에 이를 다시 생성할 수 없습니다. 마찬가지로, 역할을 수정하면(예: IAM 정책의 보안 주체에서 Step Functions를 제거하여), Step Functions에서 해당 원본 설정을 나중에 복원할 수 없습니다.

  8. 상태 시스템 생성을 선택합니다.

5단계: 새로운 실행 시작

상태 시스템을 생성했으면 실행을 시작할 수 있습니다.

새로운 실행을 시작하려면

  1. [CatchStateMachine] 페이지에서 [New execution]을 선택합니다.

    [New execution] 페이지가 표시됩니다.

  2. (선택 사항) 실행을 쉽게 식별할 수 있도록 실행 이름 입력 상자에 해당 실행의 ID를 지정할 수 있습니다. ID를 입력하지 않는 경우 Step Functions에서 고유한 ID를 자동으로 생성합니다.

    참고

    Step Functions를 통해 비 ASCII 문자를 포함하는 상태 머신, 실행 및 활동 이름을 생성할 수 있습니다. 이러한 비 ASCII 이름은 Amazon CloudWatch에서는 유효하지 않습니다. CloudWatch 지표를 추적할 수 있도록 하려면 ASCII 문자만 사용하는 이름을 선택하십시오.

  3. [Start Execution]을 선택합니다.

    상태 시스템의 새로운 실행이 시작되고 실행 중인 실행을 보여주는 새로운 페이지가 표시됩니다.

  4. 실행 세부 정보 섹션에서 출력 섹션을 확장하여 워크플로의 출력을 봅니다.

    
                            실행 결과
  5. 사용자 지정 오류 시스템을 보려면 시각적 워크플로에서 CreateAccount를 선택하고 출력 섹션을 확장합니다.

    
                            오류 출력

    참고

    ResultPath를 사용하여 오류와 함께 상태 입력을 보존할 수 있습니다. ResultPath를 사용하여 Catch의 오류 및 입력을 포함합니다 단원을 참조하십시오.