

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

# Step Functions에서 상태 머신 실행 검사
<a name="debug-sm-exec-using-ui"></a>

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

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

**참고**  
다음 절차에는 표준 워크플로 실행 세부 정보를 검사하는 방법에 대한 지침이 포함되어 있지만 Express 워크플로 실행 세부 정보도 검사할 수 있습니다. 표준 및 Express 워크플로 유형의 실행 세부 정보 간의 차이점은 [표준 및 Express 콘솔 환경 차이](concepts-view-execution-details.md#console-exp-differences) 섹션을 참조하세요.

## 1단계: 필수 Lambda 함수 만들기 및 테스트
<a name="step-create-all-lambda-functions"></a>

1. [Lambda 콘솔](https://console.aws.amazon.com/lambda/home)을 열고 [1단계: Lambda 함수 생성](tutorial-creating-lambda-state-machine.md#create-lambda-function) 섹션의 1\$14단계를 수행합니다. Lambda 함수 **GetListOfFruits**의 이름을 지정해야 합니다.

1. Lambda 함수를 만든 후 페이지 오른쪽 상단에 표시된 함수의 Amazon 리소스 이름(ARN)을 복사합니다. ARN을 복사하려면 복사 아이콘을 클릭하여 Lambda 함수의 Amazon 리소스 이름을 복사합니다. 다음은 예제 ARN입니다. 여기서 *`function-name`*은 Lambda 함수 이름입니다(이 경우 `GetListOfFruits`).

   ```
   arn:aws:lambda:region:123456789012:function:function-name
   ```

1. 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);
   };
   ```

1. **배포**를 선택한 다음 **테스트**를 선택하여 변경 사항을 배포하고 Lambda 함수 출력을 확인합니다.

1. 다음 단계에 따라 각각 **GetFruitPrice** 및 **CalculateAverage**라는 Lambda 함수 2개를 추가로 만듭니다.

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

      ```
      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;
      };
      ```

   1. 다음 코드를 평균 **CalculateAverage** Lambda 함수의 **코드 소스** 영역에 복사합니다.

      ```
      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);
      };
      ```

   1. 이 두 Lambda 함수의 ARN을 복사한 다음 **배포**하고 **테스트**해야 합니다.

## 2단계: 상태 머신 만들기 및 실행
<a name="step-create-exec-sm"></a>

[Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)을 사용하여 [1단계에서 만든 Lambda 함수](#step-create-all-lambda-functions)를 간접적으로 호출하는 상태 머신을 만듭니다. 이 상태 머신에는 `Map` 상태 3개가 정의되어 있습니다. 각 `Map` 상태에는 Lambda 함수 중 하나를 간접적으로 호출하는 `Task` 상태가 포함되어 있습니다. 또한 각 `Task` 상태에 `Retry` 필드가 정의되며 상태마다 재시도 횟수가 정의됩니다. `Task` 상태에서 런타임 오류가 발생하면 해당 `Task`에 정의된 재시도 횟수까지 다시 실행됩니다.

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home)을 열고 **코드로 워크플로 작성**을 선택합니다.
**중요**  
상태 머신이 앞서 만든 Lambda 함수와 동일한 AWS 계정 및 리전에 있는지 확인하세요.

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

1. 다음 Amazon States Language 정의를 복사하여 **정의** 아래에 붙여넣습니다. 표시된 ARN을 앞서 만든 Lambda 함수의 ARN으로 교체해야 합니다.

   ```
   {
       "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:region: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:region: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:region: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
           }
       }
   }
   ```

1. 상태 머신 이름을 입력합니다. 이 페이지의 다른 옵션을 기본 선택 사항으로 유지하고 **상태 머신 생성**을 선택합니다.

1. 제목이 상태 머신 이름인 페이지를 엽니다. [4단계: 상태 머신 실행](tutorial-creating-lambda-state-machine.md#start-lambda-function) 섹션의 1\$14단계를 수행하되 실행 입력으로는 다음 데이터를 사용합니다.

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

## 3단계: 상태 머신 실행 세부 정보 보기
<a name="view-sm-exec-details"></a>

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

1. (선택 사항) *실행 세부 정보* 페이지에 표시된 탭 중에서 선택하여 각 탭에 있는 정보를 확인합니다. 예를 들어 상태 머신 입력과 실행 출력을 보려면 *[실행 요약](concepts-view-execution-details.md#exec-details-intf-exec-summ)* 섹션에서 **실행 입력 및 출력**을 선택합니다.

1. 상태 머신 실행이 실패하면 오류 메시지에서 **원인** 또는 **단계 세부 정보 표시**를 선택합니다. 오류에 대한 세부 정보는 *[단계 세부 정보](concepts-view-execution-details.md#exec-details-intf-step-details)* 섹션에 표시됩니다. 오류를 발생시킨 단계(**GetListofFruits**라는 `Task` 상태)는 **그래프 보기** 및 **테이블 보기**에서 강조 표시됩니다.
**참고**  
**GetListofFruits** 단계가 `Map` 상태 내에 정의되어 있고 단계가 성공적으로 실행되지 못했으므로 `Map` 상태 단계의 **상태**는 **실패**로 표시됩니다.

## 4단계: 다양한 *보기 모드* 살펴보기
<a name="sm-exec-details-exp-view-modes"></a>

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

### **그래프 보기** — 다양한 `Map` 상태 반복으로 전환
<a name="graph-view-see-map-state-iterations"></a>

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

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

1. **맵 반복 뷰어**에서 보려는 반복을 선택합니다. 반복은 0부터 계산됩니다. 반복 5회 중 3번째 반복을 선택하려면 **Map** 상태 이름 옆에 있는 드롭다운 목록에서 **\$12**를 선택합니다.
**참고**  
상태 머신에 중첩된 `Map` 상태가 포함된 경우 Step Functions는 부모 및 하위 `Map` 상태 반복을 중첩된 상태의 반복 데이터를 나타내는 별도의 드롭다운 목록 2개로 표시합니다.

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

### **테이블 보기** — 다양한 `Map` 상태 반복으로 전환
<a name="table-view-see-map-state-iterations"></a>

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

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

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

### **테이블 보기** - 표시할 열 구성
<a name="table-view-cfg-display-cols"></a>

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

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

### **테이블 보기** - 결과 필터링
<a name="table-view-filter-results"></a>

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

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

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

1. **Status = Failed**를 선택합니다.

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

### **이벤트 보기** - 결과 필터링
<a name="event-view-filter-results"></a>

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

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

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

1. **Type = TaskFailed**를 선택합니다.

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

### **이벤트 보기** — **TaskFailed** 이벤트 세부 정보 검사
<a name="event-view-inspect-failed-task-details"></a>

**TaskFailed** 이벤트 ID 옆에 있는 화살표 아이콘을 선택하여 드롭다운 상자에 나타나는 입력, 출력 및 리소스 간접 호출을 포함한 세부 정보를 검사합니다.