

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

# Step Functions를 사용하여 Activity 상태 머신 만들기
<a name="tutorial-creating-activity-state-machine"></a>

이 자습서에서는 Java 및 AWS Step Functions을 사용하여 활동 기반 상태 머신을 생성하는 방법을 소개합니다. 활동을 사용하면 상태 머신의 다른 위치에서 실행되는 작업자 코드를 제어할 수 있습니다. 개요는 [Step Functions의 상태 머신에 대해 알아봅니다.](concepts-statemachines.md)의 [Step Functions의 활동에 대해 알아보기](concepts-activities.md) 단원을 참조하십시오.

이 자습서를 완료하려면 다음이 필요합니다.
+ [Java용 SDK](https://aws.amazon.com/sdk-for-java/). 이 자습서의 예제 활동은를 사용하여와 AWS SDK for Java 통신하는 Java 애플리케이션입니다 AWS.
+ AWS 환경 또는 표준 AWS 구성 파일의 자격 증명. 자세한 내용은 *AWS SDK for Java 개발자 안내서*의 자격 [AWS 증명 설정을 참조하세요](https://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/set-up-creds.html).

## 1단계: 활동 생성
<a name="create-activity-state-machine-step-1"></a>

Step Functions가 만들려는 *작업자*(프로그램)의 *활동*을 인식하게 해야 합니다. Step Functions는 활동 ID를 설정하는 Amazon 리소스 이름(ARN)으로 응답합니다. 이 자격 증명을 사용하면 상태 머신 및 작업자 사이에서 전달되는 정보를 조정할 수 있습니다.

**중요**  
활동 작업이 상태 시스템과 동일한 AWS 계정에 있는지 확인합니다.

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home) 왼쪽에 있는 탐색 창에서 **활동**을 선택합니다.

1. **활동 생성**을 선택합니다.

1. 활동 **이름**(예: `get-greeting`)을 입력한 다음 **활동 생성**을 선택합니다.

1. 활동 작업이 생성되면 다음 예제와 같이 해당 ARN을 적어 둡니다.

   ```
   arn:aws:states:region:123456789012:activity:get-greeting
   ```

## 2단계: 상태 머신 만들기
<a name="create-activity-state-machine-step-2"></a>

활동 호출 시기 및 작업자가 주요 작업을 수행하고 결과를 수집하고 이를 반환해야 하는 시기를 결정하는 상태 머신을 생성합니다. 상태 머신을 만들려면 Workflow Studio의 [코드 편집기](workflow-studio.md#wfs-interface-code-editor)를 사용합니다.

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home) 왼쪽에 있는 탐색 창에서 **상태 머신**을 선택합니다.

1. **상태 머신** 페이지에서 **상태 머신 생성**을 선택합니다.

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

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

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

1. 기존 보일러플레이트 코드를 제거하고 다음 코드를 붙여넣습니다. `Resource` 필드의 예 ARN을 [1단계: 활동 생성](#create-activity-state-machine-step-1)에서 이전에 만든 활동 작업의 ARN으로 바꿔야 합니다.

   ```
   {
     "Comment": "An example using a Task state.",
     "StartAt": "getGreeting",
     "Version": "1.0",
     "TimeoutSeconds": 300,
     "States":
     {
       "getGreeting": {
         "Type": "Task",
         "Resource": "arn:aws:states:region:123456789012:activity:get-greeting",
         "End": true
       }
     }
   }
   ```

   이 예제는 [Amazon States Language](concepts-amazon-states-language.md)(ASL)를 사용하는 상태 머신에 대한 설명입니다. 이 예에서는 `getGreeting`라는 하나의 `Task` 상태를 정의합니다. 자세한 내용은 [상태 머신 구조](statemachine-structure.md)를 참조하십시오.

1. [그래프 시각화](workflow-studio.md#wfs-interface-code-graph-viz)에서 추가한 ASL 정의의 워크플로 그래프가 다음 그래프와 비슷한지 확인합니다.  
![\[RunActivity 태스크 상태를 사용한 상태 머신의 그래프 시각화.\]](http://docs.aws.amazon.com/ko_kr/step-functions/latest/dg/images/tutorial-create-state-machine-custom-preview.png)

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

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

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

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

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

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

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

## 3단계: 작업자 구현
<a name="create-activity-state-machine-step-3"></a>

*작업자*를 생성합니다. 작업자는 다음을 수행하는 프로그램입니다.
+ `GetActivityTask` API 작업을 사용하여 활동에 대한 Step Functions 폴링
+ 코드를 사용하여 활동 작업 수행(예: 다음 코드의 `getGreeting()` 메서드).
+ `SendTaskSuccess`, `SendTaskFailure` 및 `SendTaskHeartbeat` API 작업을 사용하여 결과 반환.

**참고**  
활동 작업자의 보다 완벽한 예제는 [예제: Ruby 활동 작업자](concepts-activities.md#example-ruby-activity-worker)를 참조하십시오. 이 예제는 사용자가 활동 작업자에 대한 참조로 사용할 수 있는 모범 사례를 기반으로 한 구현을 제공합니다. 이 코드는 폴러 및 활동 작업자용 스레드 수를 구성할 수 있는 소비자-생산자 패턴을 구현합니다.

### 작업자를 구현하려면
<a name="create-activity-state-machine-implement-worker"></a>

1. `GreeterActivities.java`이라는 이름의 파일을 만듭니다.

1. 파일에 다음 코드를 추가합니다.

   ```
   import com.amazonaws.ClientConfiguration;
   import com.amazonaws.auth.EnvironmentVariableCredentialsProvider;
   import com.amazonaws.regions.Regions;
   import com.amazonaws.services.stepfunctions.AWSStepFunctions;
   import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder;
   import com.amazonaws.services.stepfunctions.model.GetActivityTaskRequest;
   import com.amazonaws.services.stepfunctions.model.GetActivityTaskResult;
   import com.amazonaws.services.stepfunctions.model.SendTaskFailureRequest;
   import com.amazonaws.services.stepfunctions.model.SendTaskSuccessRequest;
   import com.amazonaws.util.json.Jackson;
   import com.fasterxml.jackson.databind.JsonNode;
   import java.util.concurrent.TimeUnit;
   
   
   public class GreeterActivities {
   
       public String getGreeting(String who) throws Exception {
           return "{\"Hello\": \"" + who + "\"}";
       }
   
       public static void main(final String[] args) throws Exception {
           GreeterActivities greeterActivities = new GreeterActivities();
           ClientConfiguration clientConfiguration = new ClientConfiguration();
           clientConfiguration.setSocketTimeout((int)TimeUnit.SECONDS.toMillis(70));
   
           AWSStepFunctions client = AWSStepFunctionsClientBuilder.standard()
                   .withRegion(Regions.US_EAST_1)
                   .withCredentials(new EnvironmentVariableCredentialsProvider())
                   .withClientConfiguration(clientConfiguration)
                   .build();
   
           while (true) {
               GetActivityTaskResult getActivityTaskResult =
                       client.getActivityTask(
                               new GetActivityTaskRequest().withActivityArn(ACTIVITY_ARN));
   
               if (getActivityTaskResult.getTaskToken() != null) {
                   try {
                       JsonNode json = Jackson.jsonNodeOf(getActivityTaskResult.getInput());
                       String greetingResult =
                               greeterActivities.getGreeting(json.get("who").textValue());
                       client.sendTaskSuccess(
                               new SendTaskSuccessRequest().withOutput(
                                       greetingResult).withTaskToken(getActivityTaskResult.getTaskToken()));
                   } catch (Exception e) {
                       client.sendTaskFailure(new SendTaskFailureRequest().withTaskToken(
                               getActivityTaskResult.getTaskToken()));
                   }
               } else {
                   Thread.sleep(1000);
               }
           }
       }
   }
   ```
**참고**  
이 예제의 `EnvironmentVariableCredentialsProvider` 클래스는 `AWS_ACCESS_KEY_ID`(또는 `AWS_ACCESS_KEY`) 및 `AWS_SECRET_KEY`(또는 `AWS_SECRET_ACCESS_KEY`) 환경 변수가 설정되어 있다고 가정합니다. 공장에 필요한 자격 증명을 제공하는 방법에 대한 자세한 내용은 *AWS SDK for Java API 참조의* [AWSCredentialsProvider](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/AWSCredentialsProvider.html) 및 *AWS SDK for Java 개발자 안내서*의 [개발을 위한 AWS 자격 증명 및 리전 설정을 참조하세요](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html).  
기본적으로 AWS SDK는 모든 작업에 대해 서버에서 데이터를 수신하기 위해 최대 50초까지 기다립니다. `GetActivityTask` 작업은 사용 가능한 다음 작업에 대해 최대 60초 동안 대기하는 긴 폴링 작업입니다. `SocketTimeoutException` 오류를 방지하려면 SocketTimeout을 70초로 설정합니다.

1. `GetActivityTaskRequest().withActivityArn()` 생성자의 파라미터 목록에서 `ACTIVITY_ARN` 값을 앞서 [1단계: 활동 생성](#create-activity-state-machine-step-1)에서 생성한 활동 작업의 ARN으로 바꿉니다.

## 4단계: 상태 머신 실행
<a name="create-activity-state-machine-step-4"></a>

상태 머신 실행을 시작하면 작업자가 활동에 대해 Step Functions를 폴링하고 작업을 수행(제공한 입력 사용)하고 결과를 반환합니다.

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

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

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

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

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

      ```
      {
        "who": "AWS Step Functions"
      }
      ```

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

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

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

## 5단계: 작업자 실행 및 중지
<a name="create-activity-state-machine-step-5"></a>

작업자가 활동을 위해 상태 머신을 폴링하도록 하려면 작업자를 실행해야 합니다.

1. 명령줄에서 `GreeterActivities.java`를 생성한 디렉터리로 이동합니다.

1.  AWS SDK를 사용하려면 `lib` 및 `third-party` 디렉터리의 전체 경로를 빌드 파일의 종속성 및 Java에 추가합니다`CLASSPATH`. 자세한 내용은 *AWS SDK for Java 개발자 안내서*의 [SDK 다운로드 및 추출](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-install.html#download-and-extract-sdk)을 참조하세요.

1. 파일을 컴파일합니다.

   ```
   $ javac GreeterActivities.java
   ```

1.  파일을 실행합니다.

   ```
   $ java GreeterActivities
   ```

1. [Step Functions 콘솔](https://console.aws.amazon.com/states/home?region=us-east-1#/)에서 *실행 세부 정보* 페이지로 이동합니다.

1. 실행이 완료되면 실행 결과를 검사합니다.

1. 작업자를 중지합니다.