

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

# Step Functions에서 Distributed Map을 사용하여 대규모 CSV 데이터 복사
<a name="tutorial-map-distributed"></a>

이 자습서는 분산 모드에서 `Map` 상태 사용을 시작하는 데 도움이 됩니다. **Distributed**로 설정된 `Map` 상태를 *Distributed Map 상태*라고 합니다. 워크플로의 *Distributed Map 상태*를 사용하여 대규모 Amazon S3 데이터 소스를 반복할 수 있습니다. `Map` 상태는 각 반복을 하위 워크플로 실행으로 실행하므로 높은 동시성이 가능합니다. 분산 모드에 대한 자세한 내용은 [분산 모드의 Map 상태](state-map-distributed.md)를 참조하세요.

이 자습서에서는 *Distributed Map 상태*를 사용하여 Amazon S3 버킷의 CSV 파일을 반복합니다. 그런 다음 하위 워크플로 실행의 ARN과 함께 해당 콘텐츠를 다른 Amazon S3 버킷에 반환합니다. 먼저 Workflow Studio에서 워크플로 프로토타입을 만듭니다. 다음으로 [`Map` 상태 처리 모드](state-map.md#concepts-map-process-modes)를 Distributed로 설정하고 CSV 파일을 데이터세트로 지정한 다음 해당 위치를 `Map` 상태에 제공합니다. 또한 *Distributed Map 상태*가 **Express**로 시작하는 하위 워크플로 실행의 워크플로 유형을 지정합니다.

이 자습서에서 사용하는 예제 워크플로의 경우 이러한 설정 외에도 하위 워크플로의 최대 동시 실행 수, `Map` 결과를 내보내는 위치와 같은 다른 구성도 지정합니다.

## 사전 조건
<a name="use-dist-map-prereqs"></a>
+ Amazon S3 버킷에 CSV 파일 업로드 CSV 파일 내 헤더 행을 정의해야 합니다. CSV 파일에 적용되는 크기 제한 및 헤더 행을 지정하는 방법에 대한 자세한 내용은 [Amazon S3 버킷에 있는 CSV 파일](input-output-itemreader.md#itemsource-example-csv-data) 섹션을 참조하세요.
+ Amazon S3 버킷과 `Map` 상태 결과를 내보낼 버킷 내에 폴더를 만듭니다.

**계정 및 리전에 대한 요구 사항**  
Amazon S3 버킷은 상태 머신과 동일한 AWS 계정 및 AWS 리전에 있어야 합니다.  
상태 머신이 동일한 AWS 리전에 있는 다른 AWS 계정의 버킷에 있는 파일에 액세스할 수 있더라도 Step Functions는 상태 머신과 동일한AWS 계정과 동일한 AWS 리전에 *있는* Amazon S3 버킷의 객체만 나열하는 것을 지원합니다.

## 1단계: 워크플로 프로토타입 만들기
<a name="use-dist-map-create-workflow"></a>

이 단계에서는 Workflow Studio를 사용하여 워크플로의 프로토타입을 만듭니다. Workflow Studio는 Step Functions 콘솔에서 사용할 수 있는 시각적 워크플로 디자이너입니다. **흐름** 및 **작업** 탭에서 각각 필요한 상태와 API 작업을 선택합니다. Workflow Studio의 끌어서 놓기 기능을 사용하여 워크플로 프로토타입을 만듭니다.

1. [AWS Step Functions 콘솔](https://console.aws.amazon.com/states/home)을 열고 메뉴에서 **상태 머신**을 선택한 다음 **상태 머신 생성**을 선택합니다.

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

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

1. **흐름** 탭에서 **Map** 상태를 끌어 **첫 번째 상태를 여기에 놓기** 레이블이 지정된 빈 상태에 놓습니다.

1. **구성** 탭의 **상태 이름**에 **Process data**를 입력합니다.

1. **작업** 탭에서 **AWS Lambda Invoke** API 작업을 끌어 **Process data** 상태에 놓습니다.

1. **AWS Lambda Invoke** 상태 이름을 **Process CSV data**로 바꿉니다.

## 2단계: Map 상태에 필요한 필드 구성
<a name="use-dist-map-config-fields"></a>

이 단계에서는 *Distributed Map 상태*에 필요한 다음 필드를 구성합니다.
+ [ItemReader](input-output-itemreader.md) - `Map` 상태에서 입력을 읽을 수 있는 데이터세트와 위치를 지정합니다.
+ [ItemProcessor](state-map-distributed.md#distitemprocessor) - 다음 값을 지정합니다.
  + `ProcessorConfig` - `Mode` 및 `ExecutionType`을 각각 `DISTRIBUTED` 및 `EXPRESS`로 설정합니다. 이렇게 하면 *Distributed Map 상태*가 시작하는 하위 워크플로 실행의 `Map` 상태 처리 모드와 워크플로 유형이 설정됩니다.
  + `StartAt` - Map 워크플로의 첫 번째 상태입니다.
  + `States` - 각 하위 워크플로 실행에서 반복되는 일련의 단계인 Map 워크플로를 정의합니다.
+ [ResultWriter](input-output-resultwriter.md) - Step Functions에서 *Distributed Map 상태* 결과를 작성하는 Amazon S3 위치를 지정합니다.
**중요**  
맵 실행 결과를 내보내는 데 사용하는 Amazon S3 버킷이 상태 머신과 동일한 AWS 계정 및 AWS 리전에 있는지 확인하세요. 그렇지 않으면 상태 머신 실행이 실패하고 `States.ResultWriterFailed` 오류가 표시됩니다.

**필수 필드 구성하기:**

1. **Process data** 상태를 선택하고 **구성** 탭에서 다음을 수행합니다.

   1. **처리 모드**에 **분산**을 선택합니다.

   1. **항목 소스**에 **Amazon S3**를 선택한 다음 **S3 항목 소스** 드롭다운 목록에서 **S3의 CSV 파일**을 선택합니다.

   1. CSV 파일의 Amazon S3 위치를 지정하려면 다음을 수행합니다.

      1. **S3 객체**의 드롭다운 목록에서 **버킷 및 키 입력**을 선택합니다.

      1. **버킷**에 CSV 파일이 있는 Amazon S3 버킷의 이름을 입력합니다. 예를 들어 **amzn-s3-demo-source-bucket**입니다.

      1. **키**에 CSV 파일을 저장한 Amazon S3 객체의 이름을 입력합니다. 이 필드에 CSV 파일 이름도 지정해야 합니다. 예를 들어 **csvDataset/ratings.csv**입니다.

   1. CSV 파일의 경우 열 헤더 위치도 지정해야 합니다. 이렇게 하려면 **추가 구성**을 선택한 다음 CSV 파일의 첫 번째 행이 헤더이면 **CSV 헤더 위치**에 기본 선택 항목인 **첫 번째 행**을 그대로 둡니다. 그렇지 않으면 **지정**을 선택하여 상태 머신 정의 내에 헤더를 지정합니다. 자세한 내용은 `ReaderConfig` 섹션을 참조하세요.

   1. **하위 실행 유형**에 **Express**를 선택합니다.

1. **내보내기 위치**에서 맵 실행 결과를 특정 Amazon S3 위치로 내보내도록 **Map 상태의 출력을 Amazon S3로 내보내기**를 선택합니다.

1. 다음을 수행합니다.

   1. **S3 버킷**의 드롭다운 목록에서 **버킷 이름 및 접두사 입력**을 선택합니다.

   1. **버킷**에 결과를 내보낼 Amazon S3 버킷의 이름을 입력합니다. 예를 들어 **mapOutputs**입니다.

   1. **접두사**에 결과를 저장할 폴더 이름을 입력합니다. 예를 들어 **resultData**입니다.

## 3단계: 추가 옵션 구성
<a name="use-dist-map-config-misc-fields"></a>

*Distributed Map 상태*에 필요한 설정 외에도 다른 옵션도 지정할 수 있습니다. 여기에는 하위 워크플로의 최대 동시 실행 수와 `Map` 상태 결과를 내보낼 위치가 포함될 수 있습니다.

1. **Process data** 상태를 선택합니다. 그런 다음 **항목 소스**에서 **추가 구성**을 선택합니다.

1. 다음을 수행합니다.

   1. **ItemSelector를 사용하여 항목 수정**을 선택하여 각 하위 워크플로 실행의 사용자 지정 JSON 입력을 지정합니다.

   1. 다음 JSON 입력을 입력합니다.

      ```
      {
        "index.$": "$$.Map.Item.Index",
        "value.$": "$$.Map.Item.Value"
      }
      ```

      사용자 지정 입력을 만드는 방법은 `ItemSelector(맵)` 섹션을 참조하세요.

1. **런타임 설정**의 **동시성 한도 설정**에서 *Distributed Map 상태*가 시작할 수 있는 하위 워크플로의 동시 실행 수를 지정합니다. 예를 들면 **100**를(을) 입력합니다.

1. 브라우저에서 새 창이나 탭을 열고 [4단계: Lambda 함수 구성](#use-dist-map-config-resource)의 설명대로 이 워크플로에서 사용할 Lambda 함수의 구성을 완료합니다.

## 4단계: Lambda 함수 구성
<a name="use-dist-map-config-resource"></a>

**중요**  
Lambda 함수가 상태 머신과 동일한 AWS 리전에 있는지 확인합니다.

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

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

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

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

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

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

   1. Lambda 함수를 만든 후 페이지 오른쪽 상단에 표시된 함수의 Amazon 리소스 이름(ARN)을 복사합니다. 워크플로 프로토타입에 이를 제공해야 합니다. ARN 예제는 다음과 같습니다.

      ```
      arn:aws:lambda:us-east-2:123456789012:function:distributedMapLambda
      ```

1. Lambda 함수의 다음 코드를 복사하여 **distributedMapLambda** 페이지의 **코드 소스** 섹션에 붙여넣습니다.

   ```
   exports.handler = async function(event, context) {
       console.log("Received Input:\n", event);
   
       return {
           'statusCode' : 200,
           'inputReceived' : event //returns the input that it received
       }
   };
   ```

1. **배포**를 선택합니다. 함수가 배포되면 **테스트**를 선택하여 Lambda 함수 출력을 확인합니다.

## 5단계: 워크플로 프로토타입 업데이트
<a name="use-dist-map-update-workflow"></a>

Step Functions 콘솔에서 워크플로를 업데이트하여 Lambda 함수의 ARN을 추가합니다.

1. 워크플로 프로토타입을 만든 탭이나 창으로 돌아갑니다.

1. **CSV 데이터 처리** 단계를 선택하고 **구성** 탭에서 다음을 수행합니다.

   1. **통합 유형**에 **최적화**를 선택합니다.

   1. **함수 이름**에 Lambda 함수 이름을 입력합니다. 표시되는 드롭다운 목록에서 함수를 선택하거나 **함수 이름 입력**을 선택하고 Lambda 함수 ARN을 제공합니다.

## 6단계: 자동 생성된 Amazon States Language 정의 검토 및 워크플로 저장
<a name="use-dist-map-review-asl"></a>

**작업** 및 **흐름** 탭에서 상태를 끌어 캔버스에 놓으면 Workflow Studio에서 워크플로의 [Amazon States Language](concepts-amazon-states-language.md) 정의를 실시간으로 자동 작성합니다. 필요에 따라 이 정의를 편집할 수 있습니다.

1. (선택 사항) [Inspector 패널](workflow-studio.md#workflow-studio-components-formdefinition) 패널에서 **정의**를 선택하고 상태 머신 정의를 봅니다.
**작은 정보**  
Workflow Studio의 [코드 편집기](workflow-studio.md#wfs-interface-code-editor)에서 ASL 정의를 볼 수도 있습니다. 코드 편집기에서 워크플로의 ASL 정의를 편집할 수도 있습니다.

   다음 예제 코드에서는 워크플로에 자동으로 생성된 Amazon States Language 정의를 보여줍니다.

   ```
   {
     "Comment": "Using Map state in Distributed mode",
     "StartAt": "Process data",
     "States": {
       "Process data": {
         "Type": "Map",
         "MaxConcurrency": 100,
         "ItemReader": {
           "ReaderConfig": {
             "InputType": "CSV",
             "CSVHeaderLocation": "FIRST_ROW"
           },
           "Resource": "arn:aws:states:::s3:getObject",
           "Parameters": {
             "Bucket": "amzn-s3-demo-source-bucket",
             "Key": "csvDataset/ratings.csv"
           }
         },
         "ItemProcessor": {
           "ProcessorConfig": {
             "Mode": "DISTRIBUTED",
             "ExecutionType": "EXPRESS"
           },
           "StartAt": "Process CSV data",
           "States": {
             "Process CSV data": {
               "Type": "Task",
               "Resource": "arn:aws:states:::lambda:invoke",
               "OutputPath": "$.Payload",
               "Parameters": {
                 "Payload.$": "$",
                 "FunctionName": "arn:aws:lambda:us-east-2:account-id:function:distributedMapLambda"
               },
               "End": true
             }
           }
         },
         "Label": "Processdata",
         "End": true,
         "ResultWriter": {
           "Resource": "arn:aws:states:::s3:putObject",
           "Parameters": {
             "Bucket": "mapOutputs",
             "Prefix": "resultData"
           }
         },
         "ItemSelector": {
           "index.$": "$$.Map.Item.Index",
           "value.$": "$$.Map.Item.Value"
         }
       }
     }
   }
   ```

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

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

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

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

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

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

## 7단계: 상태 머신 실행
<a name="use-dist-map-sm-run"></a>

*실행*은 워크플로를 실행하여 작업을 수행하는 상태 머신의 인스턴스입니다.

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

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

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

   1. (선택 사항) **입력** 상자에 입력 값을 JSON 형식으로 입력하여 워크플로를 실행합니다.

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

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

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

   예를 들어 `Map` 상태를 선택한 다음 **맵 실행**을 선택하여 *맵 실행 세부 정보* 페이지를 엽니다. 이 페이지에서 *Distributed Map 상태*의 모든 실행 세부 정보와 이 상태가 시작된 하위 워크플로 실행을 볼 수 있습니다. 이 페이지에 대한 자세한 내용은 [맵 실행 보기](concepts-examine-map-run.md) 섹션을 참조하세요.