

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

# Step Functions에서 Lambda 함수로 루프 반복
<a name="tutorial-create-iterate-pattern-section"></a>

이 자습서에서는 상태 머신 및 AWS Lambda 함수를 사용하여 특정 횟수만큼 루프를 반복하는 설계 패턴을 구현합니다.

상태 머신에서 루프 횟수를 추적해야 하는 경우 언제든 이 디자인 패턴을 사용하십시오. 이것을 실행하면 대형 작업 또는 장시간 실행을 작은 덩어리로 나누거나 정해진 수의 이벤트 후에 실행을 종료할 수 있습니다. 유사한 구현을 사용하여 AWS Step Functions AWS Lambda또는 기타 AWS 서비스에 대한 서비스 할당량을 초과하지 않도록 장기 실행을 주기적으로 종료하고 다시 시작할 수 있습니다.

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

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

Lambda 함수를 사용하면 상태 머신에서 루프의 반복 수를 추적할 수 있습니다. 다음 Lambda 함수는 `count`, `index` 및 `step`에 대한 입력값을 수신합니다. 그런 다음 이들 값을 업데이트된 `index` 및 `continue`라는 부울 값과 함께 반환합니다. Lambda 함수는 `index`이 `count` 미만인 경우에 `continue`를 `true`로 설정합니다.

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

### Lambda 함수를 만들려면
<a name="create-iterate-pattern-create-lambda-function"></a>

1. [Lambda 콘솔](https://console.aws.amazon.com/lambda/home)에 로그인한 다음 **함수 생성**을 선택합니다.

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

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

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

   1. **런타임**에서 **Node.js**를 선택합니다.

   1. **기본 실행 역할 변경**에서 **기본 Lambda 권한을 사용하여 새 역할 생성**을 선택합니다.

   1. **함수 생성**을 선택합니다.

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

   ```
   export const handler = function (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. **배포(Deploy)**를 선택합니다.

## 2단계: Lambda 함수 테스트
<a name="create-iterate-pattern-step-2"></a>

숫자 값으로 Lambda 함수를 실행하여 작동하는지 확인합니다. Lambda 함수에 입력값을 제공하여 반복을 모방할 수 있습니다.

### Lambda 함수 테스트하기
<a name="create-iterate-pattern-test-lambda-function"></a>

1. **테스트**를 선택합니다.

1. **테스트 이벤트 구성** 대화 상자에서 **이벤트 이름** 상자에 `TestIterator`를 입력합니다.

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

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

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

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

1. Lambda 함수를 테스트하려면 **테스트**를 선택합니다.

   테스트 결과는 **실행 결과** 탭에 표시됩니다.

1. **실행 결과** 탭을 선택하여 출력을 확인합니다.

   ```
   {
     "index": 6,
     "step": 1,
     "count": 10,
     "continue": true
   }
   ```
**참고**  
`index`를 `9`로 설정하고 다시 테스트하면 `index`가 `10`으로 증가하며 `continue`가 `false`가 됩니다.

## 3단계: 상태 머신 생성
<a name="create-iterate-pattern-step-3"></a>

**Lambda 콘솔에서 나가기 전에...**  
Lambda 함수 ARN을 복사합니다. 메모에 붙여넣습니다. 다음 단계에서 이 정보를 사용할 것입니다.

다음으로 다음 상태의 상태 머신을 생성합니다.
+ `ConfigureCount` - `count`, `index` 및 `step`의 기본값을 설정합니다.
+ `Iterator` - 앞서 만든 Lambda 함수를 참조하여 `ConfigureCount`에서 구성한 값을 전달합니다.
+ `IsCountReached` – `Iterator` 함수에서 반환된 값을 기반으로 루프를 계속하거나 `Done` 상태로 진행하는 선택 상태입니다.
+ `ExampleWork` - 수행해야 하는 작업에 대한 스텁입니다. 이 예제에서는 워크플로에 `Pass` 상태가 있지만 실제 솔루션에서는 `Task`를 사용할 수 있습니다.
+ `Done` – 워크플로의 종료 상태입니다.

콘솔에서 상태 머신을 생성하려면

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home)을 열고 **상태 머신 생성**을 선택합니다.
**중요**  
상태 시스템은 Lambda 함수와 동일한 AWS 계정 및 리전에 있어야 합니다.

1. **빈** 템플릿을 선택합니다.

1. **코드** 창에서 상태 머신을 정의하는 다음 JSON을 붙여넣습니다.

   Amazon States Language에 대한 자세한 내용은 [상태 머신 구조](statemachine-structure.md)를 참조하세요.

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

1. `Iterator Resource` 필드를 이전에 생성한 `Iterator` Lambda 함수의 ARN으로 바꿉니다.

1. **구성**을 선택하고 상태 머신에 **이름**(예: `IterateCount`)을 입력합니다.
**참고**  
상태 머신, 실행 및 활동 태스크의 이름은 80자를 초과하면 안 됩니다. 이러한 이름은 계정 및 AWS 리전에 고유해야 하며 다음 중 하나를 포함하지 않아야 합니다.  
공백
와일드카드 문자 (`? *`)
괄호 문자(`< > { } [ ]`)
특수 문자 (`" # % \ ^ | ~ ` $ & , ; : /`)
제어 문자(`\\u0000` - `\\u001f` 또는 `\\u007f` - `\\u009f`).
Step Functions는 비 ASCII 문자가 포함된 상태 머신, 실행, 활동 및 레이블 이름을 허용합니다. 이러한 문자는 Amazon CloudWatch에서 데이터 로깅을 방지하므로 Step Functions 지표를 추적할 수 있도록 ASCII 문자만 사용하는 것이 좋습니다.

1. **유형**에서 **표준**의 기본값을 수락합니다. **권한**에서 **새 역할 생성**을 선택합니다.

1. **생성**을 선택한 다음 역할 생성을 **확인**합니다.

## 4단계: 새로운 실행 시작
<a name="create-iterate-pattern-step-4"></a>

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

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

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

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

   상태 머신의 신규 실행이 시작되면서 작동 중인 실행이 나타납니다.  
![\[진행 중 상태를 나타내는 파란색 반복자 상태를 보여주는 상태 머신 그래프입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/tutorial-create-iterate-running.png)

   실행은 단계적으로 증가하며 Lambda 함수를 사용하여 횟수를 추적합니다. 각 반복에서는 상태 머신의 `ExampleWork` 상태에서 참조한 예시 작업을 수행합니다.

   카운트가 상태 머신의 `ConfigureCount` 상태에서 지정된 횟수에 도달하면 실행이 반복을 중지하고 종료합니다.  
![\[반복자 및 완료 상태를 녹색으로 표시하여 둘 다 성공했음을 나타내는 상태 머신 그래프입니다.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/tutorial-create-iterate-done.png)