자습서: Step Functions에서의 스테이트 머신 실행 검사 - AWS Step Functions

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

자습서: Step Functions에서의 스테이트 머신 실행 검사

이 자습서에서는 실행 세부 정보 페이지에 표시된 실행 정보를 검사하고 실행 실패 원인을 보는 방법을 알아봅니다. 그런 다음 다양한 Map 상태 실행 반복에 액세스하는 방법을 알아봅니다. 마지막으로 테이블 보기에서 열을 구성하고 관심 있는 정보만 표시되도록 적절한 필터를 적용하는 방법을 알아봅니다.

이 자습서에서는 과일 세트 가격을 구하는 표준 유형 상태 시스템을 만듭니다. 이를 위해 스테이트 머신은 과일 네 개의 무작위 목록, 각 과일의 가격, 과일의 평균 비용을 반환하는 세 가지 AWS Lambda 함수를 사용합니다. Lambda 함수는 과일 가격이 임계값보다 작거나 같은 경우 오류가 발생하도록 설계되었습니다.

참고

다음 절차에는 표준 워크플로 실행 세부 정보를 검사하는 방법에 대한 지침이 포함되어 있지만 Express 워크플로 실행 세부 정보도 검사할 수 있습니다. 표준 및 Express 워크플로 유형의 실행 세부 정보 간의 차이점은 Step Functions에서 워크플로우 실행 세부 정보 보기 섹션을 참조하세요.

1단계: 필수 Lambda 함수 만들기 및 테스트

  1. Lambda 콘솔을 열고 1단계: Lambda 함수 생성 섹션의 1~4단계를 수행합니다. Lambda 함수 GetListOfFruits의 이름을 지정해야 합니다.

  2. Lambda 함수를 생성한 후 페이지 오른쪽 상단에 표시된 함수의 Amazon 리소스 이름 ARN () 을 복사합니다. 를 복사하려면 복사 아이콘을 ARN 클릭하여 Lambda 함수의 Amazon 리소스 이름을 복사합니다. 다음은 ARN 예시입니다.함수 이름 Lambda 함수 (이 경우에는) 의 이름입니다. GetListOfFruits

    arn:aws:lambda:us-east-1:123456789012:function:function-name
  3. Lambda 함수의 다음 코드를 페이지의 코드 소스 영역에 복사합니다. GetListOfFruits

    function getRandomSubarray(arr, size) { var shuffled = arr.slice(0), i = arr.length, temp, index; while (i--) { index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(0, size); } exports.handler = async function(event, context) { const fruits = ['Abiu','Açaí','Acerola','Ackee','African cucumber','Apple','Apricot','Avocado','Banana','Bilberry','Blackberry','Blackcurrant','Jostaberry']; const errorChance = 45; const waitTime = Math.floor( 100 * Math.random() ); await new Promise( r => setTimeout(() => r(), waitTime)); const num = Math.floor( 100 * Math.random() ); // const num = 51; if (num <= errorChance) { throw(new Error('Error')); } return getRandomSubarray(fruits, 4); };
  4. 배포를 선택한 다음 테스트를 선택하여 변경 사항을 배포하고 Lambda 함수 출력을 확인합니다.

  5. 다음 단계에 따라 각각 GetFruitPriceCalculateAverage라는 Lambda 함수 2개를 추가로 만듭니다.

    1. 다음 코드를 GetFruitPriceLambda 함수의 코드 소스 영역에 복사합니다.

      exports.handler = async function(event, context) { const errorChance = 0; const waitTime = Math.floor( 100 * Math.random() ); await new Promise( r => setTimeout(() => r(), waitTime)); const num = Math.floor( 100 * Math.random() ); if (num <= errorChance) { throw(new Error('Error')); } return Math.floor(Math.random()*100)/10; };
    2. 다음 코드를 CalculateAverageLambda 함수의 코드 소스 영역에 복사합니다.

      function getRandomSubarray(arr, size) { var shuffled = arr.slice(0), i = arr.length, temp, index; while (i--) { index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(0, size); } const average = arr => arr.reduce( ( p, c ) => p + c, 0 ) / arr.length; exports.handler = async function(event, context) { const errors = [ "Error getting data from DynamoDB", "Error connecting to DynamoDB", "Network error", "MemoryError - Low memory" ] const errorChance = 0; const waitTime = Math.floor( 100 * Math.random() ); await new Promise( r => setTimeout(() => r(), waitTime)); const num = Math.floor( 100 * Math.random() ); if (num <= errorChance) { throw(new Error(getRandomSubarray(errors, 1)[0])); } return average(event); };
    3. 이 두 Lambda 함수를 복사한 다음 배포하고 테스트하십시오. ARNs

2단계: 상태 시스템 만들기 및 실행

Step Functions 콘솔을 사용하여 1단계에서 만든 Lambda 함수를 간접적으로 호출하는 상태 시스템을 만듭니다. 이 상태 시스템에는 Map 상태 3개가 정의되어 있습니다. 각 Map 상태에는 Lambda 함수 중 하나를 간접적으로 호출하는 Task 상태가 포함되어 있습니다. 또한 각 Task 상태에 Retry 필드가 정의되며 상태마다 재시도 횟수가 정의됩니다. Task 상태에서 런타임 오류가 발생하면 해당 Task에 정의된 재시도 횟수까지 다시 실행됩니다.

  1. Step Functions 콘솔을 열고 코드로 워크플로 작성을 선택합니다.

    중요

    상태 머신이 이전에 생성한 Lambda 함수와 동일한 AWS 계정 및 지역에 속하는지 확인하십시오.

  2. 유형의 경우 기본 선택인 표준을 그대로 유지합니다.

  3. 다음 Amazon States Language 정의를 복사하여 정의 아래에 붙여넣습니다. ARNs표시된 내용을 이전에 생성한 Lambda 함수로 바꾸십시오.

    { "StartAt": "LoopOverStores", "States": { "LoopOverStores": { "Type": "Map", "Iterator": { "StartAt": "GetListOfFruits", "States": { "GetListOfFruits": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:GetListofFruits:$LATEST", "Payload": { "storeName.$": "$" } }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 2, "MaxAttempts": 1, "BackoffRate": 1.3 } ], "Next": "LoopOverFruits" }, "LoopOverFruits": { "Type": "Map", "Iterator": { "StartAt": "GetFruitPrice", "States": { "GetFruitPrice": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:GetFruitPrice:$LATEST", "Payload": { "fruitName.$": "$" } }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 2, "MaxAttempts": 3, "BackoffRate": 1.3 } ], "End": true } } }, "ItemsPath": "$", "End": true } } }, "ItemsPath": "$.stores", "Next": "LoopOverStoreFruitsPrice", "ResultPath": "$.storesFruitsPrice" }, "LoopOverStoreFruitsPrice": { "Type": "Map", "End": true, "Iterator": { "StartAt": "CalculateAverage", "States": { "CalculateAverage": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:Calculate-average:$LATEST", "Payload.$": "$" }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 2, "MaxAttempts": 2, "BackoffRate": 1.3 } ], "End": true } } }, "ItemsPath": "$.storesFruitsPrice", "ResultPath": "$.storesPriceAverage", "MaxConcurrency": 1 } } }
  4. 상태 시스템 이름을 입력합니다. 이 페이지의 다른 옵션을 기본 선택 사항으로 유지하고 상태 시스템 생성을 선택합니다.

  5. 제목이 상태 시스템 이름인 페이지를 엽니다. 4단계: 상태 시스템 실행 섹션의 1~4단계를 수행하되 실행 입력으로는 다음 데이터를 사용합니다.

    { "stores": [ "Store A", "Store B", "Store C", "Store D" ] }

3단계: 상태 시스템 실행 세부 정보 보기

제목이 실행 ID인 페이지에서 실행 결과를 검토하고 오류를 디버깅할 수 있습니다.

  1. (선택 사항) 실행 세부 정보 페이지에 표시된 탭 중에서 선택하여 각 탭에 있는 정보를 확인합니다. 예를 들어 상태 시스템 입력과 실행 출력을 보려면 실행 요약 섹션에서 실행 입력 및 출력을 선택합니다.

  2. 상태 시스템 실행이 실패하면 오류 메시지에서 원인 또는 단계 세부 정보 표시를 선택합니다. 오류에 대한 세부 정보는 단계 세부 정보 섹션에 표시됩니다. 오류가 발생한 단계 (Task상태 이름 GetListofFruits) 가 그래프 뷰와 테이블 보기에서 강조 표시되어 있는 것을 알 수 있습니다.

    참고

    GetListofFruits단계가 Map 상태 내에 정의되어 있고 단계가 성공적으로 실행되지 않았으므로 Map상태 단계가 실패로 표시됩니다.

4단계: 다양한 보기 모드 살펴보기

선호하는 모드를 선택하여 상태 시스템 워크플로나 실행 이벤트 내역을 볼 수 있습니다. 이러한 보기 모드에서 수행할 수 있는 일부 작업은 다음과 같습니다.

Map 상태에 반복 5회가 있고 3번째와 4번째 반복의 실행 세부 정보를 보려는 경우 다음을 수행합니다.

  1. 반복 데이터를 보려는 Map 상태를 선택합니다.

  2. 맵 반복 뷰어에서 보려는 반복을 선택합니다. 반복은 0부터 계산됩니다. 반복 5회 중 3번째 반복을 선택하려면 Map 상태 이름 옆에 있는 드롭다운 목록에서 #2를 선택합니다.

    참고

    상태 머신에 중첩 Map 상태가 포함된 경우 Step Functions는 부모 및 하위 Map 상태 이터레이션을 중첩 상태의 반복 데이터를 나타내는 별도의 두 개의 드롭다운 목록으로 표시합니다.

  3. (선택 사항) Map 상태 반복 하나 이상이 실행되지 않았거나 중단된 상태에서 중지된 경우 실패한 반복에 대한 세부 정보를 볼 수 있습니다. 이러한 세부 정보를 확인하려면 드롭다운 목록의 실패 또는 중단됨에서 영향을 받는 반복 번호를 선택합니다.

Map 상태에 반복 5회가 있고 반복 번호 3 및 4의 실행 세부 정보를 보려는 경우 다음을 수행합니다.

  1. 다른 반복 데이터를 보려는 Map 상태를 선택합니다.

  2. Map 상태 반복이 표시된 트리 뷰에서 반복 번호 3에 해당하는 #2 반복의 행을 선택합니다. 마찬가지로, 반복 번호 4에 해당하는 #3 행을 선택합니다.

설정 아이콘을 선택합니다. 그런 다음 기본 설정 대화 상자의 표시할 열 선택에서 표시할 열을 선택합니다.

기본적으로 이 모드에는 이름, 유형, 상태, 리소스다음 후에 시작됨 열이 표시됩니다.

상태 또는 날짜 및 시간 범위와 같은 속성을 기반으로 필터를 하나 이상 적용하면 표시되는 정보의 양을 제한합니다. 예를 들어 실행을 실패한 단계를 보려면 다음 필터를 적용합니다.

  1. 속성으로 필터링 또는 키워드로 검색을 선택한 다음 속성에서 상태를 선택합니다.

  2. 연산자에서 Status =를 선택합니다.

  3. Status = Failed를 선택합니다.

  4. (선택 사항) 필터 지우기를 선택하여 적용된 필터를 제거합니다.

유형 또는 날짜 및 시간 범위와 같은 속성을 기반으로 필터를 하나 이상 적용하면 표시되는 정보의 양을 제한합니다. 예를 들어 실행을 실패한 Task 상태를 보려면 다음 필터를 적용합니다.

  1. 속성으로 필터링 또는 키워드로 검색을 선택한 다음 속성에서 유형을 선택합니다.

  2. 연산자에서 Type =를 선택합니다.

  3. 유형 =을 선택합니다 TaskFailed.

  4. (선택 사항) 필터 지우기를 선택하여 적용된 필터를 제거합니다.

TaskFailed이벤트 ID 옆의 화살표 아이콘을 선택하여 드롭다운 상자에 나타나는 입력, 출력 및 리소스 호출을 비롯한 이벤트 세부 정보를 살펴보세요.