

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

# Step Functions에서 Lambda 함수를 사용하여 새 실행 계속하기
<a name="tutorial-use-lambda-cont-exec"></a>

**작은 정보**  
다음 접근 방식은 Lambda 함수를 사용하여 새 워크플로 실행을 시작합니다. Step Functions 작업 상태를 사용하여 새 워크플로 실행을 시작하는 것이 **좋습니다**. 다음 자습서에서 방법을 참조하세요. **[Step Functions API(권장)를 사용하여 장기 실행 워크플로 계속 진행](tutorial-continue-new.md)** 

현재 실행을 종료하기 전에 Lambda 함수를 사용하는 상태 머신을 만들어 새로운 실행을 시작할 수 있습니다. 이 접근 방식을 통해 새로운 실행에서 지속적인 작업을 계속하면 대규모 작업을 더 작은 워크플로로 분할하거나 워크플로를 무기한 실행할 수 있습니다.

이 자습서는 워크플로를 수정하는 외부 Lambda 함수 사용 개념을 기반으로 합니다. 이 개념은 [Step Functions에서 Lambda 함수로 루프 반복](tutorial-create-iterate-pattern-section.md) 자습서에서 설명되었습니다. 같은 Lambda 함수(`Iterator`)를 사용하여 특정 횟수 동안 루프를 반복합니다. 또한 워크플로의 새 실행을 시작하고 새 실행을 시작할 때마다 카운트를 감소시키는 또 다른 Lambda 함수를 만듭니다. 입력에서 실행 수를 설정하면 이 상태 머신은 지정된 횟수만큼 실행을 종료했다가 다시 시작합니다.

여기서 생성하는 상태 머신은 다음 상태를 구현합니다.


| State | 용도 | 
| --- | --- | 
| `ConfigureCount` |  작업 반복을 단계적으로 진행하기 위해 `Iterator` Lambda 함수에서 사용하는 `count`, `index` 및 `step` 값을 구성하는 `Pass` 상태입니다.  | 
|  `Iterator`  |  `Task` Lambda 함수를 참조하는 `Iterator` 상태입니다.  | 
| `IsCountReached` | Iterator 함수의 부울 값을 사용하여 상태 머신이 예제 작업을 계속할지 또는 ShouldRestart 상태로 이동할지를 결정하는 Choice 상태입니다. | 
| `ExampleWork` | 실제 구현에서 작업을 수행하는 Task 상태를 나타내는 Pass 상태입니다. | 
| `ShouldRestart` | executionCount 값을 사용하여 실행 하나를 종료하고 다른 실행을 시작할지 또는 종료만 할지를 결정하는 Choice 상태입니다. | 
| `Restart` | Lambda 함수를 사용하여 상태 머신의 새 실행을 시작하는 Task 상태입니다. Iterator 함수와 마찬가지로 이 함수도 카운트를 감소시킵니다. Restart 상태는 감소된 카운트 값을 새 실행의 입력으로 전달합니다. | 

## 사전 조건
<a name="tutorial-continue-new-prereq"></a>

시작하기 전에 [Lambda를 사용하는 Step Functions 상태 머신 만들기](tutorial-creating-lambda-state-machine.md) 자습서를 살펴보고 Lambda와 Step Functions를 함께 사용하는 방법에 익숙해야 합니다.

## 1단계: 계산을 반복하는 Lambda 함수 만들기
<a name="tutorial-continue-new-step-1"></a>

**참고**  
[Step Functions에서 Lambda 함수로 루프 반복](tutorial-create-iterate-pattern-section.md) 자습서를 완료했으면 이 단계를 건너뛰고 해당 Lambda 함수를 사용할 수 있습니다.

이 섹션과 [Step Functions에서 Lambda 함수로 루프 반복](tutorial-create-iterate-pattern-section.md) 자습서에서는 Lambda 함수를 사용하여 카운트(예: 상태 머신에서 루프 반복 횟수)를 추적하는 방법을 보여줍니다.

 다음 Lambda 함수는 `count`, `index` 및 `step`에 대한 입력값을 수신합니다. 업데이트된 `index` 및 불 방식인 `continue`로 이런 값을 반환합니다. Lambda 함수는 `index`이 `count` 미만인 경우에 `continue`를 `true`로 설정합니다.

그러면 상태 머신은 `continue`가 `true`이면 일부 애플리케이션 로직을 실행하고 `continue`가 `false`이면 `ShouldRestart`로 진행하는 `Choice` 상태를 구현합니다.

### 반복 Lambda 함수 만들기
<a name="tutorial-continue-new-create-lambda-function"></a>

1. [Lambda 콘솔](https://console.aws.amazon.com/lambda/home)을 열고 **함수 생성**을 선택합니다.

1. **함수 생성** 페이지에서 **처음부터 새로 작성**을 선택합니다.

1. **기본 정보** 섹션에서 다음과 같이 Lambda 함수를 구성합니다.

   1. [**함수 이름**]에 `Iterator`을 입력합니다.

   1. **런타임**에는 **Node.js 16.x**를 선택합니다.

   1. 페이지에 있는 모든 기본 선택 항목을 그대로 두고 **함수 생성**을 선택합니다.

      Lambda 함수가 생성되면 페이지 오른쪽 상단 모서리에 있는 Amazon 리소스 이름(ARN)을 기록해 둡니다. 예를 들면 다음과 같습니다.

      ```
      arn:aws:lambda:region:123456789012:function:Iterator
      ```

1. Lambda 함수의 다음 코드를 Lambda 콘솔에 있는 ***이터레이터*** 페이지의 **코드 소스** 섹션에 복사합니다.

   ```
   exports.handler = function iterator (event, context, callback) {
     let index = event.iterator.index;
     let step = event.iterator.step;
     let count = event.iterator.count;
    
     index = index + step;
    
     callback(null, {
       index,
       step,
       count,
       continue: index < count
     })
   }
   ```

   이 코드는 `count`, `index` 및 `step`에 대한 입력값을 수신합니다. 이 코드는 `index`를 `step` 값만큼 증가시키고 이들 값과 `continue` 부울 값을 반환합니다. `index`가 `count`보다 작으면 `continue` 값이 `true`입니다.

1. **배포**를 선택하여 코드를 배포합니다.

### 반복 Lambda 함수 테스트
<a name="tutorial-continue-new-step-1-test"></a>

`Iterate` 함수가 작동하는지 확인하려면 숫자 값으로 이 함수를 실행합니다. Lambda 함수에 입력값을 제공하여 반복을 모방하면 특정 입력값으로 어떤 출력을 얻는지 확인할 수 있습니다.

#### Lambda 함수 테스트하기
<a name="tutorial-continue-new-test-lambda-function"></a>

1. **테스트 이벤트 구성** 대화 상자에서 **새로운 테스트 이벤트 생성**을 선택한 다음 **이벤트 이름**에 `TestIterator`를 입력합니다.

1. 예제 데이터를 다음으로 바꿉니다.

   ```
   {
     "Comment": "Test my Iterator function",
     "iterator": {
       "count": 10,
       "index": 5,
       "step": 1
     }
   }
   ```

   이러한 값은 반복 도중에 상태 머신에서 얻게 되는 내용처럼 보입니다. Lambda 함수는 인덱스를 증가시키고 `continue`를 `true`로 반환합니다. 인덱스가 `count`보다 작지 않으면 이 함수는 `continue`를 `false`로 반환합니다. 이 테스트에서는 인덱스가 이미 `5`까지 증가한 상태입니다. 결과는 `index`를 `6`으로 증가시키고 `continue`를 `true`로 설정해야 합니다.

1. **생성(Create)**을 선택합니다.

1. Lambda 콘솔의 ***이터레이터*** 페이지에 **TestIterator**가 나열되어 있는지 확인한 다음 **테스트**를 선택합니다.

   테스트의 결과는 창 위쪽에 표시됩니다. [**Details**]를 선택하고 결과를 검토합니다.

   ```
   {
     "index": 6,
     "step": 1,
     "count": 10,
     "continue": true
   }
   ```
**참고**  
이 테스트에서 `index`를 `9`로 설정할 경우 `index`는 `10`으로 증가하고 `continue`는 `false`가 됩니다.

## 2단계: 새로운 Step Functions 실행을 시작하는 재시작 Lambda 함수 만들기
<a name="tutorial-continue-new-step-3"></a>

1. [Lambda 콘솔](https://console.aws.amazon.com/lambda/home)을 열고 **함수 생성**을 선택합니다.

1. **함수 생성** 페이지에서 **처음부터 새로 작성**을 선택합니다.

1. **기본 정보** 섹션에서 다음과 같이 Lambda 함수를 구성합니다.

   1. [**함수 이름**]에 `Restart`을 입력합니다.

   1. **런타임**에는 **Node.js 16.x**를 선택합니다.

1. 페이지에 있는 모든 기본 선택 항목을 그대로 두고 **함수 생성**을 선택합니다.

   Lambda 함수가 생성되면 페이지 오른쪽 상단 모서리에 있는 Amazon 리소스 이름(ARN)을 기록해 둡니다. 예를 들면 다음과 같습니다.

   ```
   arn:aws:lambda:region:123456789012:function:Iterator
   ```

1. Lambda 함수의 다음 코드를 Lambda 콘솔에 있는 ***재시작*** 페이지의 **코드 소스** 섹션에 복사합니다.

   다음 코드는 실행 수 카운트를 감소시키고 감소된 값을 포함하여 상태 머신의 새 실행을 시작합니다.

   ```
   var aws = require('aws-sdk');
   var sfn = new aws.StepFunctions();
   
   exports.restart = function(event, context, callback) {
   
     let StateMachineArn = event.restart.StateMachineArn;
     event.restart.executionCount -= 1;
     event = JSON.stringify(event);
   
     let params = {
         input: event,
         stateMachineArn: StateMachineArn
     };
   
     sfn.startExecution(params, function(err, data) {
         if (err) callback(err);
         else callback(null,event);
     });
   
   }
   ```

1. **배포**를 선택하여 코드를 배포합니다.

## 3단계: 상태 머신 만들기
<a name="tutorial-continue-new-step-4"></a>

Lambda 함수 2개를 만들었습니다. 이제 상태 머신을 만듭니다. 이 상태 머신에서 `ShouldRestart` 및 `Restart` 상태는 작업을 여러 실행으로 분리하는 방법입니다.

**Example ShouldRestart 선택 상태**  
다음 발췌에서는 `ShouldRestart``Choice` 상태를 보여줍니다. 이 상태는 실행을 다시 시작할지 여부를 결정합니다.  

```
"ShouldRestart": {
"Type": "Choice",
"Choices": [
  {
    "Variable": "$.restart.executionCount",
    "NumericGreaterThan": 1,
    "Next": "Restart"
  }
],
```

`$.restart.executionCount` 값은 초기 실행이 입력에 포함됩니다. 이 값은 `Restart` 함수를 호출할 때마다 하나씩 감소된 다음, 각 후속 실행에 대한 입력으로 배치됩니다.

**Example 다시 시작 작업 상태**  
다음 발췌에서는 `Restart``Task` 상태를 보여줍니다. 이 상태는 앞에서 만든 Lambda 함수를 사용하여 실행을 다시 시작하고 카운트를 감소시켜서 시작할 남은 실행 수를 추적합니다.  

```
"Restart": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:region:123456789012:function:Restart",
  "Next": "Done"
},
```

**상태 시스템을 생성하려면**

1. [AWS Step Functions 콘솔](https://console.aws.amazon.com/states/home)을 열고 메뉴에서 **상태 머신**을 선택한 다음 **상태 머신 생성**을 선택합니다.
**중요**  
상태 시스템이 [1단계 및 ](#tutorial-continue-new-step-1)[2단계](#tutorial-continue-new-step-3)에서 이전에 생성한 Lambda 함수와 동일한 AWS 계정 및 리전에 있는지 확인합니다.

1. **새로 생성**을 선택합니다.

1. 상태 머신의 이름을 지정한 다음 **계속**을 선택하여 Workflow Studio에서 상태 머신을 편집합니다.

1. 이 자습서에서는 [코드 편집기](workflow-studio.md#wfs-interface-code-editor)에서 상태 머신의 [Amazon States Language](concepts-amazon-states-language.md)(ASL) 정의를 작성합니다. 이렇게 하려면 **코드**를 선택합니다.

1. 기존 보일러플레이트 코드를 제거하고 다음 코드를 붙여넣습니다. 이 코드의 ARN을 만든 Lambda 함수의 ARN으로 교체해야 합니다.

   ```
   {
       "Comment": "Continue-as-new State Machine Example",
       "StartAt": "ConfigureCount",
       "States": {
           "ConfigureCount": {
               "Type": "Pass",
               "Result": {
                   "count": 100,
                   "index": -1,
                   "step": 1
               },
               "ResultPath": "$.iterator",
               "Next": "Iterator"
           },
           "Iterator": {
               "Type": "Task",
               "Resource": "arn:aws:lambda:region:123456789012:function:Iterator",
               "ResultPath": "$.iterator",
               "Next": "IsCountReached"
           },
           "IsCountReached": {
               "Type": "Choice",
               "Choices": [
                   {
                       "Variable": "$.iterator.continue",
                       "BooleanEquals": true,
                       "Next": "ExampleWork"
                   }
               ],
               "Default": "ShouldRestart"
           },
           "ExampleWork": {
               "Comment": "Your application logic, to run a specific number of times",
               "Type": "Pass",
               "Result": {
                 "success": true
               },
               "ResultPath": "$.result",
               "Next": "Iterator"
           },
           "ShouldRestart": {
             "Type": "Choice",
             "Choices": [
               {
                 "Variable": "$.restart.executionCount",
                 "NumericGreaterThan": 0,
                 "Next": "Restart"
               }
             ],
             "Default": "Done"
           },
           "Restart": {
             "Type": "Task",
             "Resource": "arn:aws:lambda:region:123456789012:function:Restart",
             "Next": "Done"
           },
           "Done": {
               "Type": "Pass",
               "End": true 
           }
       }
   }
   ```

1. 상태 머신 이름을 지정합니다. 이렇게 하려면 기본 상태 머신 이름인 **MyStateMachine** 옆에 있는 편집 아이콘을 선택합니다. 그런 다음 **상태 머신 구성**에서 **상태 머신 이름** 상자에 이름을 지정합니다.

   이 튜토리얼에서는 이름 **ContinueAsNew**를 입력합니다.

1. (선택 사항) **상태 머신 구성**에서 상태 머신 유형 및 실행 역할과 같은 기타 워크플로 설정을 지정합니다.

   이 자습서의 경우 **상태 머신 설정**의 모든 기본 선택 항목을 그대로 둡니다.

   상태 머신에 대한 올바른 권한을 사용하여 [이전에 IAM 역할을 만들었고](procedure-create-iam-role.md) 이를 사용하려면 **권한**에서 **기존 역할 선택**을 선택한 다음 목록에서 역할을 선택합니다. 또는 **역할 ARN 입력**을 선택한 다음 IAM 역할에 대한 ARN을 제공합니다.

1. **역할 생성 확인** 대화 상자에서 **확인**을 선택하여 계속합니다.

   **역할 설정 보기**를 선택하여 **상태 머신 구성**으로 돌아갈 수도 있습니다.
**참고**  
Step Functions에서 만드는 IAM 역할을 삭제하면 나중에 Step Functions에서 이 역할을 다시 만들 수 없습니다. 마찬가지로, 역할을 수정하면(예: IAM 정책의 주요에서 Step Functions 제거) 나중에 Step Functions에서 해당 원본 설정을 복원할 수 없습니다.

1. 이 상태 머신의 Amazon 리소스 이름(ARN)을 텍스트 파일에 저장합니다. Lambda 함수에 새로운 Step Functions 실행을 시작할 수 있는 권한을 제공하면서 ARN을 제공해야 합니다.

## 4단계: IAM 정책 업데이트
<a name="tutorial-continue-new-step-2"></a>

Lambda 함수에 새로운 Step Functions 실행을 시작할 수 있는 권한이 있는지 확인하려면 인라인 정책을 `Restart` Lambda 함수에 사용하는 IAM 역할에 연결합니다. 자세한 내용은 *IAM 사용 설명서*의 [인라인 정책 임베딩](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#embed-inline-policy-console)을 참조하세요.

**참고**  
`ContinueAsNew` 상태 머신의 ARN을 참조하도록 이전 예제의 `Resource` 줄을 업데이트할 수 있습니다. 이렇게 하면 해당 특정 상태 머신의 실행만 시작할 수 있도록 정책이 제한됩니다.

****  

```
{
 "Version":"2012-10-17",		 	 	 
 "Statement": [
     {
         "Sid": "VisualEditor0",
         "Effect": "Allow",
         "Action": [
             "states:StartExecution"
         ],
         "Resource": "arn:aws:states:us-east-2:123456789012:stateMachine:ContinueAsNew"
     }
 ]
}
```

## 5단계: 상태 머신 실행
<a name="tutorial-continue-new-step-5"></a>

실행을 시작하려면 상태 머신의 ARN 및 새 실행을 시작할 횟수의 `executionCount`이 포함된 입력을 제공합니다.

1.  **ContinueAsNew** 페이지에서 **실행 시작**을 선택합니다.

   **실행 시작** 대화 상자가 표시됩니다.

1. **실행 시작** 대화 상자에서 다음을 수행합니다.

   1. (선택 사항) 생성된 기본값을 재정의하려면 사용자 지정 실행 이름을 입력합니다.
**비 ASCII 이름 및 로깅**  
Step Functions는 비 ASCII 문자가 포함된 상태 머신, 실행, 활동 및 레이블 이름을 허용합니다. 이러한 문자는 Amazon CloudWatch에서 데이터 로깅을 방지하므로 Step Functions 지표를 추적할 수 있도록 ASCII 문자만 사용하는 것이 좋습니다.

   1. **입력** 상자에 다음 JSON 입력을 입력하여 워크플로를 실행합니다.

      ```
      {
        "restart": {
          "StateMachineArn": "arn:aws:states:region:account-id:stateMachine:ContinueAsNew",
          "executionCount": 4
        }
      }
      ```

   1. `ContinueAsNew` 상태 머신의 ARN으로 `StateMachineArn` 필드를 업데이트합니다.

   1. **실행 시작**을 선택합니다.

   1. Step Functions 콘솔은 실행 ID가 제목인 페이지로 이동합니다. 이 페이지를 *실행 세부 정보* 페이지라고 합니다. 실행이 진행되는 동안 또는 완료된 후에 이 페이지에서 실행 결과를 검토할 수 있습니다.

      실행 결과를 검토하려면 **그래프 보기**에서 개별 상태를 선택한 다음 [단계 세부 정보](concepts-view-execution-details.md#exec-details-intf-step-details) 창에서 개별 탭을 선택하여 입력, 출력 및 정의가 포함된 각 상태의 세부 정보를 각각 봅니다. *실행 세부 정보* 페이지에서 볼 수 있는 실행 정보에 대한 자세한 내용은 [실행 세부 정보 개요](concepts-view-execution-details.md#exec-details-interface-overview) 섹션을 참조하세요.

      **그래프 보기**에는 실행 4개 중 첫 번째가 표시됩니다. 이 실행은 완료되기 전에 `Restart` 상태를 전달하고 새 실행을 시작합니다.  
![\[4개 중 첫 번째 실행을 보여주는 실행 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/execution-test1.png)

      이 실행이 완료되면 다음에 시작되는 실행을 볼 수 있습니다. 상단에 있는 **ContinueAsNew** 링크를 선택하여 실행 목록을 봅니다. 최근에 종료된 실행과 `Restart` Lambda 함수가 시작된 진행 중인 실행이 모두 표시됩니다.

      모든 실행이 완료되면 네 개의 성공적인 실행이 목록에 표시됩니다. 첫 번째로 시작된 실행에는 선택한 이름이 표시되고, 후속 실행에는 생성된 이름이 표시됩니다.  
![\[모든 실행이 완료되었음을 보여주는 예시 스크린샷입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/execution-test1-complete.png)