

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

# Amazon SWF API 작업
<a name="swf-dg-using-swf-api"></a>

에 설명된 AWS SDKs를 사용하는 것 외에도 HTTP API를 직접 사용할 [AWS SDKs 사용하여 개발](intro.md#aws-sdks)수 있습니다.

이 API를 사용하려면 도메인, 워크플로우 및 활동에 사용할 리전에 맞는 [SWF 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#swf_region)로 HTTP 요청을 전송합니다. Amazon SWF의 HTTP 요청에 대한 자세한 내용은 [Amazon SWF에 대한 HTTP 요청 만들기](UsingJSON-swf.md) 단원을 참조하십시오.

이 단원에서는 HTTP API를 사용해 Amazon SWF에서 워크플로를 개발하는 과정을 기본적으로 소개합니다. 타이머 사용, CloudTrail을 사용한 로깅, 워크플로에 태그 지정과 같은 고급 기능에 대해서는 [Amazon SWF의 기본 워크플로 개념](swf-dg-basic.md) 단원에서 설명합니다.

**Topics**
+ [HTTP 요청 만들기](UsingJSON-swf.md)
+ [Amazon SWF 작업 목록](swf-api-by-category.md)
+ [도메인 등록](swf-dg-register-domain-api.md)
+ [제한 시간 값 설정](setting-timeouts.md)
+ [워크플로 유형 등록](swf-dg-register-workflow.md)
+ [활동 유형 등록](swf-dg-register-activity.md)
+ [Lambda 작업](lambda-task.md)
+ [활동 작업자 개발](swf-dg-develop-activity.md)
+ [결정자 개발](swf-dg-dev-deciders.md)
+ [워크플로 시작](swf-dg-start-workflow-exec.md)
+ [작업 우선 순위 설정](programming-priority.md)
+ [오류 처리](swf-dg-error-handling.md)

# Amazon SWF에 대한 HTTP 요청 만들기
<a name="UsingJSON-swf"></a>

 AWS SDKs 중 하나를 사용하지 않는 경우 POST 요청 방법을 사용하여 HTTP를 통해 Amazon Simple Workflow Service(Amazon SWF) 작업을 수행할 수 있습니다. POST 메서드를 사용하는 경우, 요청의 헤더에 작업을 지정하고 요청 본문에 JSON 형식으로 작업 데이터를 입력해야 합니다.

## HTTP 헤더 콘텐츠
<a name="HTTPHeader"></a>

Amazon SWF는 HTTP 요청의 헤더에 다음 정보를 제공해야 합니다.
+ `host` Amazon SWF 엔드포인트 
+ `x-amz-date` HTTP `Date` 헤더 또는 AWS `x-amz-date header`에 타임스탬프를 제공해야 합니다(일부 HTTP 클라이언트 라이브러리에서는 `Date` 헤더를 설정할 수 없음). `x-amz-date` 헤더가 있으면 요청 인증 시 모든 `Date` 헤더가 무시됩니다.

  HTTP/1.1 RFC에 지정된 다음 3개 형식 중 하나로 날짜를 지정해야 합니다.
  + Sun, 06 Nov 1994 08:49:37 GMT (RFC 822, RFC 1123 이후)
  + Sunday, 06-Nov-94 08:49:37 GMT(RFC 1036에 의해 폐기된 RFC 850)
  + Sun Nov 6 08:49:37 1994 (ANSI C's asctime() 형식)
+ `x-amzn-authorization`: 다음 형식의 서명된 요청 파라미터입니다.

  ```
  AWS3 AWSAccessKeyId=####,Algorithm=HmacSHA256, [,SignedHeaders=Header1;Header2;...]
  Signature=S(StringToSign)
  ```

  `AWS3` - 요청에 서명하는 데 사용되는 인증 버전을 나타내는 AWS 구현별 태그입니다(현재 Amazon SWF의 경우이 값은 항상 임`AWS3`).

  `AWSAccessKeyId` - AWS 액세스 키 ID입니다.

  `Algorithm` – 서명할 문자열의 HMAC-SHA 값(예: `HmacSHA256` 또는 `HmacSHA1`)을 생성하는 데 사용되는 알고리즘입니다.

  `Signature` – Base64[알고리즘(StringToSign, SigningKey)]. 자세한 내용은 [Amazon SWF에 대한 HMAC-SHA 서명 계산](HMACAuth-swf.md) 단원을 참조하십시오.

  `SignedHeaders` – (선택)이 헤더가 있는 경우, 규정화된 HttpHeaders 계산에 사용되는 모든 HTTP 헤더 목록을 포함해야 합니다. 세미콜론 문자(;)(ASCII 문자 59) 하나를 목록 값의 구분 기호로 사용해야 합니다.
+  `x-amz-target` – 요청 및 데이터 작업의 대상 서비스로 다음과 같은 형식을 띱니다.

  ` com.amazonaws.swf.service.model.SimpleWorkflowService. + <action> `

   예: `com.amazonaws.swf.service.model.SimpleWorkflowService.RegisterDomain` 
+ `content-type` – JSON 및 `application/json; charset=UTF-8` 같은 문자 세트를 지정하는 데 필요한 유형입니다.

 다음은 도메인을 만들기 위한 HTTP 요청의 예제 헤더입니다.

```
POST http://swf.us-east-1.amazonaws.com/ HTTP/1.1
Host: swf.us-east-1.amazonaws.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.25) Gecko/20111212 Firefox/3.6.25 ( .NET CLR 3.5.30729; .NET4.0E)
Accept: application/json, text/javascript, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
X-Requested-With: XMLHttpRequest
X-Amz-Date: Fri, 13 Jan 2012 18:42:12 GMT
X-Amz-Target: com.amazonaws.swf.service.model.SimpleWorkflowService.RegisterDomain
Content-Encoding: amz-1.0
X-Amzn-Authorization: AWS3 AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE,Algorithm=HmacSHA256,SignedHeaders=Host;X-Amz-Date;X-Amz-Target;Content-Encoding,Signature=tzjkF55lxAxPhzp/BRGFYQRQRq6CqrM254dTDE/EncI=
Referer: http://swf.us-east-1.amazonaws.com/explorer/index.html
Content-Length: 91
Pragma: no-cache
Cache-Control: no-cache

{"name": "867530902",
 "description": "music",
 "workflowExecutionRetentionPeriodInDays": "60"}
```

다음은 해당하는 HTTP 응답의 예입니다.

```
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: application/json
x-amzn-RequestId: 4ec4ac3f-3e16-11e1-9b11-7182192d0b57
```

## HTTP 본문
<a name="JSONschema"></a>

HTTP 요청의 본문에는 HTTP 요청의 헤더에 지정한 작업의 데이터가 포함되며, JSON 데이터 형식을 사용하여 데이터 값과 데이터 구조를 동시에 표현합니다. 괄호 표기를 사용하여 요소를 다른 요소 안에 중첩할 수 있습니다. 예를 들어, 다음은 Unix Time 표기법을 사용하여 지정된 두 시점 사이에 시작된 모든 워크플로 실행을 나열하라는 요청을 보여줍니다.

```
{
 "domain": "867530901",
 "startTimeFilter":
 {
   "oldestDate": 1325376070,
	 "latestDate": 1356998399
 },
 "tagFilter":
 {
   "tag": "music purchase"
 }
}
```

## 예제 Amazon SWF JSON 요청 및 응답
<a name="JSONMajorExample"></a>

다음 예제는 이전에 생성한 도메인을 설명하기 위한 Amazon SWF에 대한 요청을 보여줍니다. 그런 다음에는 Amazon SWF 응답을 보여줍니다.

### HTTP POST 요청
<a name="http-post-request"></a>

```
POST http://swf.us-east-1.amazonaws.com/ HTTP/1.1
Host: swf.us-east-1.amazonaws.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.25) Gecko/20111212 Firefox/3.6.25 ( .NET CLR 3.5.30729; .NET4.0E)
Accept: application/json, text/javascript, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
X-Requested-With: XMLHttpRequest
X-Amz-Date: Sun, 15 Jan 2012 03:13:33 GMT
X-Amz-Target: com.amazonaws.swf.service.model.SimpleWorkflowService.DescribeDomain
Content-Encoding: amz-1.0
X-Amzn-Authorization: AWS3 AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE,Algorithm=HmacSHA256,SignedHeaders=Host;X-Amz-Date;X-Amz-Target;Content-Encoding,Signature=IFJtq3M366CHqMlTpyqYqd9z0ChCoKDC5SCJBsLifu4=
Referer: http://swf.us-east-1.amazonaws.com/explorer/index.html
Content-Length: 21
Pragma: no-cache
Cache-Control: no-cache

{"name": "867530901"}
```

### Amazon SWF 응답
<a name="swf-response"></a>

```
HTTP/1.1 200 OK
Content-Length: 137
Content-Type: application/json
x-amzn-RequestId: e86a6779-3f26-11e1-9a27-0760db01a4a8

{"configuration":
  {"workflowExecutionRetentionPeriodInDays": "60"},
 "domainInfo":
  {"description": "music",
   "name": "867530901",
   "status": "REGISTERED"}
}
```

프로토콜(`HTTP/1.1`) 다음에는 상태 코드(`200`)가 따라 옵니다. 코드 값 `200`은 작업 성공을 나타냅니다.

Amazon SWF는 null 값을 직렬화하지 않습니다. JSON 구문 분석기가 요청에 대한 null 값을 직렬화하도록 설정된 경우 Amazon SWF에서는 이러한 값을 무시합니다.

# Amazon SWF에 대한 HMAC-SHA 서명 계산
<a name="HMACAuth-swf"></a>

Amazon SWF에 대한 모든 요청은 인증해야 합니다. AWS SDKs는 요청에 자동으로 서명하고 토큰 기반 인증을 관리합니다. 그러나 자체 HTTP `POST` 요청을 작성하려는 경우 요청 인증의 일부로 HTTP `POST Header` 콘텐츠에 대한 `x-amzn-authorization` 값을 생성해야 합니다.

헤더 형식 지정에 대한 자세한 내용은 [HTTP 헤더 콘텐츠](UsingJSON-swf.md#HTTPHeader) 단원을 참조하십시오. AWS 버전 3 서명 AWS SDK for Java 구현은 [ AWSSigner.java](https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/auth/AWS3Signer.java) 클래스를 참조하세요.

## 요청 서명 생성
<a name="AuthProcess"></a>

HMAC-SHA 요청 서명을 생성하려면 AWS 자격 증명(액세스 키 ID 및 보안 키)을 얻어야 합니다.

**중요**  
SHA1 또는 SHA256을 사용하여 요청에 서명할 수 있습니다. 그러나 서명 프로세스 전체에서 동일한 방법을 사용해야 합니다. 선택한 메서드는 HTTP 헤더의 `Algorithm` 이름 값과 일치해야 합니다.

### 요청 서명을 생성하려면
<a name="swf-create-request-signature-steps"></a>

1. HTTP 요청 헤더의 표준 양식을 생성합니다. HTTP 헤더의 표준 양식에는 다음이 포함됩니다.
   + `host`
   + `x-amz-`로 시작되는 모든 헤더 요소

   포함된 헤더에 대한 자세한 내용은 [HTTP 헤더 콘텐츠](UsingJSON-swf.md#HTTPHeader) 단원을 참조하십시오.

   1. 각 헤더 이름-값 페어의 경우 헤더 이름(헤더 값 아님)을 소문자로 변환합니다.

   1. 헤더 이름 맵을 쉼표로 구분된 헤더 값으로 작성합니다.

      ```
      x-amz-example: value1
      x-amz-example: value2  =>  x-amz-example:value1,value2
      ```

      자세한 내용은 [RFC 2616의 섹션 4.2](http://tools.ietf.org/html/rfc2616)를 참조하십시오.

   1. 각 헤더 이름-값 페어의 경우 이름-값 페어를 `headerName:headerValue` 형식의 문자열로 변환합니다. 콜론 양쪽에 공백이 없도록 하고, `headerName` 및 `headerValue` 모두 시작 및 끝부분에서 공백을 잘라냅니다.

      ```
      x-amz-example1:value1,value2
      x-amz-example2:value3
      ```

   1. 마지막 문자열을 포함하여 변환된 각 문자열 뒤에 새 줄(`U+000A`)을 삽입합니다.

   1. 변환된 문자열 컬렉션을 헤더 이름에 따라 영문자순으로 정렬합니다.

1. 다음 항목이 포함된 서명할 문자열 값을 생성합니다.
   + 줄 `1`: HTTP 메서드(`POST`), 뒤에서 줄바꿈합니다.
   + 줄 `2`: 요청 URI(`/`), 뒤에서 줄바꿈합니다.
   + 줄 `3`: 빈 문자열, 뒤에서 줄바꿈합니다.
**참고**  
일반적으로 여기에 쿼리 문자열이 나타나지만 Amazon SWF는 쿼리 문자열을 사용하지 않습니다.
   + 줄 `4–n`: 1단계에서 계산한 정규화된 요청 헤더를 나타내는 문자열로, 뒤에서 줄바꿈합니다. 이 새 줄 때문에 HTTP 요청의 헤더와 본문 사이에 빈 줄이 생깁니다. 자세한 내용은 [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html)를 참조하십시오.
   + 요청 본문 뒤에는 줄바꿈하지 *않습니다*.

1. 서명할 문자열 값의 SHA256 또는 SHA1 다이제스트를 계산합니다. 프로세스 전체에서 동일한 SHA 메서드를 사용합니다.

1. 이전 단계에서 생성된 값의 SHA256 또는 SHA1 다이제스트(사용한 방법에 따라 다름)를 사용하고 `[GetSessionToken](https://docs.aws.amazon.com/STS/latest/UsingSTS/CreatingSessionTokens.html)` API 작업을 사용하여 AWS Security Token Service의 임시 보안 액세스 키를 사용하여 HMAC-SHA를 계산하고 Base64-encode합니다.
**참고**  
Amazon SWF는 Base64로 인코딩된 HMAC-SHA 값 끝에 등호(`=`)가 있어야 합니다. Base64 인코딩 루틴에 등호가 추가되어 있지 않으면 값의 끝에 등호를 추가합니다.

   Amazon SWF 및 기타 AWS 서비스에서 임시 보안 자격 증명을 사용하는 방법에 대한 자세한 내용은 [AWS IAM 사용 설명서의 IAM으로 작업하는 서비스를](https://docs.aws.amazon.com/STS/latest/UsingSTS/UsingTokens.html) 참조하세요. ** 

1. Amazon SWF에 대한 HTTP 요청의 `x-amzn-authorization` 헤더에 `Signature` 이름에 대한 값으로 결과 값을 배치합니다.

1. Amazon SWF는 요청을 확인하고 지정된 작업을 수행합니다.

# 범주별 Amazon SWF 작업 목록
<a name="swf-api-by-category"></a>

이 단원에는 Amazon SWF 애플리케이션 프로그래밍 인터페이스(API)의 Amazon SWF 작업에 대한 참조 항목이 나열되어 있습니다. 참조 항목은 *기능 범주*별로 나열됩니다.

*영문자순* 작업 목록은 [Amazon Simple Workflow Service API 참조](https://docs.aws.amazon.com/amazonswf/latest/apireference/)를 참조하십시오.

**Topics**
+ [활동 관련 작업](#swf-api-activities)
+ [결정자 관련 작업](#swf-api-deciders)
+ [워크플로 실행 관련 작업](#swf-api-executions)
+ [관리 관련 작업](#swf-api-administration)
+ [가시성 작업](#swf-api-visibility)

## 활동 관련 작업
<a name="swf-api-activities"></a>

활동 작업자는 `PollForActivityTask`를 사용하여 새 활동 작업을 가져옵니다. 작업자는 Amazon SWF에서 활동 태스크를 수신한 후 태스크를 수행하고 성공한 경우 `RespondActivityTaskCompleted`, 실패한 경우 `RespondActivityTaskFailed`를 사용하여 응답합니다.

활동 작업자가 수행하는 작업은 다음과 같습니다.
+ `[PollForActivityTask](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_PollForActivityTask.html)`
+ `[RespondActivityTaskCompleted](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondActivityTaskCompleted.html)`
+ `[RespondActivityTaskFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondActivityTaskFailed.html)`
+ `[RespondActivityTaskCanceled](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondActivityTaskCanceled.html)`
+ `[RecordActivityTaskHeartbeat](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RecordActivityTaskHeartbeat.html)`

## 결정자 관련 작업
<a name="swf-api-deciders"></a>

결정자는 `PollForDecisionTask`를 사용하여 의사 결정 작업을 가져옵니다. 결정자는 Amazon SWF에서 의사 결정 태스크를 수신한 후 워크플로 실행 기록을 검사하고 다음에 수행할 작업을 결정합니다. 그리고 `RespondDecisionTaskCompleted`를 호출하여 의사 결정 작업을 완료하고 0개 이상의 다음 의사 결정을 제공합니다.

결정자가 수행하는 작업은 다음과 같습니다.
+ `[PollForDecisionTask](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_PollForDecisionTask.html)`
+ `[RespondDecisionTaskCompleted](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondDecisionTaskCompleted.html)`

## 워크플로 실행 관련 작업
<a name="swf-api-executions"></a>

워크플로 실행에서 작동하는 작업은 다음과 같습니다.
+ `[RequestCancelWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RequestCancelWorkflowExecution.html)`
+ `[StartWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_StartWorkflowExecution.html)`
+ `[SignalWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_SignalWorkflowExecution.html)`
+ `[TerminateWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_TerminateWorkflowExecution.html)`

## 관리 관련 작업
<a name="swf-api-administration"></a>

Amazon SWF 콘솔에서 관리 태스크를 수행할 수 있지만 이 섹션의 활동을 사용하여 기능을 자동화하거나 고유한 관리 도구를 개발할 수 있습니다.

### 활동 관리
<a name="activity-management"></a>
+ `[RegisterActivityType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterActivityType.html)`
+ `[DeprecateActivityType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DeprecateActivityType.html)`
+ `[UndeprecateActivityType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_UndeprecateActivityType.html)`
+ `[DeleteActivityType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DeleteActivityType.html)`

### 워크플로우 관리
<a name="workflow-management"></a>
+ `[RegisterWorkflowType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterWorkflowType.html)`
+ `[DeprecateWorkflowType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DeprecateWorkflowType.html)`
+ `[UndeprecateWorkflowType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_UndeprecateWorkflowType.html)`
+ `[DeleteWorkflowType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DeleteWorkflowType.html)`

### 도메인 관리
<a name="domain-management"></a>

다음 작업을 사용하면 Amazon SWF 도메인을 등록 및 사용 중지할 수 있습니다.
+ `[RegisterDomain](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterDomain.html)`
+ `[DeprecateDomain](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DeprecateDomain.html)`
+ `[UndeprecateDomain](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_UndeprecateDomain.html)`

도메인 관리 작업에 대한 예 및 자세한 내용은 [Amazon SWF에 도메인 등록](swf-dg-register-domain-api.md) 단원을 참조하십시오.

### 워크플로 실행 관리
<a name="workflow-execution-management"></a>
+ `[RequestCancelWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RequestCancelWorkflowExecution.html)`
+ `[TerminateWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_TerminateWorkflowExecution.html)`

## 가시성 작업
<a name="swf-api-visibility"></a>

Amazon SWF 콘솔에서 가시성 태스크를 수행할 수 있지만 이 섹션의 활동을 사용하여 고유한 콘솔 또는 관리 도구를 개발할 수 있습니다.

### 활동 가시성
<a name="activity-visibility"></a>
+ `[ListActivityTypes](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ListActivityTypes.html)`
+ `[DescribeActivityType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DescribeActivityType.html)`

### 워크플로우 가시성
<a name="workflow-visibility"></a>
+ [ListWorkflowTypes](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ListWorkflowTypes.html)
+ [DescribeWorkflowType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DescribeWorkflowType.html)

### 워크플로우 실행 가시성
<a name="workflow-execution-visibility"></a>
+ `[DescribeWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DescribeWorkflowExecution.html)`
+ `[ListOpenWorkflowExecutions](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ListOpenWorkflowExecutions.html)`
+ `[ListClosedWorkflowExecutions](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ListClosedWorkflowExecutions.html)`
+ `[CountOpenWorkflowExecutions](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_CountOpenWorkflowExecutions.html)`
+ `[CountClosedWorkflowExecutions](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_CountClosedWorkflowExecutions.html)`
+ `[GetWorkflowExecutionHistory](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_GetWorkflowExecutionHistory.html)`

### 도메인 가시성
<a name="domain-visibility"></a>
+ `[ListDomains](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ListDomains.html)`
+ `[DescribeDomain](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DescribeDomain.html)`

### 작업 목록 가시성
<a name="task-list-visibility"></a>
+ `[CountPendingActivityTasks](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_CountPendingActivityTasks.html)`
+ `[CountPendingDecisionTasks](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_CountPendingDecisionTasks.html)`

# Amazon SWF에 도메인 등록
<a name="swf-dg-register-domain-api"></a>

워크플로, 활동 유형 및 워크플로 실행 자체는 모두 *도메인*으로 범위가 지정됩니다. 도메인은 유형, 실행 및 작업 목록을 동일한 계정 내의 다른 항목과 격리합니다.

를 사용하거나 Amazon SWF API의 `RegisterDomain` 작업을 AWS Management Console 사용하여 도메인을 등록할 수 있습니다. 다음 예에서는 API를 사용합니다.

```
https://swf.us-east-1.amazonaws.com
RegisterDomain
{
  "name" : "867530901",
  "description" : "music",
  "workflowExecutionRetentionPeriodInDays" : "60"
}
```

파라미터는 JavaScript Object Notation(JSON) 형식으로 지정됩니다. 여기서 보존 기간은 60일로 설정됩니다. 보존 기간 동안 워크플로 실행에 대한 모든 정보는 AWS Management Console 또는 Amazon SWF API를 사용하는 가시성 작업을 통해 확인할 수 있습니다.

도메인을 등록한 후에는 워크플로 유형과 해당 워크플로에서 사용하는 활동 유형을 등록해야 합니다. 등록된 도메인 이름이 워크플로 및 활동 유형을 등록하기 위한 필수 정보의 일부이기 때문에 도메인을 먼저 등록해야 합니다.

## 참고
<a name="registering-domain-see-also"></a>

*Amazon Simple Workflow Service API 참조*의 `[RegisterDomain](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterDomain.html)`

# Amazon SWF에서 제한 시간 값 설정
<a name="setting-timeouts"></a>

**Topics**
+ [제한 시간 값에 대한 할당량](#setting-timeouts-limits)
+ [워크플로 실행 및 결정 작업 제한 시간](#setting-timeouts-execution)
+ [활동 작업의 제한 시간](#setting-timeouts-activity)
+ [참고](#timeout-types-see-also)

## 제한 시간 값에 대한 할당량
<a name="setting-timeouts-limits"></a>

제한 시간 값은 항상 초 단위로 선언되며 모든 워크플로 또는 활동의 최대 실행 제한인 1년(31536000초)까지 임의의 초 단위로 설정할 수 있습니다. 특수 값인 `NONE`은 제한 시간 파라미터를 "제한 시간 없음" 또는 무한대로 설정하는 데 사용할 수 있지만 1년의 최대 제한은 계속해서 적용됩니다.

## 워크플로 실행 및 결정 작업 제한 시간
<a name="setting-timeouts-execution"></a>

워크플로 유형을 등록할 때 워크플로 및 결정 작업에 대한 제한 시간 값을 설정할 수 있습니다. 예:

```
https://swf.us-east-1.amazonaws.com
RegisterWorkflowType
{
  "domain": "867530901",
  "name": "customerOrderWorkflow",
  "version": "1.0",
  "description": "Handle customer orders",
  "defaultTaskStartToCloseTimeout": "600",
  "defaultExecutionStartToCloseTimeout": "3600",
  "defaultTaskList": { "name": "mainTaskList" },
  "defaultChildPolicy": "TERMINATE"
}
```

워크플로 유형 등록은 `[defaultTaskStartToCloseTimeout](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterWorkflowType.html#SWF-RegisterWorkflowType-request-defaultTaskStartToCloseTimeout)`을 600초(10분)로 설정하고 `[defaultExecutionStartToCloseTimeout](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterWorkflowType.html#SWF-RegisterWorkflowType-request-defaultExecutionStartToCloseTimeout)`은 3600초(1시간)로 설정합니다.

워크플로 유형 등록에 대한 자세한 내용은 [Amazon SWF에 워크플로 유형 등록](swf-dg-register-workflow.md) 및 *Amazon Simple Workflow Service API 참조*의 `[RegisterWorkflowType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterWorkflowType.html)`을 참조하십시오.

`[executionStartToCloseTimeout](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_StartWorkflowExecution.html#SWF-StartWorkflowExecution-request-executionStartToCloseTimeout) `를 지정해 `defaultExecutionStartToCloseTimeout`에 대해 설정된 값을 재정의할 수 있습니다.

## 활동 작업의 제한 시간
<a name="setting-timeouts-activity"></a>

활동 유형을 등록할 때 활동 작업에 대한 제한 시간 값을 설정할 수 있습니다. 예:

```
https://swf.us-east-1.amazonaws.com
RegisterActivityType
{
  "domain": "867530901",
  "name": "activityVerify",
  "version": "1.0",
  "description": "Verify the customer credit",
  "defaultTaskStartToCloseTimeout": "600",
  "defaultTaskHeartbeatTimeout": "120",
  "defaultTaskList": { "name": "mainTaskList" },
  "defaultTaskScheduleToStartTimeout": "1800",
  "defaultTaskScheduleToCloseTimeout": "5400"
}
```

이 활동 유형 등록은 `[defaultTaskStartToCloseTimeout](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterActivityType.html#SWF-RegisterActivityType-request-defaultTaskStartToCloseTimeout)`을 600초(10분)으로, `[defaultTaskHeartbeatTimeout](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterActivityType.html#SWF-RegisterActivityType-request-defaultTaskHeartbeatTimeout)`은 120초(2분)으로, `[defaultTaskScheduleToStartTimeout](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterActivityType.html#SWF-RegisterActivityType-request-defaultTaskScheduleToStartTimeout)`은 1800초(30분)로, `[defaultTaskScheduleToCloseTimeout](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterActivityType.html#SWF-RegisterActivityType-request-defaultTaskScheduleToCloseTimeout)`은 5400초(1.5시간)로 설정합니다.

활동 유형 등록에 대한 자세한 내용은 [Amazon SWF에 활동 유형 등록](swf-dg-register-activity.md) 및 *Amazon Simple Workflow Service API 참조*의 `[RegisterActivityType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterActivityType.html)`을 참조하십시오.

활동 작업을 예약할 때 `[taskStartToCloseTimeout](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_StartWorkflowExecution.html#SWF-StartWorkflowExecution-request-taskStartToCloseTimeout)`를 지정하여 `defaultTaskStartToCloseTimeout`에 대해 설정된 값을 재정의할 수 있습니다.

## 참고
<a name="timeout-types-see-also"></a>

[Amazon SWF 제한 시간 유형](swf-timeout-types.md)

# Amazon SWF에 워크플로 유형 등록
<a name="swf-dg-register-workflow"></a>

이 단원에서 설명하는 예에서는 Amazon SWF API를 사용하여 워크플로 유형을 등록합니다. 등록 중 지정한 이름 및 버전이 워크플로 유형에 대한 고유한 식별자를 구성합니다. 지정된 도메인은 `[RegisterDomain](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterDomain.html)` API 작업을 사용해 이미 등록되어 있어야 합니다.

다음 예에서 시간 제한 파라미터는 초 단위로 지정된 기간 값입니다. `defaultTaskStartToCloseTimeout` 파라미터의 경우 제한 시간이 없음을 나타내는 기간 지정자 `NONE`을 사용할 수 있습니다. 그러나 `defaultExecutionStartToCloseTimeout`에 대해서는 `NONE` 값을 지정할 수 없습니다. 워크플로 실행을 실행할 수 있는 최대 시간 제한은 1년입니다. 이 제한을 초과하면 항상 워크플로 실행이 시간 초과됩니다. `defaultExecutionStartToCloseTimeout`에 대해 1년보다 긴 값을 지정하면 등록에 실패합니다.

```
https://swf.us-east-1.amazonaws.com
RegisterWorkflowType
{
  "domain" : "867530901",
  "name" : "customerOrderWorkflow",
  "version" : "1.0",
  "description" : "Handle customer orders",
  "defaultTaskStartToCloseTimeout" : "600",
  "defaultExecutionStartToCloseTimeout" : "3600",
  "defaultTaskList" : { "name": "mainTaskList" },
  "defaultChildPolicy" : "TERMINATE"
}
```

## 참고
<a name="registering-workflow-type-see-also"></a>

*Amazon Simple Workflow Service API 참조*의 [RegisterWorkflowType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterWorkflowType.html)

# Amazon SWF에 활동 유형 등록
<a name="swf-dg-register-activity"></a>

다음 예에서는 Amazon SWF API를 사용하여 활동 유형을 등록합니다. 등록 중 지정한 이름 및 버전이 도메인 내에서 활동 유형에 대한 고유한 식별자를 구성합니다. 지정된 도메인은 `RegisterDomain` 작업을 사용해 이미 등록되어 있어야 합니다.

이 예에서 시간 제한 파라미터는 초 단위로 지정된 기간 값입니다. 제한 시간이 없음을 나타내는 기간 지정자 `NONE`을 사용할 수 있습니다.

```
https://swf.us-east-1.amazonaws.com
RegisterActivityType
{
  "domain" : "867530901",
  "name" : "activityVerify",
  "version" : "1.0",
  "description" : "Verify the customer credit",
  "defaultTaskStartToCloseTimeout" : "600",
  "defaultTaskHeartbeatTimeout" : "120",
  "defaultTaskList" : { "name" : "mainTaskList" },
  "defaultTaskScheduleToStartTimeout" : "1800",
  "defaultTaskScheduleToCloseTimeout" : "5400"
}
```

## 참고
<a name="registering-activity-type-with-swf-see-also"></a>

*Amazon Simple Workflow Service API 참조*의 [RegisterActivityType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterActivityType.html)

# AWS Lambda Amazon SWF의 태스크
<a name="lambda-task"></a>

**Topics**
+ [정보 AWS Lambda](#about-aws-lambda)
+ [Lambda 작업 사용의 이점 및 제한 사항](#benefits-limitations-lambda-tasks)
+ [워크플로에서 Lambda 작업 사용](#using-lambda-tasks-in-workflows)

## 정보 AWS Lambda
<a name="about-aws-lambda"></a>

AWS Lambda 는 사용자 지정 코드 또는 Amazon S3, DynamoDB, Amazon Kinesis, Amazon SNS, Amazon Cognito와 같은 다양한 서비스에서 생성된 이벤트에 대한 응답으로 코드를 실행하는 완전관리형 컴퓨팅 AWS 서비스입니다. Lambda에 대한 자세한 내용은 [AWS Lambda 개발자 안내서](https://docs.aws.amazon.com/lambda/latest/dg/)를 참조하세요.

Amazon Simple Workflow Service는 Lambda 작업을 제공하므로 기존 Amazon SWF 활동 대신 또는 이러한 활동과 함께 Lambda 함수를 실행할 수 있습니다.

**중요**  
Amazon SWF가 사용자를 대신하여 실행하는 Lambda 실행(요청)에 대해 AWS 계정에 요금이 부과됩니다. Lambda 요금에 대한 자세한 내용은 [https://aws.amazon.com/lambda/pricing/](https://aws.amazon.com/lambda/pricing/) 참조하십시오.

## Lambda 작업 사용의 이점 및 제한 사항
<a name="benefits-limitations-lambda-tasks"></a>

일반적인 Amazon SWF 활동 대신 Lambda 작업을 사용하면 다음과 같은 여러 가지 이점이 있습니다.
+ Lambda 작업은 Amazon SWF 활동 유형처럼 등록하거나 버전을 관리할 필요가 없습니다.
+ 워크플로에 이미 정의해 둔 기존 Lambda 함수는 어느 것이나 사용할 수 있습니다.
+ Lambda 함수는 Amazon SWF에서 직접 호출하기 때문에 일반적인 활동에 대해 수행해야 하는 것처럼 작업을 실행할 작업자 프로그램을 구현할 필요가 없습니다.
+ Lambda에서는 함수 실행을 추적 및 분석할 수 있도록 측정치 및 로그를 제공합니다.

또한 Lambda 작업과 관련해서는 반드시 알고 있어야 하는 여러 가지 제한 사항이 있습니다.
+ Lambda 태스크는 Lambda에 대한 지원을 제공하는 AWS 리전에서만 실행할 수 있습니다. 현재 Lambda를 지원하는 리전에 대한 자세한 내용은 *Amazon Web Services 일반 참조*의 [Lambda 리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#lambda_region)를 참조하십시오.
+ Lambda 작업은 현재 기본 SWF HTTP API 및 Java AWS Flow Framework 용 에서만 지원됩니다. 현재 for AWS Flow Framework Ruby에서는 Lambda 작업을 지원하지 않습니다.

## 워크플로에서 Lambda 작업 사용
<a name="using-lambda-tasks-in-workflows"></a>

Amazon SWF 워크플로에서 Lambda 작업을 사용하려면 다음을 수행해야 합니다.

1. IAM 역할을 설정하고 Amazon SWF에 Lambda 함수 간접 호출 권한을 제공합니다.

1. 워크플로에 IAM 역할을 연결합니다.

1. 워크플로 실행 중 Lambda 함수를 호출합니다.

### IAM 역할 설정
<a name="set-up-lambda-role"></a>

Amazon SWF에서 Lambda 함수를 간접적으로 호출하려면 Amazon SWF에서 Lambda에 대한 액세스를 제공하는 IAM 역할을 제공해야 합니다. 다음 작업 중 하나를 수행할 수 있습니다.
+ 사전 정의된 역할인 *AWSLambdaRole*을 선택해 워크플로에 계정과 연결된 모든 Lambda 함수를 간접적으로 호출할 수 있는 권한을 부여합니다.
+ 자체 정책 및 연결된 역할을 정의해 Amazon 리소스 이름(ARN)으로 지정된 특정 Lambda 함수를 간접적으로 호출하는 워크플로 권한을 부여합니다.

#### IAM 역할에 대한 권한 제한
<a name="limit-iam-role-permissions"></a>

리소스 신뢰 정책의 `SourceArn` 및 `SourceAccount` 컨텍스트 키를 사용하여 Amazon SWF에 제공하는 IAM 역할에 대한 권한을 제한할 수 있습니다. 이러한 키는 지정된 도메인 ARN에 속하는 Amazon Simple Workflow Service 실행에서만 사용하도록 IAM 정책의 사용을 제한합니다. 두 글로벌 조건 컨텍스트 키를 모두 사용하는 경우 `aws:SourceAccount` 값과 `aws:SourceArn` 값에서 참조되는 계정은 동일한 정책 문에서 사용할 경우 동일한 계정 ID를 사용해야 합니다.

다음 예제에서 `SourceArn` 컨텍스트 키는 계정에 속한 Amazon Simple Workflow Service 실행에서만 IAM 서비스 역할을 사용하도록 제한합니다`someDomain``123456789012`.


+ **문 1**

  **보안 주체**: `"Service": "swf.amazonaws.com"` 

  **작업:** `sts:AssumeRole` 

```
"Condition": {
   "ArnLike": {
     "aws:SourceArn": "arn:aws:swf:*:123456789012:/domain/someDomain"
   }
}
```

다음 예제에서 `SourceAccount` 컨텍스트 키는 계정의 Amazon Simple Workflow Service 실행에서만 IAM 서비스 역할을 사용하도록 제한합니다`123456789012`.

```
"Condition": {
   "StringLike": {
     "aws:SourceAccount": "123456789012"
   }
}
```

#### Amazon SWF에 Lambda 역할을 간접 호출하기 위한 액세스 권한 제공
<a name="providing-swf-access-invoke-any-lambda-role"></a>

사전 정의된 역할인 *AWSLambdaRole*을 사용해 Amazon SWF 워크플로에 계정과 연결된 모든 Lambda 함수를 간접적으로 호출할 수 있는 권한을 부여합니다.

**AWSLambdaRole을 사용해 Amazon SWF에 Lambda 함수를 간접적으로 호출할 수 있는 액세스 권한을 부여하려면**

1. [Amazon IAM 콘솔](https://console.aws.amazon.com/iam/)을 엽니다.

1. [**Roles**]를 선택한 다음 [**Create New Role**]을 선택합니다.

1. `swf-lambda`와 같이 역할에 이름을 지정한 다음 [**Next Step**]을 선택합니다.

1. **AWS 서비스 역할**에서 **Amazon SWF**를 선택하고 **다음 단계**를 선택합니다.

1. **정책 연결** 화면의 목록에서 **AWSLambdaRole**을 선택합니다.

1. 역할을 검토한 후 [**Next Step**]을 선택하고 [**Create Role**]을 선택합니다.

#### 특정 Lambda 함수를 간접 호출할 액세스 권한을 제공하는 IAM 역할 정의
<a name="defining-iam-role-provide-access-invoke-specific-lambda-function"></a>

워크플로에서 특정 Lambda 함수를 간접적으로 호출하는 액세스 권한을 제공하려는 경우 자체 IAM 정책을 정의해야 합니다.

**특정 Lambda 함수에 대한 액세스 권한을 부여하는 IAM 정책을 생성하려면**

1. [Amazon IAM 콘솔](https://console.aws.amazon.com/iam/)을 엽니다.

1. [**Policies**]를 선택한 다음 [**Create Policy**]를 선택합니다.

1. ** AWS 관리형 정책 복사**를 선택하고 목록에서 **AWSLambdaRole**을 선택합니다. 정책이 자동으로 생성됩니다. 경우에 따라 필요에 맞춰 정책 이름 및 설명을 편집합니다.

1. **정책 문서**의 *리소스* 필드에 Lambda 함수의 ARN을 추가합니다. 예:
   + **리소스:** `arn:aws:lambda:us-east-1:111122223333:function:hello_lambda_function` 
**참고**  
IAM 역할에서 리소스를 지정하는 방법에 대한 전체 설명은 *IAM 사용*의 [IAM 정책 개요](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies_overview.html)를 참조하십시오.

1. [**Create policy**]를 선택하여 정책 생성을 마칩니다.

그런 다음 새 IAM 역할을 생성할 때 이 정책을 선택하고 해당 역할을 사용해 Amazon SWF 워크플로에 간접 호출 액세스 권한을 부여합니다. 이 절차는 *AWSLambdaRole* 정책을 사용해 역할을 생성하는 것과 매우 유사합니다. 대신 역할을 생성할 때 고유한 정책을 선택합니다.

**Lambda 정책을 사용하여 Amazon SWF 역할을 생성하려면**

1. [Amazon IAM 콘솔](https://console.aws.amazon.com/iam/)을 엽니다.

1. [**Roles**]를 선택한 다음 [**Create New Role**]을 선택합니다.

1. `swf-lambda-function`와 같이 역할에 이름을 지정한 다음 [**Next Step**]을 선택합니다.

1. **AWS 서비스 역할**에서 **Amazon SWF**를 선택하고 **다음 단계**를 선택합니다.

1. **정책 연결** 화면의 목록에서 Lambda 함수 관련 정책을 선택합니다.

1. 역할을 검토한 후 [**Next Step**]을 선택하고 [**Create Role**]을 선택합니다.

### 워크플로에 IAM 역할 연결
<a name="attach-iam-role-to-workflow"></a>

IAM 역할을 정의하면 해당 역할을 워크플로에 연결해야 합니다. 그러면 워크플로에서는 이 역할을 사용해 Amazon SWF에 액세스 권한을 제공한 Lambda 함수를 직접적으로 호출합니다.

역할을 워크플로에 연결할 수 있는 지점에는 다음 2개가 있습니다.
+ 워크플로 유형 등록 중. 해당 워크플로 유형을 실행할 때마다 이 역할을 기본 Lambda 역할로 사용할 수 있습니다.
+ 워크플로 실행 시작 시. 역할이 워크플로 실행 중(및 전체 실행 중)에만 사용됩니다.

**워크플로 유형에 대해 기본 Lambda 역할을 제공하려면**
+ RegisterWorkflowType을 호출하는 경우 defaultLambdaRole 필드를 정의한 역할의 ARN으로 설정합니다.

**워크플로 실행 중 사용할 Lambda 역할을 제공하려면**
+ StartWorkflowExecution을 호출하는 경우 lambdaRole 필드를 정의한 역할의 ARN으로 설정합니다.

**참고**  
RegisterWorkflowType 또는 StartWorkflowExecution을 호출하는 계정에 주어진 역할을 사용할 권한이 없는 경우 호출에 실패하고 OperationNotPermittedFault가 발생합니다.

### Amazon SWF 워크플로에서 Lambda 함수 직접 호출
<a name="call-lambda-function-from-swf-workflow"></a>

ScheduleLambdaFunctionDecisionAttributes 데이터 유형을 사용해 워크플로 실행 중 호출할 Lambda 함수를 식별합니다.

RespondDecisionTaskCompleted 호출 중 결정 목록에 ScheduleLambdaFunctionDecisionAttributes를 제공합니다. 예:

```
{
  "decisions": [{
    "ScheduleLambdaFunctionDecisionAttributes": {
      "id": "lambdaTaskId",
      "name": "myLambdaFunctionName",
      "input": "inputToLambdaFunction",
      "startToCloseTimeout": "30"
    },
  }],
}
```

다음 파라미터를 설정합니다.
+ Lambda 작업 식별자인 *id*. 1\$1256자의 문자열로, :(콜론), /(슬래시), \$1(세로 막대), 제어 문자(\$1u0000 \$1 \$1u001f 및 \$1u007f \$1 \$1u009f), 리터럴 문자열 `arn`은 사용할 수 없습니다.
+ *name*: Lambda 함수의 이름. Amazon SWF 워크플로는 Lambda 함수를 직접적으로 호출할 액세스 권한을 제공하는 IAM 역할과 함께 제공되어야 합니다. 제공된 이름은 Lambda 호출 작업에서처럼 FunctionName 파라미터에 대한 제약을 따라야 합니다.
+ *input*: 함수에 대한 선택적 입력 데이터. 설정하면 이 파라미터는 Lambda 호출 작업에서처럼 ClientContext 파라미터에 대한 제약을 따라야 합니다.
+ *startToCloseTimeout*: 작업에 실패하고 시간 초과 예외가 발생하기 전에 함수 실행에 걸릴 수 있는 선택적 최대 기간(초). 값 NONE을 사용하면 기간을 무제한으로 지정할 수 있습니다.

자세한 내용은 [AWS Lambda 작업 구현을 참조하세요](https://docs.aws.amazon.com/amazonswf/latest/awsflowguide/lambda-task.html).

# Amazon SWF에서 활동 작업자 개발
<a name="swf-dg-develop-activity"></a>

활동 작업자는 하나 이상의 작업 유형을 구현합니다. 활동 작업자는 Amazon SWF와 통신하여 활동 작업을 수신하고 수행합니다. 동일한 활동 유형의 활동 작업을 수행하는 활동 작업자가 여러 개 있을 수 있습니다.

결정자가 활동 작업을 예약하면 활동 작업자는 Amazon SWF에서 그 활동 작업을 사용할 수 있습니다. 결정자는 활동 작업을 예약할 때 활동 작업자가 활동 작업을 수행하는 데 필요한 데이터(사용자가 판단)를 제공합니다. Amazon SWF는 활동 작업에 이러한 데이터를 삽입하여 활동 작업자에게 보냅니다.

활동 작업자는 사용자가 관리합니다. 활동 작업자는 모든 언어로 작성이 가능하고, API를 통해 Amazon SWF와 통신할 수 있는 한 어디에서나 작업자를 실행할 수 있습니다. 활동 작업을 수행하는 데 필요한 모든 정보를 Amazon SWF가 제공하기 때문에 모든 활동 작업자는 상태 비저장일 수 있습니다. 상태 비저장 방식에서는 워크플로의 확장 가능성이 매우 커지므로, 증가한 필요 용량을 처리하려면 활동 작업자를 더 추가하기만 하면 됩니다.

이 단원에서는 활동 작업자를 구현하는 방법을 설명합니다. 활동 작업자는 반복적으로 다음 작업을 수행해야 합니다.

1. 활동 작업에 대해 Amazon SWF를 폴링합니다.

1. 작업 수행을 시작합니다.

1. 작업이 오래 실행되는 경우 Amazon SWF에 정기적으로 하트비트를 보고합니다.

1. Amazon SWF에 작업이 완료 또는 실패했는지 보고하고 결과를 반환합니다.

**Topics**
+ [활동 작업 폴링](#swf-dg-polling-activity-tasks)
+ [활동 작업 수행](#swf-dg-performing-activity-tasks)
+ [활동 작업 하트비트 보고](#swf-dg-managing-activity-tasks)
+ [활동 작업 완료 또는 실패](#swf-dg-complete-or-fail)
+ [활동 작업자 시작](#swf-dg-launch-activity-workers)

## 활동 작업 폴링
<a name="swf-dg-polling-activity-tasks"></a>

활동 작업을 수행하기 위해 각 활동 작업자는 `PollForActivityTask` 작업을 정기적으로 호출해 Amazon SWF를 폴링해야 합니다.

다음 예에서 활동 작업자 `ChargeCreditCardWorker01`은 작업 목록 `ChargeCreditCard-v0.1`에서 작업을 폴링합니다. 사용 가능한 활동 작업이 없으면 60초 후 Amazon SWF가 빈 응답을 다시 보냅니다. 빈 응답은 `Task` 구조로, 여기서 `taskToken`의 값이 빈 문자열입니다.

```
https://swf.us-east-1.amazonaws.com
PollForActivityTask
{
  "domain" : "867530901",
  "taskList" : { "name": "ChargeCreditCard-v0.1" },
  "identity" : "ChargeCreditCardWorker01"
}
```

활동 작업을 사용할 수 있게 되면 Amazon SWF는 작업을 활동 작업자에게 반환합니다. 이 작업에는 결정자가 활동을 예약할 때 지정한 데이터가 들어 있습니다.

활동 작업자가 이 활동 작업을 받으면 작업을 수행할 준비가 된 것입니다. 다음 단원에서는 활동 작업 수행에 대한 정보를 제공합니다.

## 활동 작업 수행
<a name="swf-dg-performing-activity-tasks"></a>

활동 작업을 수신하면 활동 작업자가 작업을 수행할 준비가 된 것입니다.

**활동 작업을 수행하려면**

1. 작업의 입력 필드에 있는 내용을 해석하도록 활동 작업자를 프로그래밍합니다. 이 필드에는 작업 예약 시 결정자가 지정한 데이터가 들어 있습니다.

1. 데이터 처리 및 로직 실행을 시작하도록 활동 작업자를 프로그래밍합니다.

다음 섹션에서는 오래 실행되는 활동에 대한 상태 업데이트를 Amazon SWF에 제공하도록 활동 작업자를 프로그래밍하는 방법에 대해 설명합니다.

## 활동 작업 하트비트 보고
<a name="swf-dg-managing-activity-tasks"></a>

활동 유형에 하트비트 제한 시간이 등록되면 활동 작업자는 하트비트 제한 시간이 초과되기 전에 하트비트를 기록해야 합니다. 활동 작업이 제한 시간 안에 하트비트를 제공하지 못하면 작업 시간이 초과되고, Amazon SWF는 작업을 닫고 새 결정 작업을 예약해 결정자에게 시간 초과 사실을 알립니다. 그러면 결정자는 활동 작업을 다시 예약하거나 다른 조치를 취할 수 있습니다.

시간 초과 후 활동 작업자가 `RespondActivityTaskCompleted` 호출 등을 통해 Amazon SWF에 접속하려고 하면 Amazon SWF는 `UnknownResource` 장애를 반환합니다.

이 단원에서는 활동 하트비트를 제공하는 방법을 설명합니다.

활동 작업 하트비트를 기록하려면 `RecordActivityTaskHeartbeat` 작업을 호출하도록 활동 작업자를 프로그래밍합니다. 또한 이 작업은 애플리케이션에 대한 작업 진행 상황을 정량화하기 위해 자유 형식의 데이터를 저장하는 데 사용할 수 있는 문자열 필드를 제공합니다.

이 예에서 활동 작업자는 Amazon SWF에 하트비트를 보고하고 세부 정보 필드를 사용해 활동 작업이 40% 완료되었음을 보고합니다. 하트비트를 보고하려면 활동 작업자가 활동 작업의 작업 토큰을 지정해야 합니다.

```
https://swf.us-east-1.amazonaws.com
RecordActivityTaskHeartbeat
{
  "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "details" : "40"
}
```

이 작업은 워크플로 실행 내역에 이벤트를 생성하지 않지만 작업 시간이 초과되면 워크플로 실행 내역에 `ActivityTaskTimedOut` 이벤트가 포함됩니다. 이 이벤트에는 활동 작업자가 생성한 마지막 하트비트의 정보가 들어 있습니다.

## 활동 작업 완료 또는 실패
<a name="swf-dg-complete-or-fail"></a>

작업 실행 후 활동 작업자는 활동 작업을 완료했는지 아니면 작업에 실패했는지 보고해야 합니다.

### 활동 작업 완료
<a name="completing-activity-task"></a>

활동 작업을 완료하려면 활동 작업을 성공적으로 완료한 후 작업 토큰을 지정하는 `RespondActivityTaskCompleted` 작업을 호출하도록 활동 작업자를 프로그래밍해야 합니다.

이 예에서 활동 작업자는 작업이 성공적으로 완료되었음을 나타냅니다.

```
https://swf.us-east-1.amazonaws.com
RespondActivityTaskCompleted
{
  "taskToken": "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "results": "40"
}
```

활동이 완료되면 Amazon SWF는 활동이 연결된 워크플로 실행에 대해 새 결정 작업을 예약합니다.

수중에 있는 작업을 완료하면 다른 활동 작업을 폴링하도록 활동 작업자를 프로그래밍합니다. 이렇게 하면 활동 작업자가 작업을 계속해서 폴링 및 완료하는 루프가 생성됩니다.

*StartToCloseTimeout* 기간 이내에 활동이 응답하지 않거나 *ScheduleToCloseTimeout*이 만료되면 Amazon SWF는 활동 작업 기간을 초과하고 결정 작업을 예약합니다. 따라서 결정자가 작업 다시 예약 등과 같은 적절한 조치를 취할 수 있습니다.

예를 들어, Amazon EC2 인스턴스가 활동 작업을 실행 중인데 작업이 완료되기 전에 인스턴스가 실패하면 결정자는 워크플로 실행 내역에 시간 초과 이벤트를 수신합니다. 활동 작업이 하트비트를 사용하는 경우 결정자는 Amazon EC2 인스턴스 실패 후 작업이 다음 하트비트 전달에 실패할 때 이 이벤트를 수신합니다. 그렇지 않은 경우 결정자는 전체 제한 시간 값 중 하나에 도달하기 전에 활동 작업을 완료하는 데 실패한 경우 이 이벤트를 수신합니다. 실패한 작업을 다시 할당하거나 다른 조치를 취하는 것은 결정자의 몫입니다.

### 활동 작업 실패
<a name="failing-an-activity-task"></a>

활동 작업자가 어떤 이유로 활동 작업을 수행할 수 없는데 Amazon SWF와 계속해서 통신할 수 있는 경우 작업에 실패하도록 활성 작업자를 프로그래밍할 수 있습니다.

활동 작업에 실패하도록 활동 작업자를 프로그래밍하려면 작업의 토큰을 지정하는 `RespondActivityTaskFailed` 작업을 호출하도록 활동 작업자를 프로그래밍합니다.

```
https://swf.us-east-1.amazonaws.com
RespondActivityTaskFailed
{
  "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "reason" : "CC-Invalid",
  "details" : "Credit Card Number Checksum Failed"
}
```

개발자는 사유 및 세부 정보 필드에 저장할 값을 정의합니다. 이러한 값은 자유 형식 문자열인데, 애플리케이션에서 지원하는 모든 오류 코드 규칙을 사용할 수 있습니다. Amazon SWF는 이러한 값을 처리하지 않습니다. 하지만 Amazon SWF는 콘솔에 이러한 값을 표시할 수는 있습니다.

활동 작업에 실패하면 Amazon SWF는 활동 작업이 연결된 워크플로 실행을 위한 결정 작업을 예약해 결정자에게 실패 사실을 알립니다. 실패의 특성에 따라 실패한 활동을 활동 다시 예약 또는 워크플로 실행 실패 등으로 처리하도록 결정자를 프로그래밍합니다.

## 활동 작업자 시작
<a name="swf-dg-launch-activity-workers"></a>

활동 작업자를 시작하려면 활동 작업자 플랫폼에서 사용할 수 있는 실행 파일로 로직을 패키징합니다. 예를 들어, Linux 및 Windows 서버 양쪽 모두에서 실행되는 Java 실행 파일로 활동 코드를 패키징할 수 있습니다.

시작된 작업자는 작업을 폴링하기 시작합니다. 그러나 결정자가 활동 작업을 예약할 때까지는 작업 없이 폴링 시간이 초과되고, 그래도 작업자는 폴링을 계속합니다.

폴은 아웃바운드 요청이기 때문에 Amazon SWF 엔드포인트에 액세스할 수 있는 모든 네트워크에서 활동 작업자를 실행할 수 있습니다.

원하는 수만큼의 활동 작업자를 시작할 수 있습니다. 결정자가 활동 작업을 예약하면 Amazon SWF는 활동 작업을 폴링 활동 작업자에게 자동으로 분배합니다.

# Amazon SWF에서 결정자 개발
<a name="swf-dg-dev-deciders"></a>

결정자는 워크플로 실행 중 실행되는 워크플로 유형의 조정 로직을 구현하는 것입니다. 한 가지 워크플로 유형에 대해 여러 결정자를 실행할 수 있습니다.

워크플로 실행의 실행 상태는 워크플로 기록에 저장되므로 결정자는 상태 비저장 상태가 될 수 있습니다. Amazon SWF는 워크플로 실행 기록을 유지 관리하고 이를 각 의사 결정 작업과 함께 결정자에게 제공합니다. 따라서 필요에 따라 결정자를 동적으로 추가 및 제거할 수 있어 워크플로 처리의 확장 가능성이 매우 커집니다. 시스템에 대한 로드가 증가하면 결정자를 추가해 늘어난 용량을 처리할 수 있습니다. 그러나 워크플로 실행 중 결정 작업은 하나만 열려 있을 수 있습니다.

워크플로 실행에 대한 상태가 변경될 때마다 Amazon SWF는 결정 작업을 예약합니다. 결정자는 결정 작업을 수신할 때마다 다음 작업을 수행합니다.
+ 결정 작업과 함께 제공된 워크플로 실행 내역 해석
+ 워크플로 실행 내역을 기반으로 조정 로직 적용 및 다음으로 수행할 작업 결정. 각 결정은 결정 구조로 표현됩니다.
+ 결정 작업 완료 및 Amazon SWF에 결정 목록 제공

이 단원에서는 결정자를 개발하는 방법을 설명하고, 여기에는 다음 작업이 관련됩니다.
+ 결정 작업을 폴링하도록 결정자 프로그래밍
+ 워크플로 실행 내역을 해석하고 결정을 하도록 결정자 프로그래밍
+ 결정 작업에 대해 응답하도록 결정자 프로그래밍

이 단원의 예에서는 전자 상거래의 예 워크플로에 대한 결정자를 프로그래밍할 수 있는 방법을 보여줍니다.

원하는 언어로 결정자를 구현하고, 서비스 API를 통해 Amazon SWF와 통신할 수 있는 한 어디에서나 이를 실행할 수 있습니다.

**Topics**
+ [조정 로직 정의](#swf-dg-coordination-logic)
+ [결정 작업 폴링](#swf-dg-polling-decision-tasks)
+ [조정 로직 적용](#swf-dg-apply-coord-logic)
+ [결정에 응답](#swf-dg-responding-with-decisions)
+ [워크플로 실행 닫기](#swf-dg-closing-workflows)
+ [결정자 시작](#swf-dg-deciders-launch)

## 조정 로직 정의
<a name="swf-dg-coordination-logic"></a>

결정자를 개발할 때 해야 할 첫 번째 작업은 조정 로직을 정의하는 것입니다. 전자 상거래의 예에서 이전 활동 완료 후 수행될 각 활동을 예약하는 조정 로직은 다음과 같을 수 있습니다.

```
IF lastEvent = "StartWorkflowInstance"
 addToDecisions ScheduleVerifyOrderActivity

ELSIF lastEvent = "CompleteVerifyOrderActivity"
 addToDecisions ScheduleChargeCreditCardActivity

ELSIF lastEvent = "CompleteChargeCreditCardActivity"
 addToDecisions ScheduleCompleteShipOrderActivity

ELSIF lastEvent = "CompleteShipOrderActivity"
 addToDecisions ScheduleRecordOrderCompletion

ELSIF lastEvent = "CompleteRecordOrderCompletion"
 addToDecisions CloseWorkflow

ENDIF
```

결정자는 워크플로 실행 내역에 조정 로직을 적용해 `RespondDecisionTaskCompleted` 작업을 사용해 결정 작업 완료 시 결정 목록을 생성합니다.

## 결정 작업 폴링
<a name="swf-dg-polling-decision-tasks"></a>

각 결정자는 결정 작업을 폴링합니다. 결정 작업에는 결정자가 활동 작업 예약 등과 같은 결정을 생성하는 데 사용하는 정보가 들어 있습니다. 결정 작업을 폴링하기 위해 결정자는 `PollForDecisionTask` 작업을 사용합니다.

이 예에서 결정자는 결정 작업을 폴링해 `customerOrderWorkflow-0.1` 작업 목록을 지정합니다.

```
https://swf.us-east-1.amazonaws.com
PollForDecisionTask
{
  "domain": "867530901",
  "taskList": {"name": "customerOrderWorkflow-v0.1"},
  "identity": "Decider01",
  "maximumPageSize": 50,
  "reverseOrder": true
}
```

지정된 작업 목록에서 결정 작업을 사용할 수 있으면 Amazon SWF에서 해당 작업을 즉시 반환합니다. 사용 가능한 결정 작업이 없는 경우 Amazon SWF는 최대 60초 동안 연결을 열린 상태로 유지하고 작업을 사용할 수 있게 되면 즉시 반환합니다. 사용 가능한 작업이 없는 경우 Amazon SWF는 빈 응답을 반환합니다. 빈 응답은 `Task` 구조로, 여기서 `taskToken`의 값이 빈 문자열입니다. 결정자가 빈 응답을 수신하면 다른 작업을 폴링하도록 결정자를 프로그래밍해야 합니다.

결정 작업을 사용할 수 있는 경우 Amazon SWF는 결정 작업과 워크플로 실행 내역의 페이지를 매긴 보기가 포함된 응답을 반환합니다.

이 예에서 최신 이벤트 유형은 워크플로 실행이 시작되었으며 입력 요소에 첫 번째 작업을 수행하는 데 필요한 정보가 포함되어 있음을 나타냅니다.

```
{
  "events": [
    {
      "decisionTaskStartedEventAttributes": {
        "identity": "Decider01",
        "scheduledEventId": 2
      },
      "eventId": 3,
      "eventTimestamp": 1326593394.566,
      "eventType": "DecisionTaskStarted"
    }, {
      "decisionTaskScheduledEventAttributes": {
        "startToCloseTimeout": "600",
        "taskList": { "name": "specialTaskList" }
      },
      "eventId": 2,
      "eventTimestamp": 1326592619.474,
      "eventType": "DecisionTaskScheduled"
    }, {
      "eventId": 1,
      "eventTimestamp": 1326592619.474,
      "eventType": "WorkflowExecutionStarted",
      "workflowExecutionStartedEventAttributes": {
        "childPolicy" : "TERMINATE",
        "executionStartToCloseTimeout" : "3600",
        "input" : "data-used-decider-for-first-task",
        "parentInitiatedEventId": 0,
        "tagList" : ["music purchase", "digital", "ricoh-the-dog"],
        "taskList": { "name": "specialTaskList" },
        "taskStartToCloseTimeout": "600",
        "workflowType": {
          "name": "customerOrderWorkflow",
          "version": "1.0"
        }
      }
    }
  ],
  ...
}
```

워크플로 실행 내역을 수신하면 결정자는 내역을 해석하고 조정 로직에 따라 결정을 내립니다.

워크플로 실행 하나의 워크플로 내역 이벤트 수가 많은 경우, 결과가 여러 페이지로 나뉘어 반환될 수 있습니다. 후속 페이지를 검색하려면 초기 호출에서 반환된 *nextPageToken*을 사용하여 추가로 `PollForDecisionTask`을 직접적으로 호출합니다. 참고: *nextPageToken*을 사용하여 `GetWorkflowExecutionHistory`을 직접적으로 호출하지 *마십시오*. 그 대신 `PollForDecisionTask`를 다시 호출하십시오.

## 조정 로직 적용
<a name="swf-dg-apply-coord-logic"></a>

결정 작업을 받은 결정자가 워크플로 실행 내역을 해석해 지금까지 어떤 일이 발생했는지 확인하도록 결정자를 프로그래밍합니다. 결정자는 이를 바탕으로 결정 목록을 생성해야 합니다.

전자 상거래의 예에서는 워크플로 내역의 마지막 이벤트만 고려하므로 다음 로직을 정의합니다.

```
IF lastEvent = "StartWorkflowInstance"
 addToDecisions ScheduleVerifyOrderActivity

ELSIF lastEvent = "CompleteVerifyOrderActivity"
 addToDecisions ScheduleChargeCreditCardActivity

ELSIF lastEvent = "CompleteChargeCreditCardActivity"
 addToDecisions ScheduleCompleteShipOrderActivity

ELSIF lastEvent = "CompleteShipOrderActivity"
 addToDecisions ScheduleRecordOrderCompletion

ELSIF lastEvent = "CompleteRecordOrderCompletion"
 addToDecisions CloseWorkflow

ENDIF
```

lastEvent가 `CompleteVerifyOrderActivity`이면 결정 목록에 `ScheduleChargeCreditCardActivity` 활동을 추가합니다.

결정자가 어떤 결정을 내릴지 결정하면 Amazon SWF에 적절한 결정으로 응답할 수 있습니다.

## 결정에 응답
<a name="swf-dg-responding-with-decisions"></a>

워크플로 내역을 해석하고 결정 목록을 생성하면 결정자는 해당 결정으로 다시 Amazon SWF에 응답할 준비가 된 것입니다.

프로그램 실행 내역에서 필요한 데이터를 추출한 다음 워크플로에 적절한 다음 작업을 지정하도록 결정자를 프로그래밍합니다. 결정자는 `RespondDecisionTaskCompleted` 작업을 사용하여 이러한 결정을 Amazon SWF로 다시 전송합니다. 사용 가능한 [결정 유형](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_Decision.html) 목록은 *Amazon Simple Workflow Service API 참조*를 참조하십시오.

이 전자 상거래의 예에서 결정자가 자신이 생성한 결정 세트로 응답할 때 워크플로 실행 내역의 신용카드 입력을 포함합니다. 그러면 활동 작업자는 활동 작업을 수행하는 데 필요한 정보를 갖게 됩니다.

워크플로 실행의 모든 활동이 완료되면 결정자는 워크플로 실행을 닫습니다.

```
https://swf.us-east-1.amazonaws.com
RespondDecisionTaskCompleted
{
  "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "decisions" : [
    {
      "decisionType" :"ScheduleActivityTask",
      "scheduleActivityTaskDecisionAttributes" : {
        "control" :"OPTIONAL_DATA_FOR_DECIDER",
        "activityType" : {
          "name" :"ScheduleChargeCreditCardActivity",
          "version" :"1.1"
        },
        "activityId" :"3e2e6e55-e7c4-beef-feed-aa815722b7be",
        "scheduleToCloseTimeout" :"360",
        "taskList" : { "name" :"CC_TASKS" },
        "scheduleToStartTimeout" :"60",
        "startToCloseTimeout" :"300",
        "heartbeatTimeout" :"60",
        "input" : "4321-0001-0002-1234: 0212 : 234"
      }
    }
  ]
}
```

## 워크플로 실행 닫기
<a name="swf-dg-closing-workflows"></a>

결정자가 비즈니스 프로세스가 완료되었음을 확인하면 즉, 수행할 활동이 더 이상 없음을 확인하면 결정자는 워크플로 실행을 닫는 결정을 생성합니다.

워크플로 실행을 닫으려면 워크플로 내역의 이벤트를 해석해 지금까지 실행에서 발생한 일을 확인해 워크플로 실행을 닫아야 하는지 살펴보도록 결정자를 프로그래밍합니다.

워크플로가 성공적으로 완료되면 `CompleteWorkflowExecution` 결정으로 `RespondDecisionTaskCompleted`를 호출해 워크플로 실행을 닫습니다. 또는 `FailWorkflowExecution` 결정을 사용해 잘못된 실행을 실패로 처리할 수 있습니다.

이 전자 상거래의 예에서 결정자는 내역을 검토하고 조정 로직을 기반으로 결정 목록에 워크플로 실행을 닫는 결정을 추가하고, 워크플로 닫기 결정으로 `RespondDecisionTaskCompleted` 작업을 시작합니다.

**참고**  
워크플로 실행 닫기에 실패하는 몇 가지 경우가 있습니다. 예를 들어 결정자가 워크플로 실행을 닫는 중 신호를 수신하면 닫기 결정에 실패합니다. 이러한 가능성을 처리하기 위해 결정자는 계속해서 결정 작업을 폴링해야 합니다. 또한 다음 결정 작업을 수신하는 결정자가 실행 종료를 방해한 이벤트(이 경우에는 신호)에 응답하는지 확인합니다.

또한 워크플로 실행의 취소를 지원할 수도 있습니다. 이러한 기능은 오래 실행 중인 워크플로에 특히 유용할 수 있습니다. 취소를 지원하려면 결정자가 내역의 `WorkflowExecutionCancelRequested` 이벤트를 처리해야 합니다. 이 이벤트는 실행 취소가 요청되었음을 나타냅니다. 결정자는 진행 중인 활동 작업 취소와 `CancelWorkflowExecution` 결정으로 `RespondDecisionTaskCompleted` 작업을 호출해 워크플로 닫기 등과 같은 적절한 정리 작업을 수행해야 합니다.

다음 예에서는 `RespondDecisionTaskCompleted`를 호출해 현재 워크플로 실행이 취소되었음을 지정합니다.

```
https://swf.us-east-1.amazonaws.com
RespondDecisionTaskCompleted
{
  "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "decisions" : [
    {
      "decisionType":"CancelWorkflowExecution",
      "CancelWorkflowExecutionAttributes":{
        "Details": "Customer canceled order"
      }
    }
  ]
}
```

Amazon SWF는 워크플로 실행 닫기 또는 취소 결정이 결정자가 보낸 마지막 결정인지 확인합니다. 즉, 워크플로를 닫는 결정 이후에는 결정이 들어 있는 결정 세트가 있으면 잘못된 것입니다.

## 결정자 시작
<a name="swf-dg-deciders-launch"></a>

결정자 개발을 완료하면 하나 이상의 결정자를 시작할 준비가 된 것입니다.

결정자를 시작하려면 결정자 플랫폼에서 사용할 수 있는 실행 파일로 조정 로직을 패키징합니다. 예를 들어, Linux 및 Windows 컴퓨터 양쪽 모두에서 실행할 수 있는 Java 실행 파일로 결정자 코드를 패키징할 수 있습니다.

시작되면 결정자는 작업을 위해 Amazon SWF를 폴링하기 시작해야 합니다. 사용자가 워크플로 실행을 시작하고 Amazon SWF에서 결정 작업을 예약할 때까지 이러한 폴링은 시간 초과되어 빈 응답을 받습니다. 빈 응답은 `Task` 구조로, 여기서 `taskToken`의 값이 빈 문자열입니다. 결정자는 계속해서 폴링해야 합니다.

Amazon SWF는 항상 하나의 워크플로 실행에 대해 결정 작업을 하나만 활성화할 수 있도록 합니다. 따라서 결정 충돌과 같은 문제가 방지됩니다. 또한 Amazon SWF는 실행 중인 결정자 수에 상관없이 결정자 하나에는 결정 작업이 하나만 할당되도록 합니다.

결정자가 다른 결정 작업을 처리하는 동안 결정 작업 하나를 발생시키는 어떤 일이 일어나면 Amazon SWF는 현재 작업이 완료될 때까지 새 작업을 대기열에 추가합니다. 현재 작업이 완료되면 Amazon SWF는 새 결정 작업을 사용 가능하도록 만듭니다. 또한 결정 작업은 일괄 처리됩니다. 즉, 결정자가 결정 작업을 처리하는 동안 여러 활동이 완료되면 Amazon SWF는 여러 작업 완료를 고려하는 새로운 결정 작업을 하나만 생성합니다. 그러나 워크플로 실행 내역에는 각 작업 완료에 대한 개별 이벤트가 수신됩니다.

폴링은 아웃바운드 요청이기 때문에 Amazon SWF 엔드포인트에 액세스할 수 있는 모든 네트워크에서 결정자를 실행할 수 있습니다.

워크플로 실행을 진행하도록 하려면 결정자가 하나 이상 실행 중이어야 합니다. 원하는 만큼 결정자를 실행할 수 있습니다. Amazon SWF는 동일한 작업 목록에 대한 여러 결정자 폴링을 지원합니다.

# Amazon SWF에서 워크플로 시작
<a name="swf-dg-start-workflow-exec"></a>

어떤 애플리케이션에서든 `StartWorkflowExecution` 작업을 사용해 등록된 워크플로 유형의 워크플로 실행을 시작할 수 있습니다. 실행을 시작할 때 `workflowId`라는 식별자를 실행과 연결합니다. 애플리케이션에 알맞은 문자열을 `workflowId`로 사용할 수 있습니다(예: 주문 처리 애플리케이션의 주문 번호). 동일한 도메인 내에서 복수의 열린 워크플로 실행에 대해 동일한 `workflowId`를 사용할 수 없습니다. 예를 들어, `workflowId` `Customer Order 01`로 두 가지 워크플로 실행을 시작하면 두 번째 워크플로 실행이 시작되지 않고 요청은 실패합니다. 하지만 종료된 실행의 `workflowId`를 다시 사용할 수 있습니다. 또한 Amazon SWF는 시스템에서 생성한 고유한 식별자인 `runId`를 각 워크플로 실행과 연결합니다.

워크플로 및 활동 유형이 등록되면 `StartWorkflowExecution` 작업을 호출해 워크플로를 시작합니다. `input` 파라미터의 값은 워크플로를 시작하는 애플리케이션에서 지정한 임의의 문자열일 수 있습니다. `executionStartToCloseTimeout`은 워크플로 실행이 시작되어 닫힐 때까지 걸릴 수 있는 초 단위 시간입니다. 이 제한을 초과하면 워크플로 실행이 시간 초과됩니다. Amazon SWF의 다른 제한 시간 파라미터 중 일부와 달리 이 제한 시간에 대해서는 `NONE` 값을 지정할 수 없습니다. 워크플로 실행을 실행할 수 있는 최대 시간 제한은 1년입니다. 마찬가지로, *taskStartToCloseTimeout*은 워크플로 실행과 연결된 결정 작업이 시간 초과되기 이전에 실행될 수 있는 초 단위 시간입니다.

```
https://swf.us-east-1.amazonaws.com
StartWorkflowExecution
{
  "domain" : "867530901",
  "workflowId" : "20110927-T-1",
  "workflowType" : {
    "name" : "customerOrderWorkflow", "version" : "1.1"
  },
  "taskList" : { "name" : "specialTaskList" },
  "input" : "arbitrary-string-that-is-meaningful-to-the-workflow",
  "executionStartToCloseTimeout" : "1800",
  "tagList" : [ "music purchase", "digital", "ricoh-the-dog" ],
  "taskStartToCloseTimeout" : "1800",
  "childPolicy" : "TERMINATE"
}
```

 `StartWorkflowExecution` 작업에 성공하면 Amazon SWF는 워크플로 실행을 위한 `runId`를 반환합니다. 워크플로 실행의 `runId`는 특정 리전 내에서 고유합니다. 나중에 Amazon SWF 직접 호출에서 워크플로 실행을 지정해야 하는 경우를 대비해 `runId`를 저장해 둡니다. 예를 들어, 이후에 워크플로 실행으로 신호를 보내야 하는 경우 `runId`를 사용할 수 있습니다.

```
{"runId": "9ba33198-4b18-4792-9c15-7181fb3a8852"}
```

# Amazon SWF에서 작업 우선 순위 설정
<a name="programming-priority"></a>

기본적으로 작업 목록의 작업은 *도착 시간*에 따라 제공됨: 가능한 한 먼저 예약된 작업이 일반적으로 먼저 실행됩니다. 선택적 *작업 우선 순위*를 설정해 특정 작업에 우선 순위를 부여할 수 있음: Amazon SWF는 작업 목록에서 우선 순위가 높은 작업을 우선 순위가 낮은 작업보다 먼저 제공하려고 합니다.

**참고**  
일반적으로 먼저 예약된 작업이 먼저 실행되지만 이러한 순서가 반드시 보장되는 것은 아닙니다.

워크플로 및 활동 둘 다에 대해 작업 우선 순위를 설정할 수 있습니다. 워크플로의 작업 우선 순위는 워크플로가 예약한 활동 작업의 우선 순위에 영향을 미치지 않고 워크플로가 시작한 하위 워크플로에도 영향을 미치지 않습니다. 활동 또는 워크플로의 기본 우선 순위는 등록 중(사용자 또는 Amazon SWF가) 설정하지만 활동을 예약하거나 워크플로 실행을 시작하는 동안 재정의하지 않는 한 항상 등록된 작업 우선 순위가 사용됩니다.

작업 우선 순위 값의 범위는 "-2147483648" \$1 "2147483647"일 수 있으며 숫자가 클수록 우선 순위가 높음을 나타냅니다. 활동 또는 워크플로에 대해 작업 우선 순위를 설정하지 않으면 우선 순위 0이 할당됩니다.

**Topics**
+ [워크플로의 작업 우선 순위 설정](#task-priority-workflows)
+ [활동의 작업 우선 순위 설정](#task-priority-activities)
+ [작업 우선 순위 정보를 반환하는 작업](#task-priority-responses)

## 워크플로의 작업 우선 순위 설정
<a name="task-priority-workflows"></a>

워크플로를 등록 또는 시작할 때 워크플로의 작업 우선 순위를 설정할 수 있습니다. 워크플로 실행 설정 시 재정의되지 않는 한 워크플로 유형 등록 시 설정한 작업 우선 순위가 해당 형의 워크플로 실행에 대해 기본값으로 사용됩니다.

기본 작업 우선 순위로 워크플로 유형을 등록하려면 [RegisterWorkflowType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterWorkflowType.html) 작업을 사용할 때 *defaultTaskPriority* 옵션을 설정하십시오.

```
{
  "domain": "867530901",
  "name": "expeditedOrderWorkflow",
  "version": "1.0",
  "description": "Expedited customer orders workflow",
  "defaultTaskStartToCloseTimeout": "600",
  "defaultExecutionStartToCloseTimeout": "3600",
  "defaultTaskList": {"name": "mainTaskList"},
  "defaultTaskPriority": "10",
  "defaultChildPolicy": "TERMINATE"
}
```

[StartWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_StartWorkflowExecution.html)으로 워크플로 실행을 시작하는 경우, 워크플로우 유형의 등록된 작업 우선 순위를 재정의할 수 있습니다.

```
{
  "childPolicy": "TERMINATE",
  "domain": "867530901",
  "executionStartToCloseTimeout": "1800",
  "input": "arbitrary-string-that-is-meaningful-to-the-workflow",
  "tagList": ["music purchase", "digital", "ricoh-the-dog"],
  "taskList": {"name": "specialTaskList"},
  "taskPriority": "-20",
  "taskStartToCloseTimeout": "600",
  "workflowId": "20110927-T-1",
  "workflowType": {"name": "customerOrderWorkflow", "version": "1.0"},
}
```

또한 하위 워크플로우를 시작하거나 워크플로우를 새로 계속 진행할 때도(예: [RespondDecisionTaskCompleted](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondDecisionTaskCompleted.html)로 결정에 응답하는 경우) 등록된 작업 우선 순위를 재정의할 수 있습니다.

하위 워크플로의 작업 우선 순위를 설정하려면 `startChildWorkflowExecutionDecisionAttributes`에 값을 제공합니다.

```
{
  "taskToken": "AAAAKgAAAAEAAAAAAAAAA...",
  "decisions": [
    {
      "decisionType": "StartChildWorkflowExecution",
      "startChildWorkflowExecutionDecisionAttributes": {
        "childPolicy": "TERMINATE",
        "control": "digital music",
        "executionStartToCloseTimeout": "900",
        "input": "201412-Smith-011x",
        "taskList": {"name": "specialTaskList"},
        "taskPriority": "5",
        "taskStartToCloseTimeout": "600",
        "workflowId": "verification-workflow",
        "workflowType": {
          "name": "MyChildWorkflow",
          "version": "1.0"
        }
      }
    }
  ]
}
```

워크플로를 새 워크플로로 계속 실행하는 경우 `continueAsNewWorkflowExecutionDecisionAttributes`에 작업 우선 순위를 설정합니다.

```
{
  "taskToken": "AAAAKgAAAAEAAAAAAAAAA...",
  "decisions": [
    {
      "decisionType": "ContinueAsNewWorkflowExecution",
      "continueAsNewWorkflowExecutionDecisionAttributes": {
        "childPolicy": "TERMINATE",
        "executionStartToCloseTimeout": "1800",
        "input": "5634-0056-4367-0923,12/12,437",
        "taskList": {"name": "specialTaskList"},
        "taskStartToCloseTimeout": "600",
        "taskPriority": "100",
        "workflowTypeVersion": "1.0"
      }
    }
  ]
}
```

## 활동의 작업 우선 순위 설정
<a name="task-priority-activities"></a>

활동을 등록하거나 예약할 때 활동에 대한 작업 우선 순위를 설정할 수 있습니다. 활동 예약 재정의하지 않는 한 작업 유형 등록 시 설정한 작업 우선 순위가 활동 실행 시 기본 우선 순위로 사용됩니다.

활동 유형을 등록할 때 작업 우선 순위를 지정하려면 [RegisterActivityType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterActivityType.html) 작업을 사용할 때 *defaultTaskPriority* 옵션을 설정하십시오.

```
{
  "defaultTaskHeartbeatTimeout": "120",
  "defaultTaskList": {"name": "mainTaskList"},
  "defaultTaskPriority": "10",
  "defaultTaskScheduleToCloseTimeout": "900",
  "defaultTaskScheduleToStartTimeout": "300",
  "defaultTaskStartToCloseTimeout": "600",
  "description": "Verify the customer credit card",
  "domain": "867530901",
  "name": "activityVerify",
  "version": "1.0"
}
```

작업 우선 순위가 있는 작업을 예약하려면 [RespondDecisionTaskCompleted](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondDecisionTaskCompleted.html) 작업이 있는 활동을 예약할 때 *taskPriority* 옵션을 사용하십시오.

```
{
  "taskToken": "AAAAKgAAAAEAAAAAAAAAA...",
  "decisions": [
    {
      "decisionType": "ScheduleActivityTask",
      "scheduleActivityTaskDecisionAttributes": {
        "activityId": "verify-account",
        "activityType": {
            "name": "activityVerify",
            "version": "1.0"
        },
        "control": "digital music",
        "input": "abab-101",
        "taskList": {"name": "mainTaskList"},
        "taskPriority": "15"
      }
    }
  ]
}
```

## 작업 우선 순위 정보를 반환하는 작업
<a name="task-priority-responses"></a>

다음 Amazon SWF 작업에서 설정된 작업 우선 순위(또는 설정된 기본 작업 우선 순위)에 대한 정보를 얻을 수 있습니다.
+ [DescribeActivityType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DescribeActivityType.html)은 응답의 `configuration` 섹션에 있는 *defaultTaskPriority* 활동 유형을 반환합니다.
+ [DescribeWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DescribeWorkflowExecution.html)은 응답의 `executionConfiguration` 섹션에 있는 *taskPriority* 워크플로 실행을 반환합니다.
+ [DescribeWorkflowType](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DescribeWorkflowType.html)은 응답의 `configuration` 섹션에 있는 *defaultTaskPriority* 워크플로 유형을 반환합니다.
+ [GetWorkflowExecutionHistory](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_GetWorkflowExecutionHistory.html) 및 [PollForDecisionTask](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_PollForDecisionTask.html)는 응답의 `activityTaskScheduledEventAttributes`, `decisionTaskScheduledEventAttributes`, `workflowExecutionContinuedAsNewEventAttributes` 및 `workflowExecutionStartedEventAttributes` 섹션에 작업 우선 순위 정보를 제공합니다.

# Amazon SWF의 오류 처리
<a name="swf-dg-error-handling"></a>

워크플로 실행 과정 중에는 여러 가지 유형의 오류가 발생할 수 있습니다.

**Topics**
+ [유효성 검사 오류](#validation-errors)
+ [작업 또는 결정 실행 오류](#errors-in-enacting-actions-or-decisions)
+ [시간 초과](#timeouts)
+ [사용자 코드로 인해 발생한 오류](#errors-raised-by-user-code)
+ [워크플로 실행 닫기와 관련된 오류](#errors-related-to-closing-a-workflow-execution)

## 유효성 검사 오류
<a name="validation-errors"></a>

유효성 검사 오류는 Amazon SWF에 대한 요청의 형식이 제대로 지정되지 않았거나 요청에 잘못된 데이터가 포함되어 있어 요청에 실패하는 경우 발생합니다. 이러한 경우 요청은 `DescribeDomain`과 같은 작업 또는 `StartTimer`와 같은 결정일 수 있습니다. 요청이 작업인 경우 Amazon SWF에서는 응답에 오류 코드를 반환합니다. 실패의 원인이 된 요청의 측면에 대한 정보를 제공할 수 있으므로 오류 코드를 확인합니다. 예를 들어, 요청과 함께 전달된 하나 이상의 인수가 유효하지 않을 수 있습니다. 일반적인 오류 코드 목록을 보려면 *Amazon Simple Workflow Service API 참조*의 작업 주제를 참조하십시오.

실패한 요청이 결정인 경우 워크플로 실행 내역에 적절한 이벤트가 나열됩니다. 예를 들어, `StartTimer` 결정에 실패하면 내역에 `StartTimerFailed` 이벤트가 표시됩니다. 결정자는 `PollForDecisionTask` 또는 `GetWorkflowExecutionHistory`에 대한 응답으로 내역을 수신할 때 이러한 이벤트가 있는지 확인해야 합니다. 아래는 결정의 형식이 잘못 지정되었거나 결정에 잘못된 데이터가 포함된 경우 발생할 수 있는 가능한 결정 실패 이벤트 목록입니다.

## 작업 또는 결정 실행 오류
<a name="errors-in-enacting-actions-or-decisions"></a>

요청의 형식이 적절하게 지정되었더라도 Amazon SWF에서 요청을 수행하려고 할 때 오류가 발생할 수 있습니다. 이러한 경우 내역의 다음 이벤트 중 하나가 오류가 발생했음을 나타냅니다. 이벤트의 `reason` 필드를 살펴보고 실패의 원인을 확인합니다.
+ `[CancelTimerFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_CancelTimerFailedEventAttributes.html)`
+ `[RequestCancelActivityTaskFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RequestCancelActivityTaskFailedEventAttributes.html)`
+ `[RequestCancelExternalWorkflowExecutionFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RequestCancelExternalWorkflowExecutionFailedEventAttributes.html)`
+ `[ScheduleActivityTaskFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ScheduleActivityTaskFailedEventAttributes.html)`
+ `[SignalExternalWorkflowExecutionFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_SignalExternalWorkflowExecutionFailedEventAttributes.html)`
+ `[StartChildWorkflowExecutionFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_StartChildWorkflowExecutionFailedEventAttributes.html)`
+ `[StartTimerFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_StartTimerFailedEventAttributes.html)`

## 시간 초과
<a name="timeouts"></a>

[결정자](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterWorkflowType.html), [활동 작업자](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterActivityType.html) 및 [워크플로우 실행](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RegisterActivityType.html)은 모두 제한 시간의 한계 안에서 작동합니다. 이 유형의 오류에서는 작업 또는 하위 워크플로의 시간이 초과됩니다. 내역에 시간 초과를 설명하는 이벤트가 표시됩니다. 결정자는 예를 들어 작업을 다시 예약하거나 하위 워크플로를 다시 시작해 해당 이벤트를 처리해야 합니다. 제한 시간에 대한 자세한 정보는 [Amazon SWF 제한 시간 유형](swf-timeout-types.md) 단원을 참조하십시오.
+ `[ActivityTaskTimedOut](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ActivityTaskTimedOutEventAttributes.html)`
+ `[ChildWorkflowExecutionTimedOut](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ChildWorkflowExecutionTimedOutEventAttributes.html)`
+ `[DecisionTaskTimedOut](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DecisionTaskTimedOutEventAttributes.html)`
+ `[WorkflowExecutionTimedOut](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_WorkflowExecutionTimedOutEventAttributes.html)`

## 사용자 코드로 인해 발생한 오류
<a name="errors-raised-by-user-code"></a>

이 유형의 오류 상태의 예는 활동 작업 실패와 하위 워크플로 실패입니다. 제한 시간 오류와 마찬가지로 Amazon SWF에서는 워크플로 실행 내역에 적절한 이벤트를 추가합니다. 결정자는 가능한 경우 작업을 다시 예약하거나 하위 워크플로를 다시 시작해 해당 이벤트를 처리해야 합니다.
+ `[ActivityTaskFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ActivityTaskFailedEventAttributes.html)`
+ `[ChildWorkflowExecutionFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ChildWorkflowExecutionFailedEventAttributes.html)`

## 워크플로 실행 닫기와 관련된 오류
<a name="errors-related-to-closing-a-workflow-execution"></a>

결정자는 보류 중인 결정 작업이 있는 워크플로를 닫으려고 하는 경우 다음 이벤트를 확인할 수도 있습니다.
+ `[FailWorkflowExecutionFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_FailWorkflowExecutionFailedEventAttributes.html)`
+ `[CompleteWorkFlowExecutionFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_CompleteWorkflowExecutionFailedEventAttributes.html)`
+ `[ContinueAsNewWorkflowExecutionFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ContinueAsNewWorkflowExecutionFailedEventAttributes.html)`
+ `[CancelWorkflowExecutionFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_CancelWorkflowExecutionFailedEventAttributes.html)`

위에 나열된 이벤트에 대한 자세한 내용은 Amazon SWF API 참조의 [기록 이벤트](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_HistoryEvent.html)를 참조하세요.