

# AWS Glue에서 오케스트레이션
<a name="etl-jobs"></a>

다음 섹션에서는 AWS Glue에서 작업 오케스트레이션에 대한 정보를 제공합니다.

**Topics**
+ [트리거를 사용하여 작업 및 크롤러 시작](trigger-job.md)
+ [AWS Glue에서 블루프린트 및 워크플로를 사용하여 복잡한 ETL 활동 수행](orchestrate-using-workflows.md)
+ [AWS Glue에서 블루프린트 개발](orchestrate-using-blueprints.md)

# 트리거를 사용하여 작업 및 크롤러 시작
<a name="trigger-job"></a>

AWS Glue에서는 트리거라는 Data Catalog 객체를 생성할 수 있습니다. 이 객체를 사용하면 하나 이상의 크롤러 또는 추출, 변환, 로드 작업을 수동 또는 자동으로 시작할 수 있습니다. 트리거를 사용하여 종속 작업 및 크롤러 체인을 설계할 수 있습니다.

**참고**  
*워크플로우*를 정의하여 동일한 작업을 수행할 수 있습니다. 워크플로우는 복잡한 다중 작업 ETL 작업을 생성하는 데 권장됩니다. 자세한 내용은 [AWS Glue에서 블루프린트 및 워크플로를 사용하여 복잡한 ETL 활동 수행](orchestrate-using-workflows.md) 섹션을 참조하세요.

**Topics**
+ [AWS Glue 트리거](about-triggers.md)
+ [트리거 추가](console-triggers.md)
+ [트리거 활성화 및 비활성화](activate-triggers.md)

# AWS Glue 트리거
<a name="about-triggers"></a>

트리거가 *실행*되면 지정된 작업 및 크롤러를 시작할 수 있습니다. 트리거는 일정에 따라 또는 이벤트 조합을 기반으로 요청 시 실행됩니다.

**참고**  
단일 트리거로 2개의 크롤러만 활성화할 수 있습니다. 여러 개의 데이터 스토어를 크롤링하려면 여러 크롤러를 동시에 실행하지 말고 크롤러마다 각각 여러 개의 소스를 사용합니다.

트리거는 여러 상태 중 하나에 존재할 수 있습니다. 트리거는 `CREATED`, `ACTIVATED` 또는 `DEACTIVATED`입니다. 일시적 상태(예: `ACTIVATING`)도 있습니다. 트리거 실행을 일시적으로 중지하려면 비활성화할 수 있습니다. 그런 다음 나중에 다시 활성화할 수 있습니다.

트리거에는 다음 세 가지 유형이 있습니다.

**예약됨**  
`cron` 기반의 시간 기반 트리거  
일정에 따라 일련의 작업 또는 크롤러에 대한 트리거를 생성할 수 있습니다. 작업 또는 크롤러가 실행되는 빈도, 실행되는 요일 및 실행되는 시간과 같은 제약 조건을 지정할 수 있습니다. 이 제약 조건은 `cron`을 기반으로 합니다. 트리거를 위한 일정을 설정하고자 한다면 cron의 기능 및 제한을 고려해야 합니다. 예를 들어, 매월 31일에 크롤러를 실행하고자 한다면 매월 31일이 없다는 점을 유의하기 바랍니다. Cron에 대한 자세한 내용은 [작업 및 크롤러를 위한 시간 기반 일정](monitor-data-warehouse-schedule.md) 섹션을 참조하세요.

**조건**  
이전 작업이나 크롤러 또는 여러 작업이나 크롤러가 조건 목록을 만족할 때 실행되는 트리거입니다.  
 조건부 트리거를 생성할 때 감시할 작업 목록과 크롤러 목록을 지정합니다. 감시한 각 작업 또는 크롤러에 대해 감시할 상태(예: 성공, 실패, 시간 초과 등)를 지정합니다. 감시한 작업 또는 크롤러가 지정된 상태로 종료되면 트리거가 실행됩니다. 감시한 이벤트 중 일부 또는 전부가 발생할 때 트리거가 실행되도록 구성할 수 있습니다.  
예를 들어 작업 J1과 작업 J2가 모두 성공적으로 완료되면 작업 J3을 시작하도록 트리거 T1을 구성하고 작업 J1 또는 작업 J2 중 하나가 실패할 경우 작업 J4를 시작하도록 또 다른 트리거 T2를 구성할 수 있습니다.  
다음 표에는 트리거가 감시하는 작업 및 크롤러 완료 상태(이벤트)가 나와 있습니다.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/about-triggers.html)

**온디맨드**  
활성화할 때 실행되는 트리거입니다. 온디맨드 트리거는 `ACTIVATED` 또는 `DEACTIVATED` 상태로 전환되지 않습니다. 항상 `CREATED` 상태로 유지됩니다.

트리거가 존재하는 즉시 실행할 수 있도록 플래그를 설정하여 생성할 때 예약된 트리거와 조건부 트리거를 활성화할 수 있습니다.

**중요**  
다른 작업 또는 크롤러 완료 시 실행되는 작업 또는 크롤러를 *종속*이라고 합니다. 종속 작업 또는 크롤러는 완료된 작업 또는 크롤러가 트리거에 의해 시작된 경우에만 시작됩니다. 종속 체인 내의 모든 작업 또는 크롤러는 단일 **예약됨** 또는 **온디맨드** 트리거의 하위 요소여야 합니다.

**트리거를 사용하여 작업 파라미터 전달**  
트리거는 시작하는 작업에 파라미터를 전달할 수 있습니다. 매개 변수에는 작업 인수, 시간 초과 값, 보안 구성 등이 포함됩니다. 트리거가 여러 작업을 시작하면 파라미터가 각 작업에 전달됩니다.

다음은 트리거에 의해 전달된 작업 인수에 대한 규칙입니다.
+ 키 - 값 쌍의 키가 기본 작업 인수와 일치하면 전달된 인수는 기본 인수를 재정의합니다. 키가 기본 인수와 일치하지 않으면 인수는 추가 인수로 작업에 전달됩니다.
+ 키 - 값 쌍의 키가 재정의할 수 없는 인수와 일치하면 전달된 인수는 무시됩니다.

자세한 내용은 AWS Glue API의 [트리거](aws-glue-api-jobs-trigger.md) 단원을 참조하십시오.

# 트리거 추가
<a name="console-triggers"></a>

AWS Glue 콘솔, AWS Command Line Interface(AWS CLI) 또는 AWS Glue API를 사용하여 트리거를 추가할 수 있습니다.

**트리거를 추가하려면(콘솔)**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창의 **ETL** 아래에서 **트리거**를 선택합니다. **트리거 추가**를 선택합니다.

1. 다음 속성을 제공합니다.  
**명칭**  
트리거에 고유한 이름을 지정합니다.  
**트리거 유형**  
다음 중 하나를 지정하세요.  
   + **일정:** 트리거는 특정 빈도와 시간에 실행됩니다.
   + **작업 이벤트:** 조건부 트리거입니다. 목록의 작업 중 일부 또는 전부가 지정된 상태와 일치하면 트리거가 실행됩니다. 트리거가 실행되기 위해서는 감시한 작업이 트리거에 의해 시작되었어야 합니다. 어떤 작업을 선택하든지 하나의 작업 이벤트(완료 상태)만 감시할 수 있습니다.
   + **온디맨드:** 트리거가 활성화되면 실행됩니다.

1. 트리거 마법사를 완료합니다. [**검토(Review)**] 페이지에서 [**생성 시 트리거 사용(Enable trigger on creation)**]을 선택하여 [**일정(Schedule)**] 및 [**작업 이벤트(Job events)**](조건부) 트리거를 즉시 활성화할 수 있습니다.

**트리거를 추가하려면(AWS CLI)**
+ 다음과 유사한 명령을 입력합니다.

  ```
  aws glue create-trigger --name MyTrigger --type SCHEDULED --schedule  "cron(0 12 * * ? *)" --actions CrawlerName=MyCrawler --start-on-creation  
  ```

  이 명령은 라는 `MyTrigger`라는 스케줄 트리거를 생성합니다. 이 트리거는 매일 오후 12시(UTC)에 실행되며 `MyCrawler`라는 크롤러를 시작합니다. 트리거는 활성화된 상태로 생성됩니다.

자세한 내용은 [AWS Glue 트리거](about-triggers.md) 섹션을 참조하세요.

# 작업 및 크롤러를 위한 시간 기반 일정
<a name="monitor-data-warehouse-schedule"></a>

AWS Glue에서 작업 및 크롤러를 위한 시간 기반 일정을 정의합니다. 일정 정의는 Unix식 [cron](http://en.wikipedia.org/wiki/Cron) 구문을 사용합니다. [협정시계시(UTC)](http://en.wikipedia.org/wiki/Coordinated_Universal_Time)의 시간을 지정항고 일정을 위한 최소한의 정확도는 5분입니다.

일정을 사용하여 실행되도록 작업 및 크롤러 구성에 대한 자세한 내용은 [트리거를 사용하여 작업 및 크롤러 시작](trigger-job.md) 섹션을 참조하세요.

## cron 표현식
<a name="CronExpressions"></a>

cron 표현식에는 각각 공백으로 구분되는 필수 필드 6개가 있습니다.

**구문**

```
cron(Minutes Hours Day-of-month Month Day-of-week Year)
```


| **필드** | **값** | **와일드카드** | 
| --- | --- | --- | 
|  Minutes  |  0\$159  |  , - \$1 /  | 
|  Hours  |  0\$123  |  , - \$1 /  | 
|  Day-of-month  |  1\$131  |  , - \$1 ? / L W  | 
|  월  |  1\$112 또는 JAN-DEC  |  , - \$1 /  | 
|  요일  |  1\$17 또는 SUN\$1SAT  |  , - \$1 ? / L  | 
|  연도  |  1970\$12199  |  , - \$1 /  | 

**와일드카드**
+ **,**(쉼표) 와일드카드는 추가 값을 포함합니다. `Month` 필드에서 `JAN,FEB,MAR`는 1월, 2월, 3월을 포함한다는 의미입니다.
+ **-**(대시) 와일드카드는 범위를 지정합니다. `Day` 필드에서 1\$115는 지정된 달의 1일에서 15일까지 포함한다는 의미입니다.
+ **\$1**(별표) 와일드카드는 필드의 모든 값을 포함합니다. `Hours` 필드에서 **\$1**는 모든 시간을 포함한다는 의미입니다.
+ **/**(슬래시) 와일드카드로 증분을 지정합니다. `Minutes` 필드에서 **1/10**을 입력하면 지정한 시간의 1분부터 시작해서 매 10분 간격(예를 들어, 11분, 21분, 31분 등)을 지정할 수 있습니다.
+ **?**(물음표) 와일드카드는 어떤 한 가지나 다른 것을 지정합니다. `Day-of-month` 필드에 **7**을 입력하고 Day-of-week 필드에는 **?**을 입력하면 매월 7일이 무슨 요일이든 상관없이 7번째 되는 날을 지정한다는 의미입니다.
+ `Day-of-month` 또는 `Day-of-week` 필드에서 **L** 와일드카드는 해당 월 또는 주의 마지막 날을 지정합니다.
+ ] 필드에서는 **W** 와일드카드로 어떤 한 평일을 지정할 수 있습니다. `Day-of-month` `Day-of-month` 필드에서 `3W`를 해당 월의 세 번째 평일에 가장 가까운 날을 지정할 수 있습니다.

**Limits**
+ 동일한 cron 표현식에 `Day-of-month`와 `Day-of-week` 필드를 지정할 수 없습니다. 이 필드 중 하나에 값을 지정하는 경우에는 다른 필드에서 반드시 **?**(물음표)를 사용해야 합니다.
+ 5분보다 빠른 속도로 이어지는 cron 식은 지원되지 않습니다.

**예시**  
일정을 생성할 때는 다음과 같은 Cron 문자열을 사용할 수 있습니다.


| 분 | 시간 | 일 | 월 | 요일 | 연도 | 의미 | 
| --- | --- | --- | --- | --- | --- | --- | 
|  0  |  10  |  \$1  |  \$1  |  ?  |  \$1  |  매일 오전 10시(UTC)에 실행  | 
|  15  |  12  |  \$1  |  \$1  |  ?  |  \$1  |  매일 오후 12시 15분(UTC)에 실행  | 
|  0  |  18  |  ?  |  \$1  |  월-금  |  \$1  |  매주 월요일부터 금요일까지 오후 6시(UTC)에 실행  | 
|  0  |  8  |  1  |  \$1  |  ?  |  \$1  |  매월 1일 오전 8시(UTC)에 실행  | 
|  0/15  |  \$1  |  \$1  |  \$1  |  ?  |  \$1  |  15분마다 실행  | 
|  0/10  |  \$1  |  ?  |  \$1  |  월-금  |  \$1  |  월요일부터 금요일까지 10분마다 실행  | 
|  0/5  |  8\$117  |  ?  |  \$1  |  월-금  |  \$1  |  월요일부터 금요일까지 오전 8시부터 오후 5시 55분(UTC) 사이에 5분마다 실행  | 

예를 들어, 매일 12시 15분(UTC)에 실행하려면 다음과 같이 지정합니다.

```
cron(15 12 * * ? *)   
```

# 트리거 활성화 및 비활성화
<a name="activate-triggers"></a>

AWS Glue 콘솔, AWS Command Line Interface(AWS CLI) 또는 AWS Glue API를 사용하여 트리거를 활성화하거나 비활성화할 수 있습니다.

**트리거를 활성화 또는 비활성화하려면(콘솔)**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창의 **ETL** 아래에서 **트리거**를 선택합니다.

1. 원하는 트리거 옆의 확인란을 선택하고 **작업** 메뉴에서 **트리거 활성화**를 선택하여 트리거를 활성화하거나 **트리거 **를 선택하여 트리거를 비활성화합니다.

**트리거를 활성화 또는 비활성화하려면(AWS CLI)**
+ 다음 명령 중 하나를 입력합니다.

  ```
  aws glue start-trigger --name MyTrigger  
  
  aws glue stop-trigger --name MyTrigger
  ```

  트리거를 시작하면 트리거가 활성화되고 트리거를 중지하면 트리거가 비활성화됩니다. 온디맨드 트리거를 활성화하면 즉시 실행됩니다.

자세한 내용은 [AWS Glue 트리거](about-triggers.md) 섹션을 참조하세요.

# AWS Glue에서 블루프린트 및 워크플로를 사용하여 복잡한 ETL 활동 수행
<a name="orchestrate-using-workflows"></a>

조직의 복잡한 추출, 변환, 로드 프로세스 중 일부는 여러 종속 AWS Glue 작업 및 크롤러를 사용하여 가장 잘 구현될 수 있습니다. AWS Glue **워크플로를 사용하면 AWS Glue에서 단일 엔터티로 실행하고 추적할 수 있는 복잡한 다중 작업, 다중 크롤러 ETL 프로세스를 설계할 수 있습니다. 워크플로를 생성하고 워크플로에서 작업, 크롤러 및 트리거를 지정한 후 온디맨드로 또는 일정에 따라 워크플로를 실행할 수 있습니다.

**Topics**
+ [AWS Glue의 워크플로 개요](workflows_overview.md)
+ [AWS Glue에서 워크플로 수동 생성 및 구축](creating_running_workflows.md)
+ [Amazon EventBridge 이벤트로 AWS Glue 워크플로 시작](starting-workflow-eventbridge.md)
+ [워크플로를 시작한 EventBridge 이벤트 보기](viewing-start-event-info.md)
+ [AWS Glue에서 워크플로 실행 및 모니터링](running_monitoring_workflow.md)
+ [워크플로 실행 중지](workflow-stopping.md)
+ [워크플로 실행 복구 및 재개](resuming-workflow.md)
+ [AWS Glue에서 워크플로 실행 속성 가져오기 및 설정](workflow-run-properties-code.md)
+ [AWS Glue API를 사용하여 워크플로 쿼리](workflows_api_concepts.md)
+ [AWS Glue의 블루프린트 및 워크플로 제한 사항](blueprint_workflow_restrictions.md)
+ [AWS Glue의 블루프린트 오류 해결](blueprint_workflow_troubleshoot.md)
+ [AWS Glue 블루프린트에 대한 페르소나 및 역할의 권한](blueprints-personas-permissions.md)

# AWS Glue의 워크플로 개요
<a name="workflows_overview"></a>

AWS Glue에서 여러 크롤러, 작업 및 트리거가 포함된 복잡한 ETL(추출, 변환 및 로드) 활동을 생성 및 시각화할 수 있습니다. 각 워크플로는 모든 구성 요소의 실행과 모니터링을 관리합니다. 워크플로는 각 구성 요소를 실행할 때 실행 진행률과 상태를 기록합니다. 이는 더 큰 태스크의 개요와 각 단계의 세부 정보를 제공합니다. AWS Glue 콘솔은 워크플로우의 시각적 표현을 그래프로 제공합니다.

AWS Glue 블루프린트에서 워크플로를 생성하거나 AWS Management Console 또는 AWS Glue API를 사용하여 구성 요소를 한 번에 수동으로 워크플로를 구축할 수 있습니다. 청사진에 대한 자세한 내용은 [AWS Glue의 블루프린트 개요](blueprints-overview.md)을 참조하세요.

워크플로 내의 *트리거*는 작업과 크롤러를 모두 시작할 수 있으며 작업 또는 크롤러가 완료되면 실행될 수 있습니다. 트리거를 사용하여 상호 종속된 작업과 크롤러로 이루어진 대형 체인을 생성할 수 있습니다. 작업 및 크롤러 종속성을 정의하는 워크플로 내의 트리거 외에도 각 워크플로에는 *시작 트리거*가 있습니다. 시작 트리거에는 다음 세 가지 유형이 있습니다.
+ **일정** - 정의한 일정에 따라 워크플로가 시작됩니다. 일정은 매일, 매주, 매월 등이 될 수도 있고 `cron` 표현식을 기반으로 한 사용자 정의 일정이 될 수도 있습니다.
+ **온디맨드** - 워크플로가 AWS Glue 콘솔, API 또는 AWS CLI에서 수동으로 시작됩니다.
+ **EventBridge 이벤트** – 단일 Amazon EventBridge 이벤트 또는 Amazon EventBridge 이벤트 배치가 발생하면 워크플로가 시작됩니다. 이 트리거 유형을 사용하면 AWS Glue는 이벤트 중심 아키텍처에서 이벤트 소비자가 될 수 있습니다. 모든 EventBridge 이벤트 유형은 워크플로를 시작할 수 있습니다. 일반적인 사용 사례는 Amazon S3 버킷에 새 객체가 도착하는 것입니다(S3 `PutObject` 작업).

  이벤트 배치로 워크플로를 시작한다는 것은 지정된 수의 이벤트가 수신되거나 지정된 시간이 경과할 때까지 기다리는 것을 의미합니다. EventBridge 이벤트 트리거를 생성할 때 선택적으로 배치 조건을 지정할 수 있습니다. 배치 조건을 지정하는 경우 배치 크기(이벤트 수)를 지정해야 하며 선택적으로 배치 기간(초 수)을 지정할 수 있습니다. 기본 및 최대 배치 기간은 900초(15분)입니다. 먼저 충족되는 배치 조건이 워크플로를 시작합니다. 첫 번째 이벤트가 도착하면 배치 기간이 시작됩니다. 트리거를 생성할 때 배치 조건을 지정하지 않으면 배치 크기는 기본적으로 1로 설정됩니다.

  워크플로가 시작되면 배치 조건이 재설정되고 이벤트 트리거는 워크플로를 다시 시작하기 위해 충족되는 다음 배치 조건을 감시하기 시작합니다.

  다음 표는 배치 크기와 배치 기간이 함께 작동하여 워크플로를 트리거하는 방법을 보여줍니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/workflows_overview.html)

  `GetWorkflowRun` API 작업은 워크플로를 트리거한 배치 조건을 반환합니다.

워크플로 시작 방법에 관계 없이 워크플로를 생성할 때 동시 워크플로 실행의 최대 수를 지정할 수 있습니다.

이벤트 또는 이벤트 배치가 결국 실패하는 워크플로 실행을 시작하는 경우 해당 이벤트 또는 이벤트 배치는 더 이상 워크플로 실행 시작에 대해 고려되지 않습니다. 새 워크플로 실행은 다음 이벤트 또는 이벤트 배치가 도착할 때만 시작됩니다.

**중요**  
워크플로 내 작업, 크롤러, 트리거의 총수를 100개 이하로 제한합니다. 100개가 넘게 포함될 경우 워크플로 실행을 재개하거나 중지하려고 할 때 오류가 발생할 수 있습니다.

이벤트 조건이 충족되더라도 워크플로에 대해 설정된 동시성 제한을 초과하면 워크플로 실행이 시작되지 않습니다. 예상 이벤트 볼륨에 따라 워크플로 동시성 제한을 조정하는 것이 좋습니다. AWS Glue는 초과 동시성 제한으로 인해 실패한 워크플로 실행을 다시 시도하지 않습니다. 마찬가지로, 예상 이벤트 볼륨을 기반으로 워크플로 내에서 작업 및 크롤러에 대한 동시성 제한을 조정하는 것이 좋습니다.

**워크플로 실행 속성**  
워크플로우 실행 전체의 상태를 공유 및 관리하려면 기본 워크플로우 실행 속성을 정의하면 됩니다. 이름/값 페어인 이러한 속성은 워크플로우의 모든 작업에서 사용할 수 있습니다. AWS Glue API를 사용하여 작업은 워크플로우 실행 속성을 검색하고 워크플로우에 나중에 오는 작업을 위해 수정할 수 있습니다.

**워크플로 그래프**  
다음 이미지에서는 AWS Glue 콘솔에서 매우 기본적인 워크플로의 그래프를 보여줍니다. 워크플로우에는 구성 요소가 수십 개 있을 수 있습니다.

![\[워크플로의 그래프 탭을 보여주는 콘솔 스크린샷. 그래프에는 일정 트리거, 작업 2개, 이벤트 성공 트리거, 스키마를 업데이트하는 크롤러를 나타내는 아이콘 5개가 포함되어 있습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/graph-complete-with-tabs.png)


이 워크플로는 2개의 작업 `De-duplicate` 및 `Fix phone numbers`를 시작하는 일정 트리거 `Month-close1`에 의해 시작됩니다. 두 작업이 성공적으로 완료되면 이벤트 트리거 `Fix/De-dupe succeeded`가 크롤러 `Update schema`를 시작합니다.

**정적 및 동적 워크플로 보기**  
워크플로우별로 *정적 보기*와 *동적 보기*라는 개념이 있습니다. 정적 보기는 워크플로우의 설계를 나타냅니다. 동적 보기는 각 작업 및 크롤러에 대한 최신 실행 정보를 포함하는 런타임 보기입니다. 실행 정보에는 성공 상태와 오류 세부 정보가 포함됩니다.

워크플로우가 실행 중이면 콘솔에 완료된 작업과 아직 실행될 작업을 그래픽으로 나타내는 동적 보기가 표시됩니다. AWS Glue API를 사용하여 실행 중인 워크플로의 동적 보기를 검색할 수도 있습니다. 자세한 내용은 [AWS Glue API를 사용하여 워크플로 쿼리](workflows_api_concepts.md) 섹션을 참조하세요.

**다음 사항도 참조하세요.**  
[AWS Glue의 블루프린트에서 워크플로 생성](creating_workflow_blueprint.md)
[AWS Glue에서 워크플로 수동 생성 및 구축](creating_running_workflows.md)
[워크플로](aws-glue-api-workflow.md)(워크플로 API의 경우)

# AWS Glue에서 워크플로 수동 생성 및 구축
<a name="creating_running_workflows"></a>

AWS Glue 콘솔을 사용하여 한 번에 한 노드씩 워크플로를 수동으로 생성하고 구축할 수 있습니다.

워크플로우에는 작업, 크롤러 및 트리거가 포함됩니다. 수동으로 워크플로를 생성하기 전에 워크플로에 포함시킬 작업과 크롤러를 생성합니다. 워크플로에 요청 시 실행되는 크롤러를 지정하는 것이 좋습니다. 워크플로우를 구축하는 동안 새 트리거를 생성할 수도 있고, 기존 트리거를 워크플로우에 *복제*할 수도 있습니다. 트리거를 복제하면 트리거와 연결된 모든 카탈로그 객체(이를 실행하는 작업 또는 크롤러 및 시작하는 작업 또는 크롤러)가 워크플로에 추가됩니다.

**중요**  
워크플로 내 작업, 크롤러, 트리거의 총수를 100개 이하로 제한합니다. 100개가 넘게 포함될 경우 워크플로 실행을 재개하거나 중지하려고 할 때 오류가 발생할 수 있습니다.

워크플로우 그래프에 트리거를 추가하고 각 트리거에 대해 감시되는 이벤트와 작업을 정의하여 워크플로우를 구축합니다. 온디맨드 트리거 또는 일정 트리거인 *시작 트리거*를 시작하고, 이벤트(조건부) 트리거를 추가하여 그래프를 완성합니다.

## 1단계: 워크플로우 생성
<a name="workflow-step1"></a>

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창의 **ETL** 아래에서 **Workflows(워크플로우)**를 선택합니다.

1. **Add workflow(워크플로우 추가)**를 선택하고 **Add a new ETL workflow(새 ETL 워크플로우 추가)** 양식을 작성합니다.

   추가하는 선택적 기본 실행 속성은 워크플로우의 모든 작업에 대한 인수로 사용할 수 있습니다. 자세한 내용은 [AWS Glue에서 워크플로 실행 속성 가져오기 및 설정](workflow-run-properties-code.md) 섹션을 참조하세요.

1. **Add workflow(워크플로우 추가)**를 선택합니다.

   새 워크플로우가 **Workflows(워크플로우)** 페이지의 목록에 나타납니다.

## 2단계: 시작 트리거 추가
<a name="workflow-step2"></a>

1. **Workflows(워크플로우)** 페이지에서 새 워크플로우를 선택합니다. 그런 다음 페이지 하단에서 [**그래프(Graph)**] 탭이 선택되어 있는지 확인합니다.

1. **Add trigger(트리거 추가)**를 선택하고 **Add trigger(트리거 추가)** 대화 상자에서 다음 중 하나를 수행합니다.
   + **Clone existing(기존 복제)**을 선택하고 복제할 트리거를 선택합니다. 그런 다음 **추가**를 선택합니다.

     트리거가 감시하는 작업 및 크롤러와 트리거가 시작하는 작업 및 크롤러와 함께 트리거가 그래프에 나타납니다.

     실수로 잘못된 트리거를 선택한 경우 그래프에서 해당 트리거를 선택한 후 **Remove(제거)**를 선택합니다.
   + **Add new(새로 추가)**를 선택하고 **Add trigger(트리거 추가)** 양식을 작성합니다.

     1. [**트리거 유형(Trigger type)**]에 대해 [**일정(Schedule)**], [**온디맨드(On demand)**] 또는 [**EventBridge 이벤트(EventBridge event)**]를 선택합니다.

        트리거 유형 [**일정(Schedule)**]에서 [**주파수(Frequency)**] 옵션 중 하나를 선택합니다. [**사용자 정의(Custom)**]를 선택하여 `cron` 표현식을 입력합니다.

        트리거 유형 [**EventBridge 이벤트(EventBridge event)**]의 경우 [**이벤트 수(Number of events)**](배치 크기)를 입력하고 선택적으로 [**시간 지연(Time delay)**](배치 기간)을 입력합니다. [**시간 지연(Time delay)**]을 생략하면 배치 기간은 기본적으로 15분으로 설정됩니다. 자세한 내용은 [AWS Glue의 워크플로 개요](workflows_overview.md) 섹션을 참조하세요.

     1. **추가**를 선택합니다.

     자리 표시자 노드(**Add node(노드 추가)**라고 레이블이 지정됨)와 함께 트리거가 그래프에 나타납니다. 아래 예에서 시작 트리거는 `Month-close1`이라는 일정 트리거입니다.

     이때 트리거는 아직 저장되어 있지 않습니다.  
![\[직사각형 노드 2개가 있는 그래프: 트리거와 자리 표시자 노드. 화살표는 트리거 노드에서 자리 표시자 노드 쪽을 가리킵니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/graph-start-trigger.png)

1. 새 트리거를 추가한 경우 다음 단계를 완료합니다.

   1. 다음 중 하나를 수행하세요.
      + 자리 표시자 노드(**Add node(노드 추가)**)를 선택합니다.
      + 시작 트리거가 선택되어 있는지 확인하고, 그래프 위의 **Action(작업)** 메뉴에서 **Add jobs/crawlers to trigger(트리거할 작업/크롤러 추가)**를 선택합니다.

   1. **Add jobs(s) and crawler(s) to trigger(트리거할 작업 및 크롤러 추가)** 대화 상자에서 작업 또는 크롤러를 하나 이상 선택한 후 **Add(추가)**를 선택합니다.

      트리거가 저장되고, 선택한 작업 또는 크롤러가 트리거의 커넥터와 함께 그래프에 나타납니다.

      실수로 잘못된 작업 또는 크롤러를 추가한 경우, 해당 트리거 또는 커넥터를 선택하고 **Remove(제거)**를 선택하면 됩니다.

## 3단계: 트리거 추가
<a name="workflow-step3"></a>

[**이벤트(Event)**] 유형의 트리거를 더 추가하여 워크플로를 계속 구축합니다. 그래프 캔버스를 축소 또는 확대하려면 그래프 오른쪽의 아이콘을 사용합니다. 추가할 각 트리거에 대해 다음 단계를 완료합니다.

**참고**  
워크플로를 저장하는 작업은 없습니다. 마지막 트리거를 추가하고 트리거에 작업을 할당하면 워크플로가 완료되고 저장됩니다. 나중에 언제든지 다시 돌아와서 노드를 더 추가할 수 있습니다.

1. 다음 중 하나를 수행하세요.
   + 기존 트리거를 복제하려면 그래프의 노드가 선택되어 있지 않은지 확인하고, **Action(작업)** 메뉴에서 **Add trigger(트리거 추가)**를 선택합니다.
   + 그래프에서 특정 작업 또는 크롤러를 감시하는 새 트리거를 추가하려면 작업 또는 크롤러 노드를 선택한 후 **Add trigger(트리거 추가)** 자리 표시자 노드를 선택합니다.

     이후 단계에서 이 트리거가 감시할 작업 또는 크롤러를 더 추가할 수 있습니다.

1.  **Add Folder(폴더 추가)** 대화 상자에서 다음 중 하나를 수행합니다.
   + **Add new(새로 추가)**를 선택하고 **Add trigger(트리거 추가)** 양식을 작성합니다. 그런 다음 **추가**를 선택합니다.

     트리거가 그래프에 나타납니다. 이후 단계에서 트리거를 완료합니다.
   + **Clone existing(기존 복제)**을 선택하고 복제할 트리거를 선택합니다. 그런 다음 **추가**를 선택합니다.

     트리거가 감시하는 작업 및 크롤러와 트리거가 시작하는 작업 및 크롤러와 함께 트리거가 그래프에 나타납니다.

     실수로 잘못된 트리거를 선택한 경우 그래프에서 해당 트리거를 선택한 후 **Remove(제거)**를 선택합니다.

1. 새 트리거를 추가한 경우 다음 단계를 완료합니다.

   1. 새 트리거를 선택합니다.

      다음 그래프에 나와 있듯이 트리거 `De-dupe/fix succeeded`가선택되고 감시할 (1) 이벤트와 (2) 작업에 대한 자리 표시자 노드가 나타납니다.  
![\[많은 노드가 있는 그래프, 이 중 두 노드는 번호 1과 2로 부르는 자리 표시자 노드입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/graph-dual-placeholders.png)

   1. (트리거가 이미 이벤트를 감시하고 감시할 작업 또는 크롤러를 더 추가하려는 경우의 선택 사항) 감시할 이벤트 자리 표시자 노드를 선택하고, **Add job(s) and crawler(s) to watch(감시할 작업 및 크롤러 추가)** 대화 상자에서 작업 또는 크롤러를 하나 이상 선택합니다. 감시할 이벤트를 선택하고(SUCCEEDED, FAILED 등) **Add(추가)**를 선택합니다.

   1. 트리거가 선택되었는지 확인하고, 작업 자리 표시자 노드를 선택합니다.

   1. **Add job(s) and crawler(s) to watch(감시할 작업 및 크롤러 추가)** 대화 상자에서 작업 또는 크롤러를 하나 이상 선택하고 **Add(추가)**를 선택합니다.

      선택한 작업 및 크롤러가 트리거의 커넥터와 함께 그래프에 나타납니다.

워크플로와 블루프린트에 대한 자세한 내용은 다음 주제를 참조하세요.
+ [AWS Glue의 워크플로 개요](workflows_overview.md)
+ [AWS Glue에서 워크플로 실행 및 모니터링](running_monitoring_workflow.md)
+ [AWS Glue의 블루프린트에서 워크플로 생성](creating_workflow_blueprint.md)

# Amazon EventBridge 이벤트로 AWS Glue 워크플로 시작
<a name="starting-workflow-eventbridge"></a>

CloudWatch Events라고도 하는 Amazon EventBridge를 사용하면 AWS 서비스를 자동화하고 애플리케이션 가용성 문제나 리소스 변경 같은 시스템 이벤트에 자동으로 대응할 수 있습니다. AWS 서비스의 이벤트는 거의 실시간으로 EventBridge로 전송됩니다. 원하는 이벤트만 표시하도록 간단한 규칙을 작성한 후 규칙과 일치하는 이벤트 발생 시 실행할 자동화 작업을 지정할 수 있습니다.

EventBridge 지원으로 AWS Glue는 이벤트 중심 아키텍처에서 이벤트 생산자 및 소비자 역할을 할 수 있습니다. 워크플로의 경우 AWS Glue는 모든 유형의 EventBridge 이벤트를 소비자로 지원합니다. 가장 일반적인 사용 사례는 Amazon S3 버킷에 새 객체 도착입니다. 데이터가 불규칙하거나 정의되지 않은 간격으로 도착하는 경우 이 데이터를 도착에 최대한 가깝게 처리할 수 있습니다.

**참고**  
AWS Glue는 EventBridge 메시지의 배달을 보장하지 않습니다. AWS Glue는 EventBridge가 중복 메시지를 전달하는 경우 중복 제거를 수행하지 않습니다. 사용 사례에 따라 멱등성을 관리해야 합니다.  
원하지 않는 이벤트가 전송되지 않도록 EventBridge 규칙을 올바르게 구성해야 합니다.

**시작하기 전 준비 사항**  
Amazon S3 데이터 이벤트로 워크플로를 시작하려면 관심 있는 S3 버킷에 대한 이벤트가 AWS CloudTrail 및 EventBridge에 기록되었는지 확인해야 합니다. 그러려면 CloudTrail 추적을 생성해야 합니다. 자세한 내용은 [AWS 계정에 대한 추적 생성](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)을 참조하세요.

**EventBridge 이벤트로 워크플로를 시작하려면**
**참고**  
다음 명령에서 다음과 같이 바꿉니다.  
*<workflow-name>*을 워크플로에 할당할 이름으로
*<trigger-name>*을 트리거에 할당할 이름으로
*<bucket-name>*을 Amazon S3 버킷의 이름으로
*<account-id>*를 유효한 AWS 계정 ID로
*<region>*을 리전 이름(예: `us-east-1`)으로
*<rule-name>*을 EventBridge 규칙에 할당할 이름으로

1. EventBridge 규칙 및 대상을 생성하고 볼 수 있는 AWS Identity and Access Management(IAM) 권한이 있는지 확인합니다. 다음은 연결할 수 있는 샘플 정책입니다. 작업 및 리소스에 대한 제한을 설정하기 위해 범위를 좁힐 수 있습니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "events:PutRule",
           "events:DisableRule",
           "events:DeleteRule",
           "events:PutTargets",
           "events:RemoveTargets",
           "events:EnableRule",
           "events:List*",
           "events:Describe*"
         ],
         "Resource": "*"
       }
     ]
   }
   ```

------

1. AWS Glue에 이벤트를 전달할 때 EventBridge 서비스가 수임할 수 있는 IAM 역할을 생성합니다.

   1. IAM 콘솔의 **역할 생성** 페이지에서 **AWS 서비스**를 선택합니다. 그런 다음 [**CloudWatch Events**] 서비스를 선택합니다.

   1. [**역할 생성(Create role)**] 마법사를 완료합니다. 마법사가 자동으로 `CloudWatchEventsBuiltInTargetExecutionAccess` 및 `CloudWatchEventsInvocationAccess` 정책을 연결합니다.

   1. 다음 인라인 정책을 역할에 연결합니다. 이 정책은 EventBridge 서비스가 이벤트를 AWS Glue로 보낼 수 있도록 합니다.

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "glue:notifyEvent"
            ],
            "Resource": [
              "arn:aws:glue:us-east-1:111122223333:workflow/workflow-name"
            ]
          }
        ]
      }
      ```

------

1. 다음 명령을 입력하여 워크플로를 생성합니다.

   선택적 추가 명령줄 파라미터에 대한 자세한 내용은 *AWS CLI Command Reference*의 [create-workflow](https://docs.aws.amazon.com/cli/latest/reference/glue/create-workflow.html)를 참조하세요.

   ```
   aws glue create-workflow --name <workflow-name>
   ```

1. 다음 명령을 입력하여 워크플로에 대한 EventBridge 이벤트 트리거를 생성합니다. 워크플로의 시작 트리거가 됩니다. *<actions>*를 수행할 작업(시작할 작업 및 크롤러)으로 바꿉니다.

   `actions` 인수를 코딩하는 방법에 대한 자세한 내용은 *AWS CLI Command Reference*의 [create-trigger](https://docs.aws.amazon.com/cli/latest/reference/glue/create-trigger.html)를 참조하세요.

   ```
   aws glue create-trigger --workflow-name <workflow-name> --type EVENT --name <trigger-name> --actions <actions>
   ```

   단일 EventBridge 이벤트 대신 이벤트 일괄 처리에 의해 워크플로가 트리거되도록 하려면 대신 다음 명령을 입력합니다.

   ```
   aws glue create-trigger --workflow-name <workflow-name> --type EVENT --name <trigger-name> --event-batching-condition BatchSize=<number-of-events>,BatchWindow=<seconds> --actions <actions>
   ```

   `event-batching-condition` 인수의 경우 `BatchSize`는 필수이고 `BatchWindow`는 선택 사항입니다. `BatchWindow`를 생략하면 기간의 기본값은 최대 기간 크기인 900초입니다.  
**Example**  

   다음 예제에서는 3개의 EventBridge 이벤트가 도착한 후 또는 첫 번째 이벤트가 도착하고 5분 후 중 먼저 해당되는 시점에 `eventtest` 워크플로를 시작하는 트리거를 생성합니다.

   ```
   aws glue create-trigger --workflow-name eventtest --type EVENT --name objectArrival --event-batching-condition BatchSize=3,BatchWindow=300 --actions JobName=test1
   ```

1. Amazon EventBridge에서 규칙을 생성합니다.

   1. 원하는 텍스트 편집기에서 규칙 세부 정보에 대한 JSON 객체를 생성합니다.

      다음 예에서는 Amazon S3를 이벤트 소스로, `PutObject`를 이벤트 이름으로, 버킷 이름을 요청 파라미터로 지정합니다. 이 규칙은 새 객체가 버킷에 도착하면 워크플로를 시작합니다.

      ```
      {
        "source": [
          "aws.s3"
        ],
        "detail-type": [
          "AWS API Call via CloudTrail"
        ],
        "detail": {
          "eventSource": [
            "s3.amazonaws.com"
          ],
          "eventName": [
            "PutObject"
          ],
          "requestParameters": {
            "bucketName": [
              "<bucket-name>"
            ]
          }
        }
      }
      ```

      버킷 내의 폴더에 새 객체가 도착할 때 워크플로를 시작하려면 `requestParameters`를 다음 코드로 대체합니다.

      ```
          "requestParameters": {
            "bucketName": [
              "<bucket-name>"
            ]
            "key" : [{ "prefix" : "<folder1>/<folder2>/*"}}]
        }
      ```

   1. 선호하는 도구를 사용하여 규칙 JSON 객체를 이스케이프 처리된 문자열로 변환합니다.

      ```
      {\n  \"source\": [\n    \"aws.s3\"\n  ],\n  \"detail-type\": [\n    \"AWS API Call via CloudTrail\"\n  ],\n  \"detail\": {\n    \"eventSource\": [\n      \"s3.amazonaws.com\"\n    ],\n    \"eventName\": [\n      \"PutObject\"\n    ],\n    \"requestParameters\": {\n      \"bucketName\": [\n        \"<bucket-name>\"\n      ]\n    }\n  }\n}
      ```

   1. 다음 명령을 실행하여 후속 `put-rule` 명령에 대한 입력 파라미터를 지정하기 위해 편집할 수 있는 JSON 파라미터 템플릿을 생성합니다. 출력을 파일에 저장합니다. 이 예에서 파일 이름은 `ruleCommand`입니다.

      ```
      aws events put-rule --name <rule-name> --generate-cli-skeleton >ruleCommand
      ```

      `--generate-cli-skeleton` 파라미터에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [JSON 또는 YAML 입력 파일에서 AWS CLI 스켈레톤 및 입력 파라미터 생성](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-skeleton.html)을 참조하세요.

      출력 파일은 다음과 같습니다.

      ```
      {
          "Name": "",
          "ScheduleExpression": "",
          "EventPattern": "",
          "State": "ENABLED",
          "Description": "",
          "RoleArn": "",
          "Tags": [
              {
                  "Key": "",
                  "Value": ""
              }
          ],
          "EventBusName": ""
      }
      ```

   1. 파일을 편집하여 선택적으로 파라미터를 제거하고 최소한 `Name`, `EventPattern` 및 `State` 파라미터를 지정합니다. `EventPattern` 파라미터에 대해 이전 단계에서 생성한 규칙 세부 정보에 대한 이스케이프 처리된 문자열을 제공합니다.

      ```
      {
          "Name": "<rule-name>",
          "EventPattern": "{\n  \"source\": [\n    \"aws.s3\"\n  ],\n  \"detail-type\": [\n    \"AWS API Call via CloudTrail\"\n  ],\n  \"detail\": {\n    \"eventSource\": [\n      \"s3.amazonaws.com\"\n    ],\n    \"eventName\": [\n      \"PutObject\"\n    ],\n    \"requestParameters\": {\n      \"bucketName\": [\n        \"<bucket-name>\"\n      ]\n    }\n  }\n}",
          "State": "DISABLED",
          "Description": "Start an AWS Glue workflow upon new file arrival in an Amazon S3 bucket"
      }
      ```
**참고**  
워크플로 구축을 마칠 때까지 규칙을 사용 중지 상태로 두는 것이 가장 좋습니다.

   1. 파일 `ruleCommand`에서 입력 파라미터를 읽는 다음 `put-rule` 명령을 입력합니다.

      ```
      aws events put-rule --name <rule-name> --cli-input-json file://ruleCommand
      ```

      다음 출력은 성공을 나타냅니다.

      ```
      {
          "RuleArn": "<rule-arn>"
      }
      ```

1. 다음 명령을 입력하여 대상에 규칙을 연결합니다. 대상은 AWS Glue의 워크플로입니다. *<role-name>*을 이 절차의 시작 부분에서 생성한 역할로 바꿉니다.

   ```
   aws events put-targets --rule <rule-name> --targets "Id"="1","Arn"="arn:aws:glue:<region>:<account-id>:workflow/<workflow-name>","RoleArn"="arn:aws:iam::<account-id>:role/<role-name>" --region <region>
   ```

   다음 출력은 성공을 나타냅니다.

   ```
   {
       "FailedEntryCount": 0,
       "FailedEntries": []
   }
   ```

1. 다음 명령을 입력하여 규칙과 대상이 성공적으로 연결되었는지 확인합니다.

   ```
   aws events list-rule-names-by-target --target-arn arn:aws:glue:<region>:<account-id>:workflow/<workflow-name>
   ```

   다음 출력은 성공을 나타냅니다. 여기서 *<rule-name>*은 생성한 규칙의 이름입니다.

   ```
   {
       "RuleNames": [
           "<rule-name>"
       ]
   }
   ```

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 워크플로를 선택하고 시작 트리거와 해당 작업(시작되는 작업 또는 크롤러) 이 워크플로 그래프에 나타나는지 확인합니다. 그리고 [3단계: 트리거 추가](creating_running_workflows.md#workflow-step3)의 절차로 진행합니다. 또는 AWS Glue API나 AWS Command Line Interface를 사용하여 워크플로에 구성 요소를 더 추가합니다.

1. 워크플로가 완전히 지정되면 규칙을 사용합니다.

   ```
   aws events enable-rule --name <rule-name>
   ```

   이제 EventBridge 이벤트 또는 이벤트 배치로 워크플로를 시작할 준비가 되었습니다.

**다음 사항도 참조하세요.**  
[https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)
[AWS Glue의 워크플로 개요](workflows_overview.md)
[AWS Glue에서 워크플로 수동 생성 및 구축](creating_running_workflows.md)

# 워크플로를 시작한 EventBridge 이벤트 보기
<a name="viewing-start-event-info"></a>

워크플로를 시작한 Amazon EventBridge 이벤트의 이벤트 ID를 볼 수 있습니다. 워크플로가 이벤트 배치로 시작된 경우 배치에 있는 모든 이벤트의 이벤트 ID를 볼 수 있습니다.

배치 크기가 1보다 큰 워크플로의 경우 어떤 배치 조건이 워크플로를 시작했는지 확인할 수도 있습니다(배치 크기의 이벤트 수 도착 또는 배치 기간 만료).

**워크플로를 시작한 EventBridge 이벤트를 보려면(콘솔)**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창에서 [**워크플로(Workflows)**]를 선택합니다.

1. 워크플로를 선택합니다. 그런 다음 하단에서 [**기록(History)**] 탭을 선택합니다.

1. 워크플로 실행을 선택한 다음 [**실행 세부 정보 보기(View run details)**]를 선택합니다.

1. 실행 세부 정보 페이지에서 [**실행 속성(Run properties)**] 필드를 찾아 [**aws:eventIds**] 키를 찾습니다.

   해당 키의 값은 EventBridge 이벤트 ID 목록입니다.

**워크플로를 시작한 EventBridge 이벤트를 보려면(AWS API)**
+ Python 스크립트에 다음 코드를 포함합니다.

  ```
  workflow_params = glue_client.get_workflow_run_properties(Name=workflow_name,RunId=workflow_run_id)
  batched_events = workflow_params['aws:eventIds']
  ```

  `batched_events`는 문자열 목록이며 각 문자열은 이벤트 ID입니다.

**다음 사항도 참조하세요.**  
[https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)
[AWS Glue의 워크플로 개요](workflows_overview.md)

# AWS Glue에서 워크플로 실행 및 모니터링
<a name="running_monitoring_workflow"></a>

워크플로우의 시작 트리거가 온디맨드 트리거인 경우, AWS Glue 콘솔에서 워크플로우를 시작할 수 있습니다. 워크플로를 실행하고 모니터링하려면 다음 단계를 수행합니다. 워크플로가 실패하면 실행 그래프를 보고 실패한 노드를 확인할 수 있습니다. 블루프린트에서 워크플로가 생성된 경우 문제를 해결하기 위해 블루프린트 실행을 보고 워크플로를 생성하는 데 사용된 블루프린트 파라미터 값을 볼 수 있습니다. 자세한 내용은 [AWS Glue에서 블루프린트 실행 보기](viewing_blueprint_runs.md) 섹션을 참조하세요.

AWS Glue 콘솔, API 또는 AWS Command Line Interface(AWS CLI)를 사용하여 워크플로를 실행하고 모니터링할 수 있습니다.

**워크플로를 실행하고 모니터링하려면(콘솔)**

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창의 **ETL** 아래에서 **Workflows(워크플로우)**를 선택합니다.

1. 워크플로우를 선택합니다. **Actions(작업)** 메뉴에서 **Run(실행)**을 선택합니다.

1. 워크플로 목록에서 [**마지막 실행 상태(Last run status)**] 열을 확인합니다. 새로 고침 버튼을 선택하여 진행 중인 워크플로 상태를 봅니다.

1. 워크플로가 실행 중이거나 완료된 후(또는 실패한 후) 다음 단계를 완료하여 실행 세부 정보를 확인합니다.

   1. 워크플로가 선택되어 있는지 확인하고 [**기록(History)**] 탭을 선택합니다.

   1. 현재 또는 가장 최근 워크플로 실행을 선택한 다음 [**실행 세부 정보 보기(View run details)**]를 선택합니다.

      워크플로 런타임 그래프는 현재 실행 상태를 보여줍니다.

   1. 그래프에서 노드를 선택하여 노드의 세부 정보와 상태를 봅니다.  
![\[실행 그래프는 작업을 시작하는 시작 트리거를 보여줍니다. 다른 트리거는 작업 완료를 감시합니다. 작업 노드(클립보드 아이콘과 작업 이름을 포함하는 사각형)가 선택되고 작업 세부 정보가 오른쪽 창에 표시됩니다. 작업 세부 정보에는 작업 실행 ID 및 상태가 포함됩니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/workflow-pre-select-resume.png)

**워크플로를 실행하고 모니터링하려면(AWS CLI)**

1. 다음 명령을 입력합니다. *<workflow-name>*을 실행할 워크플로우로 바꿉니다.

   ```
   aws glue start-workflow-run --name <workflow-name>
   ```

   워크플로우가 성공적으로 시작되면 명령은 실행 ID를 반환합니다.

1. `get-workflow-run` 명령을 사용하여 워크플로 실행 상태를 봅니다. 워크플로 이름과 실행 ID를 제공합니다.

   ```
   aws glue get-workflow-run --name myWorkflow --run-id wr_d2af14217e8eae775ba7b1fc6fc7a42c795aed3cbcd8763f9415452e2dbc8705
   ```

   다음은 샘플 명령 출력입니다.

   ```
   {
       "Run": {
           "Name": "myWorkflow",
           "WorkflowRunId": "wr_d2af14217e8eae775ba7b1fc6fc7a42c795aed3cbcd8763f9415452e2dbc8705",
           "WorkflowRunProperties": {
               "run_state": "COMPLETED",
               "unique_id": "fee63f30-c512-4742-a9b1-7c8183bdaae2"
           },
           "StartedOn": 1578556843.049,
           "CompletedOn": 1578558649.928,
           "Status": "COMPLETED",
           "Statistics": {
               "TotalActions": 11,
               "TimeoutActions": 0,
               "FailedActions": 0,
               "StoppedActions": 0,
               "SucceededActions": 9,
               "RunningActions": 0,
               "ErroredActions": 0
           }
       }
   }
   ```

**또한 다음 섹션도 참조하세요.**  
[AWS Glue의 워크플로 개요](workflows_overview.md)
[AWS Glue의 블루프린트 개요](blueprints-overview.md)

# 워크플로 실행 중지
<a name="workflow-stopping"></a>

AWS Glue 콘솔, AWS Command Line Interface(AWS CLI) 또는 AWS Glue API를 사용하여 워크플로우 실행을 중지할 수 있습니다. 워크플로우 실행을 중지하면 실행 중인 모든 작업과 크롤러가 즉시 종료되고 아직 시작되지 않은 작업과 크롤러는 시작되지 않습니다. 실행 중인 모든 작업 및 크롤러가 중지되려면 최대 1분이 걸릴 수 있습니다. 워크플로우 실행 상태가 **Running(실행 중)**에서 **Stopping(중지 중)**으로 바뀌고, 워크플로우 실행이 완전히 중지되면 상태가 **Stopped(중지됨)**로 바뀝니다.

워크플로우 실행이 중지된 후 실행 그래프를 보고 완료된 작업 및 크롤러와 시작되지 않은 작업 및 크롤러를 확인할 수 있습니다. 그런 다음 데이터 무결성을 보장하기 위한 단계를 수행해야 하는지 여부를 결정할 수 있습니다. 워크플로우 실행을 중지하면 자동 롤백 작업이 수행되지 않습니다.

**워크플로우 실행을 중지하려면(콘솔)**

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창의 **ETL** 아래에서 **Workflows(워크플로우)**를 선택합니다.

1. 실행 중인 워크플로우를 선택한 다음 **History(기록)** 탭을 선택합니다.

1. 워크플로우 실행을 선택한 다음 **Stop run(실행 중지)**을 선택합니다.

   실행 상태가 **Stopping(중지 중)**으로 변경됩니다.

1. (선택 사항) 워크플로우 실행을 선택하고 **View run details(실행 세부 정보 보기)**를 선택한 다음 실행 그래프를 검토합니다.

**워크플로우 실행을 중지하려면(AWS CLI)**
+ 다음 명령을 입력합니다. *<workflow-name>*을 워크플로우의 이름으로 바꾸고 *<run-id>*를 중지할 워크플로우 실행의 실행 ID로 바꿉니다.

  ```
  aws glue stop-workflow-run --name <workflow-name> --run-id <run-id>
  ```

  다음은 **stop-workflow-run** 명령의 예입니다.

  ```
  aws glue stop-workflow-run --name my-workflow --run-id wr_137b88917411d128081069901e4a80595d97f719282094b7f271d09576770354
  ```

# 워크플로 실행 복구 및 재개
<a name="resuming-workflow"></a>

 워크플로에서 하나 이상의 노드(작업 또는 크롤러)가 성공적으로 완료되지 않으면 워크플로가 부분적으로만 실행된 것입니다. 근본 원인을 찾아 수정한 후 워크플로 실행을 재개할 노드를 하나 이상 선택한 다음 워크플로 실행을 재개할 수 있습니다. 그런 다음 선택한 노드와 해당 노드에서 다운스트림인 모든 노드가 실행됩니다.

**Topics**
+ [워크플로 실행 재개: 작동 방식](#resume-workflow-howitworks)
+ [워크플로 실행 재개](#how-to-resume-workflow)
+ [워크플로 실행 재개에 대한 참고 사항 및 제한 사항](#resume-workflow-notes)

## 워크플로 실행 재개: 작동 방식
<a name="resume-workflow-howitworks"></a>

다음 다이어그램에서 워크플로 W1을 고려합니다.

![\[트리거는 사각형으로 표시되고 작업은 원으로 표시됩니다. 왼쪽의 트리거 T1은 작업 J1을 실행하여 워크플로를 시작합니다. 후속 트리거 및 작업이 있지만 작업 J2 및 J3이 실패하므로 다운스트림 트리거 및 작업이 실행되지 않은 것으로 표시됩니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/workflow_W1.png)


워크플로 실행은 다음과 같이 진행됩니다.

1. 트리거 T1이 작업 J1을 시작합니다.

1. J1 발생이 성공적으로 완료되면 각각 J2 및 J3 작업을 실행하는 T2 및 T3이 트리거됩니다.

1. 작업 J2 및 J3이 실패합니다.

1. 트리거 T4 및 T5는 J2 및 J3의 성공적인 완료에 따라 달라지므로 발생하지 않고 작업 J4 및 J5가 실행되지 않습니다. 워크플로 W1이 부분적으로만 실행됩니다.

이제 J2 및 J3을 실패하게 만든 문제가 수정되었다고 가정합니다. J2 및 J3이 워크플로 실행을 재개할 시작점으로 선택됩니다.

![\[작업 J2 및 J3이 재개할 노드로 플래그가 지정됩니다. 다운스트림 트리거 및 작업이 성공적으로 실행된 것으로 표시됩니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/workflow_W1_resumed.png)


워크플로 실행은 다음과 같이 재개됩니다.

1. 작업 J2 및 J3이 성공적으로 실행됩니다.

1. T4 및 T5 발생을 트리거합니다.

1. 작업 J4 및 J5가 성공적으로 실행됩니다.

재개된 워크플로 실행은 새 실행 ID를 가진 별도의 워크플로 실행으로 추적됩니다. 워크플로 기록을 볼 때 모든 워크플로 실행에 대한 이전 실행 ID를 볼 수 있습니다. 다음 스크린샷의 예에서 실행 ID `wr_c7a22...`(두 번째 행)로 실행된 워크플로에 완료되지 않은 노드가 있습니다. 사용자가 문제를 수정하고 워크플로 실행을 재개하여 실행 ID `wr_a07e55...`(첫 번째 행)가 생성되었습니다.

![\[워크플로의 [기록(History)] 탭 아래에 있는 테이블에는 각 워크플로 실행에 대해 하나씩 2개의 행이 있습니다. 첫 번째 행에는 실행 ID와 이전 실행 ID가 모두 있습니다. 두 번째 행에는 실행 ID만 있습니다. 첫 번째 행의 이전 실행 ID는 두 번째 행의 실행 ID와 동일합니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/previous-run-id.png)


**참고**  
이 논의의 나머지 부분에서 "재개된 워크플로 실행"이라는 용어는 이전 워크플로 실행이 재개될 때 생성된 워크플로 실행을 나타냅니다. "원래 워크플로 실행"은 부분적으로만 실행되어 재개해야 했던 워크플로 실행을 나타냅니다.

**재개된 워크플로 실행 그래프**  
재개된 워크플로 실행에서는 노드의 하위 집합만 실행되지만 실행 그래프는 전체 그래프입니다. 즉, 재개된 워크플로에서 실행되지 않은 노드는 원래 워크플로 실행의 실행 그래프에서 복사됩니다. 원래 워크플로 실행에서 실행된 복사된 작업 및 크롤러 노드에는 실행 세부 정보가 포함됩니다.

이전 다이어그램의 워크플로 W1을 다시 고려하세요. 워크플로 실행이 J2 및 J3부터 재개되면 재개된 워크플로 실행에 대한 실행 그래프에 모든 작업(J1\$1J5)과 모든 트리거(T1\$1T5)가 표시됩니다. J1에 대한 실행 세부 정보는 원래 워크플로 실행에서 복사됩니다.

**워크플로 실행 스냅샷**  
워크플로 실행이 시작되면 AWS Glue는 해당 시점의 워크플로 설계 그래프의 스냅샷을 만듭니다. 해당 스냅샷은 워크플로 실행 기간 동안 사용됩니다. 실행이 시작된 후 트리거를 변경하는 경우 해당 변경 사항이 현재 워크플로 실행에 영향을 주지 않습니다. 스냅샷은 워크플로 실행이 일관된 방식으로 진행되도록 합니다.

스냅샷은 트리거만 변경 불가능하게 만듭니다. 워크플로 실행 중 다운스트림 작업 및 크롤러에 대한 변경 사항은 현재 실행에 적용됩니다.

## 워크플로 실행 재개
<a name="how-to-resume-workflow"></a>

워크플로 실행을 재개하려면 다음 단계를 따릅니다. AWS Glue 콘솔, API 또는 AWS Command Line Interface(AWS CLI)를 사용하여 워크플로 실행을 재개할 수 있습니다.

**워크플로 실행을 재개하려면(콘솔)**

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

   워크플로를 보고 워크플로 실행을 재개할 수 있는 권한이 있는 사용자로 로그인합니다.
**참고**  
워크플로 실행을 재개하려면 `glue:ResumeWorkflowRun` AWS Identity and Access Management(IAM) 권한이 필요합니다.

1. 탐색 창에서 [**워크플로(Workflows)**]를 선택합니다.

1. 워크플로를 선택한 다음 [**기록(History)**] 탭을 선택합니다.

1. 부분적으로만 실행된 워크플로 실행을 선택한 다음 [**실행 세부 정보 보기(View run details)**]를 선택합니다.

1. 실행 그래프에서 다시 시작하고 워크플로 실행을 재개할 첫 번째(또는 유일한) 노드를 선택합니다.

1. 그래프 오른쪽에 있는 세부 정보 창에서 [**재개(Resume)**] 확인란을 선택합니다.  
![\[실행 그래프는 실패한 작업 노드를 포함하여 3개의 노드를 보여줍니다. 오른쪽의 작업 세부 정보 창에는 [재개(Resume)] 확인란이 있습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/workflow-pre-select-resume.png)

   노드의 색상이 변경되고 오른쪽 상단에 작은 이력서 아이콘이 표시됩니다.  
![\[실행 그래프의 변경 사항은 텍스트에 설명되어 있습니다. [재개(Resume)] 확인란이 선택됩니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/workflow-post-select-resume.png)

1. 추가 노드를 다시 시작하려면 이전 두 단계를 완료합니다.

1. [**실행 재개(Resume run)**]를 선택합니다.

**워크플로 실행을 재개하려면(AWS CLI)**

1. `glue:ResumeWorkflowRun` IAM 권한이 있는지 확인합니다.

1. 다시 시작하려는 노드의 노드 ID를 검색합니다.

   1.  원래 워크플로 실행에 대해 `get-workflow-run` 명령을 실행합니다. 다음 예와 같이 워크플로 이름과 실행 ID를 제공하고 `--include-graph` 옵션을 추가합니다. 콘솔의 [**기록(History)**] 탭에서 또는 `get-workflow` 명령을 실행하여 실행 ID를 가져옵니다.

      ```
      aws glue get-workflow-run --name cloudtrailtest1 --run-id wr_a07e55f2087afdd415a404403f644a4265278f68b13ba3da08c71924ebe3c3a8 --include-graph
      ```

      이 명령은 그래프의 노드와 가장자리를 큰 JSON 객체로 반환합니다.

   1. 노드 객체의 `Type` 및 `Name` 속성으로 관심 노드를 찾습니다.

      다음은 출력의 예제 노드 객체입니다.

      ```
      {
          "Type": "JOB",
          "Name": "test1_post_failure_4592978",
          "UniqueId": "wnode_d1b2563c503078b153142ee76ce545fe5ceef66e053628a786ddd74a05da86fd",
          "JobDetails": {
              "JobRuns": [
                  {
                      "Id": "jr_690b9f7fc5cb399204bc542c6c956f39934496a5d665a42de891e5b01f59e613",
                      "Attempt": 0,
                      "TriggerName": "test1_aggregate_failure_649b2432",
                      "JobName": "test1_post_failure_4592978",
                      "StartedOn": 1595358275.375,
                      "LastModifiedOn": 1595358298.785,
                      "CompletedOn": 1595358298.785,
                      "JobRunState": "FAILED",
                      "PredecessorRuns": [],
                      "AllocatedCapacity": 0,
                      "ExecutionTime": 16,
                      "Timeout": 2880,
                      "MaxCapacity": 0.0625,
                      "LogGroupName": "/aws-glue/python-jobs"
                  }
              ]
          }
      }
      ```

   1. 노드 객체의 `UniqueId` 속성에서 노드 ID를 가져옵니다.

1. `resume-workflow-run` 명령을 실행합니다. 다음 예와 같이 워크플로 이름, 실행 ID 및 노드 ID 목록을 공백으로 구분하여 제공합니다.

   ```
   aws glue resume-workflow-run --name cloudtrailtest1 --run-id wr_a07e55f2087afdd415a404403f644a4265278f68b13ba3da08c71924ebe3c3a8 --node-ids wnode_ca1f63e918fb855e063aed2f42ec5762ccf71b80082ae2eb5daeb8052442f2f3  wnode_d1b2563c503078b153142ee76ce545fe5ceef66e053628a786ddd74a05da86fd
   ```

   이 명령은 재개된(새) 워크플로 실행의 실행 ID와 시작될 노드 목록을 출력합니다.

   ```
   {
       "RunId": "wr_2ada0d3209a262fc1156e4291134b3bd643491bcfb0ceead30bd3e4efac24de9",
       "NodeIds": [
           "wnode_ca1f63e918fb855e063aed2f42ec5762ccf71b80082ae2eb5daeb8052442f2f3"
       ]
   }
   ```

   예제 `resume-workflow-run` 명령은 다시 시작할 2개의 노드를 나열했지만 예제 출력은 1개의 노드만 다시 시작됨을 나타냅니다. 이는 한 노드가 다른 노드의 다운스트림이었고, 다운스트림 노드는 워크플로의 정상적인 흐름에 따라 다시 시작되기 때문입니다.

## 워크플로 실행 재개에 대한 참고 사항 및 제한 사항
<a name="resume-workflow-notes"></a>

워크플로 실행을 재개할 때 다음 참고 사항과 제한 사항을 염두에 둡니다.
+ `COMPLETED` 상태인 경우에만 워크플로 실행을 재개할 수 있습니다.
**참고**  
워크플로 실행에서 하나 이상의 노드가 완료되지 않은 경우에도 워크플로 실행 상태는 `COMPLETED`로 표시됩니다. 성공적으로 완료되지 않은 노드를 검색하려면 실행 그래프를 확인합니다.
+ 원래 워크플로 실행이 실행을 시도한 모든 작업 또는 크롤러 노드에서 워크플로 실행을 재개할 수 있습니다. 트리거 노드에서 실행되는 워크플로를 재개할 수 없습니다.
+ 노드를 다시 시작해도 상태가 재설정되지 않습니다. 부분적으로 처리된 데이터는 롤백되지 않습니다.
+ 실패한 워크플로 실행을 여러 번 재개할 수 있습니다. 그러나 재개된 실행은 한 번만 더 재개할 수 있습니다. 추가로 재시도하려면 원래 실패한 실행을 대신 재개합니다.
+ 다시 시작할 노드를 2개 선택하는 경우 이들이 서로 종속되어 있으면 업스트림 노드가 다운스트림 노드보다 먼저 실행됩니다. 실제로 다운스트림 노드를 선택하는 것은 일반적인 워크플로 흐름에 따라 실행되기 때문에 중복됩니다.

# AWS Glue에서 워크플로 실행 속성 가져오기 및 설정
<a name="workflow-run-properties-code"></a>

워크플로 실행 속성을 사용하여 AWS Glue 워크플로우의 작업 간에 상태를 공유 및 관리합니다. 워크플로를 생성할 때 기본 실행 속성을 설정할 수 있습니다. 그런 다음, 작업이 실행될 때 실행 속성 값을 검색하고 나중에 워크플로에 있는 작업에 대한 입력을 위해 필요에 따라 수정할 수 있습니다. 작업이 실행 속성을 수정할 때 새 값은 워크플로 실행에만 존재합니다. 기본 실행 속성은 영향을 받지 않습니다.

AWSGlue 작업이 워크플로의 일부가 아닌 경우 이러한 속성은 설정되지 않습니다.

ETL(추출, 변환 및 로드) 작업의 다음 샘플 Python 코드는 워크플로우 실행 속성을 가져오는 방법을 보여 줍니다.

```
import sys
import boto3
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from awsglue.context import GlueContext
from pyspark.context import SparkContext

glue_client = boto3.client("glue")
args = getResolvedOptions(sys.argv, ['JOB_NAME','WORKFLOW_NAME', 'WORKFLOW_RUN_ID'])
workflow_name = args['WORKFLOW_NAME']
workflow_run_id = args['WORKFLOW_RUN_ID']
workflow_params = glue_client.get_workflow_run_properties(Name=workflow_name,
                                        RunId=workflow_run_id)["RunProperties"]

target_database = workflow_params['target_database']
target_s3_location = workflow_params['target_s3_location']
```

다음 코드는 `target_format` 실행 속성을 `'csv'`로 설정하여 계속합니다.

```
workflow_params['target_format'] = 'csv'
glue_client.put_workflow_run_properties(Name=workflow_name, RunId=workflow_run_id, RunProperties=workflow_params)
```

자세한 내용은 다음을 참조하세요.
+ [GetWorkflowRunProperties 작업(Python: get\$1workflow\$1run\$1properties)](aws-glue-api-workflow.md#aws-glue-api-workflow-GetWorkflowRunProperties)
+ [PutWorkflowRunProperties 작업(Python: put\$1workflow\$1run\$1properties)](aws-glue-api-workflow.md#aws-glue-api-workflow-PutWorkflowRunProperties)

# AWS Glue API를 사용하여 워크플로 쿼리
<a name="workflows_api_concepts"></a>

AWS Glue는 워크플로우를 관리하기 위한 다양한 API를 제공합니다. AWS Glue API를 사용하여 워크플로우의 정적 보기 또는 실행 중인 워크플로우의 동적 보기를 검색할 수 있습니다. 자세한 내용은 [워크플로](aws-glue-api-workflow.md) 섹션을 참조하세요.

**Topics**
+ [정적 보기 쿼리](#workflows_api_concepts_static)
+ [동적 보기 쿼리](#workflows_api_concepts_dynamic)

## 정적 보기 쿼리
<a name="workflows_api_concepts_static"></a>

`GetWorkflow` API 작업을 사용하여 워크플로우의 설계를 나타내는 정적 보기를 가져옵니다. 이 작업은 노드와 엣지로 구성된 방향성 그래프를 반환합니다. 여기에서 노드는 트리거, 작업 또는 크롤러를 나타냅니다. 엣지는 노드 간의 관계를 정의합니다. 엣지는 AWS Glue 콘솔의 그래프에서 커넥터(화살표)로 표현됩니다.

NetworkX, igraph, JGraphT, Java Universal Network/Graph(JUNG) Framework 등의 인기 있는 그래프 처리 라이브러리에서 이 작업을 사용할 수도 있습니다. 이러한 모든 라이브러리는 그래프를 비슷하게 나타내기 때문에 최소한의 변환이 필요합니다.

이 API가 반환하는 정적 보기는 워크플로우와 연결된 트리거의 최신 정의에 따라 최신 보기입니다.

### 그래프 정의
<a name="workflows_api_concepts_static_graph"></a>

워크플로우 그래프 G는 정렬된 페어(N, E)입니다. 여기서 N은 노드 세트이고 E는 엣지 세트입니다. *노드*는 고유한 숫자로 식별되는 그래프의 꼭짓점입니다. 노드는 트리거, 작업 또는 크롤러 유형일 수 있습니다. 예를 들면 `{name:T1, type:Trigger, uniqueId:1}, {name:J1, type:Job, uniqueId:2}`입니다.

*엣지*는 2튜플의 형식(`src, dest`)입니다. 여기에서 `src`와 `dest`는 노드이고 `src`에서 `dest`로의 방향성 엣지가 있습니다.

### 정적 보기 쿼리의 예
<a name="workflows_api_concepts_static_example"></a>

작업 J1을 완료하면 작업 J2를 트리거하는 조건부 트리거 T를 생각해 보십시오.

```
J1 ---> T ---> J2
```

노드: J1, T, J2 

엣지: (J1, T), (T, J2)

## 동적 보기 쿼리
<a name="workflows_api_concepts_dynamic"></a>

`GetWorkflowRun` API 작업을 사용하여 실행 중인 워크플로우의 동적 보기를 가져옵니다. 이 작업은 워크플로우 실행과 관련된 메타데이터와 함께 그래프의 동일한 정적 보기를 반환합니다.

실행의 경우 `GetWorkflowRun` 호출의 작업을 나타내는 노드에는 최신 워크플로우 실행의 일부로 시작되는 작업 실행 목록이 있습니다. 이 목록을 사용하여 그래프 자체에 각 작업의 실행 상태를 표시할 수 있습니다. 아직 실행되지 않은 다운스트림 종속성의 경우 이 필드는 `null`로 설정됩니다. 그래프로 표시된 정보를 통해 언제든 워크플로우의 현재 상태를 알 수 있습니다.

이 API가 반환하는 동적 보기는 워크플로 실행이 시작될 때 있었던 정적 보기를 기반으로 합니다.

*런타임 노드 예:* `{name:T1, type: Trigger, uniqueId:1}`, `{name:J1, type:Job, uniqueId:2, jobDetails:{jobRuns}}`, `{name:C1, type:Crawler, uniqueId:3, crawlerDetails:{crawls}}` 

### 예 1: 동적 보기
<a name="workflows_api_concepts_dynamic_examples"></a>

다음 예에서는 간단한 2 트리거 워크플로우를 보여 줍니다.
+ 노드: t1, j1, t2, j2 
+ 엣지: (t1, j1), (j1, t2), (t2, j2)

`GetWorkflow` 응답에는 다음이 포함됩니다.

```
{
    Nodes : [
        {
            "type" : Trigger,
            "name" : "t1",
            "uniqueId" : 1
        },
        {
            "type" : Job,
            "name" : "j1",
            "uniqueId" : 2
        },
        {
            "type" : Trigger,
            "name" : "t2",
            "uniqueId" : 3
        },
        {
            "type" : Job,
            "name" : "j2",
            "uniqueId" : 4
        }
    ],
    Edges : [
        {
            "sourceId" : 1,
            "destinationId" : 2
        },
        {
            "sourceId" : 2,
            "destinationId" : 3
        },
        {
            "sourceId" : 3,
            "destinationId" : 4
        }
}
```

`GetWorkflowRun` 응답에는 다음이 포함됩니다.

```
{
    Nodes : [
        {
            "type" : Trigger,
            "name" : "t1",
            "uniqueId" : 1,
            "jobDetails" : null,
            "crawlerDetails" : null
        },
        {
            "type" : Job,
            "name" : "j1",
            "uniqueId" : 2,
            "jobDetails" : [
                {
                    "id" : "jr_12334",
                    "jobRunState" : "SUCCEEDED",
                    "errorMessage" : "error string"
                }
            ],
            "crawlerDetails" : null
        },
        {
            "type" : Trigger,
            "name" : "t2",
            "uniqueId" : 3,
            "jobDetails" : null,
            "crawlerDetails" : null
        },
        {
            "type" : Job,
            "name" : "j2",
            "uniqueId" : 4,
            "jobDetails" : [
                {
                    "id" : "jr_1233sdf4",
                    "jobRunState" : "SUCCEEDED",
                    "errorMessage" : "error string"
                }
            ],
            "crawlerDetails" : null
        }
    ],
    Edges : [
        {
            "sourceId" : 1,
            "destinationId" : 2
        },
        {
            "sourceId" : 2,
            "destinationId" : 3
        },
        {
            "sourceId" : 3,
            "destinationId" : 4
        }
}
```

### 예 2: 조건부 트리거가 있는 여러 작업
<a name="workflows_api_concepts_dynamic_example_2"></a>

다음 예에서는 작업 여러 개와 조건부 트리거(t3) 하나가 있는 워크플로우를 보여 줍니다.

```
Consider Flow:
T(t1) ---> J(j1) ---> T(t2) ---> J(j2)
             |                    |
             |                    |
             >+------> T(t3) <-----+
                        |
                        |
                      J(j3)

Graph generated:
Nodes: t1, t2, t3, j1, j2, j3
Edges: (t1, j1), (j1, t2), (t2, j2), (j1, t3), (j2, t3), (t3, j3)
```

# AWS Glue의 블루프린트 및 워크플로 제한 사항
<a name="blueprint_workflow_restrictions"></a>

다음은 블루프린트와 워크플로에 대한 제한 사항입니다.

## 블루프린트 제한 사항
<a name="bluprint-restrictions"></a>

다음 블루프린트 제한에 유의하세요.
+ 블루프린트는 Amazon S3 버킷이 있는 동일한 AWS 리전에 등록되어야 합니다.
+ AWS 계정 간에 블루프린트를 공유하려면 Amazon S3의 블루프린트 ZIP 아카이브에 대한 읽기 권한을 부여해야 합니다. 블루프린트 ZIP 아카이브에 대한 읽기 권한이 있는 고객은 AWS 계정에 블루프린트를 등록하여 사용할 수 있습니다.
+ 블루프린트 파라미터 집합은 단일 JSON 객체로 저장됩니다. 이 객체의 최대 길이는 128KB입니다.
+ 블루프린트 ZIP 아카이브의 압축되지 않은 최대 크기는 5MB입니다. 압축된 최대 크기는 1MB입니다.
+ 워크플로 내 작업, 크롤러, 트리거의 총수를 100개 이하로 제한합니다. 100개가 넘게 포함될 경우 워크플로 실행을 재개하거나 중지하려고 할 때 오류가 발생할 수 있습니다.

## 워크플로 제한 사항
<a name="workflow-restrictions"></a>

다음 워크플로 제한 사항에 유의하세요. 이러한 설명 중 일부는 수동으로 워크플로를 생성하는 사용자에 대한 것입니다.
+ Amazon EventBridge 이벤트 트리거에 대한 최대 배치 크기는 100입니다. 최대 기간 크기는 900초(15분)입니다.
+ 하나의 트리거는 하나의 워크플로우에만 연결할 수 있습니다.
+ 시작 트리거(온디맨드 또는 일정)는 하나만 허용됩니다.
+ 워크플로의 작업 또는 크롤러가 워크플로 외부의 트리거에 의해 시작된 경우, 작업 또는 크롤러 완료(성공 또는 기타)에 종속된 워크플로 내의 트리거는 실행되지 않습니다.
+ 마찬가지로 워크플로의 작업 또는 크롤러에 워크플로 내부와 워크플로 외부에서 작업 또는 크롤러 완료(성공 또는 기타)에 종속된 트리거가 있는 경우에는 작업 또는 크롤러가 워크플로 내에서 시작되면 작업 또는 크롤러 완료 시 워크플로 내부의 트리거만 실행됩니다.

# AWS Glue의 블루프린트 오류 해결
<a name="blueprint_workflow_troubleshoot"></a>

AWS Glue 블루프린트를 사용할 때 오류가 발생하면 다음 해결 방법에 따라 문제의 원인을 찾아 해결할 수 있습니다.

**Topics**
+ [오류: PySpark 모듈 누락](#blueprint-workflow-error-1)
+ [오류: 블루프린트 Config 파일 누락](#blueprint-workflow-error-2)
+ [오류: 가져온 파일 누락](#blueprint-workflow-error-3)
+ [오류: 리소스에서 iamPassRole을 수행할 권한이 없음](#blueprint-workflow-error-4)
+ [오류: 잘못된 cron 일정](#blueprint-workflow-error-5)
+ [오류: 같은 이름의 트리거가 이미 있음](#blueprint-workflow-error-6)
+ [오류: 이름이 foo인 워크플로가 이미 있습니다.](#blueprint-workflow-error-7)
+ [오류: 지정된 layoutGenerator 경로에서 모듈을 찾을 수 없음](#blueprint-workflow-error-8)
+ [오류: 연결 필드에 검증 오류](#blueprint-workflow-error-9)

## 오류: PySpark 모듈 누락
<a name="blueprint-workflow-error-1"></a>

AWS Glue에서 ["레이아웃 생성기 함수 ModuleNotFoundError를 실행하는 동안 알 수 없는 오류 발생: 'pyspark'라는 모듈 없음(Unknown error executing layout generator function ModuleNotFoundError: No module named 'pyspark')"]이라는 오류를 반환합니다.

블루프린트 아카이브의 압축을 풀면 다음 중 하나와 같을 수 있습니다.

```
$ unzip compaction.zip 
Archive:  compaction.zip
   creating: compaction/
  inflating: compaction/blueprint.cfg  
  inflating: compaction/layout.py    
  inflating: compaction/README.md    
  inflating: compaction/compaction.py   
  
$ unzip compaction.zip
Archive:  compaction.zip
  inflating: blueprint.cfg           
  inflating: compaction.py           
  inflating: layout.py               
  inflating: README.md
```

첫 번째 사례에서는 블루프린트와 관련된 모든 파일이 compaction이라는 폴더 아래에 배치된 다음 *compaction.zip*이라는 zip 파일로 변환되었습니다.

두 번째 사례에서는 블루프린트에 필요한 모든 파일이 폴더에 포함되지 않고 zip 파일인 *compaction.zip* 아래에 루트 파일로 추가되었습니다.

위 포맷 중 하나로 파일을 생성할 수 있습니다. 그러나 `blueprint.cfg`에 레이아웃을 생성하는 스크립트의 함수 이름에 대한 올바른 경로가 있는지 확인합니다.

**예제**  
사례 1: 다음과 같이 `blueprint.cfg`에 `layoutGenerator`가 있어야 합니다.

```
layoutGenerator": "compaction.layout.generate_layout"
```

사례 2: 다음과 같이 `blueprint.cfg`에 `layoutGenerator`가 있어야 합니다.

```
layoutGenerator": "layout.generate_layout" 
```

이 경로가 올바르게 포함되지 않은 경우 표시된 대로 오류가 발생할 수 있습니다. 예를 들어 사례 2와 같은 폴더 구조를 가지고 있고 사례 1과 같이 `layoutGenerator`가 표시되어 있다면 위의 오류가 발생할 수 있습니다.

## 오류: 블루프린트 Config 파일 누락
<a name="blueprint-workflow-error-2"></a>

AWS Glue에서 ["레이아웃 생성기 함수 FileNotFoundError를 실행하는 동안 알 수 없는 오류 발생: [Errno 2] 해당 파일 또는 디렉터리 없음: '/tmp/compaction/blueprint.cfg'(Unknown error executing layout generator function FileNotFoundError: [Errno 2] No such file or directory: '/tmp/compaction/blueprint.cfg')"]라는 오류를 반환합니다.

blueprint.cfg는 ZIP 아카이브의 루트 수준이나 ZIP 아카이브와 같은 이름의 폴더 내에 있어야 합니다.

블루프린트 ZIP 아카이브를 추출할 때 blueprint.cfg가 다음 경로 중 하나에 있어야 합니다. 다음 경로 중 하나에서 없으면 위의 오류가 발생할 수 있습니다.

```
$ unzip compaction.zip 
Archive:  compaction.zip
   creating: compaction/
  inflating: compaction/blueprint.cfg  
  
$ unzip compaction.zip
Archive:  compaction.zip
  inflating: blueprint.cfg
```

## 오류: 가져온 파일 누락
<a name="blueprint-workflow-error-3"></a>

AWS Glue에서 ["레이아웃 생성기 함수 FileNotFoundError를 실행하는 동안 알 수 없는 오류 발생: [Errno 2] 해당 파일 또는 디렉터리 없음: \$1 \$1'demo-project/foo.py'(Unknown error executing layout generator function FileNotFoundError: [Errno 2] No such file or directory: \$1 \$1'demo-project/foo.py')"]이라는 오류를 반환합니다.

레이아웃 생성 스크립트에 다른 파일을 읽을 수 있는 기능이 있는 경우 가져올 파일의 전체 경로를 지정해야 합니다. 예를 들어 Conversion.py 스크립트는 Layout.py에서 참조될 수 있습니다. 자세한 정보는 [샘플 블루프린트 프로젝트](https://docs.aws.amazon.com/glue/latest/dg/developing-blueprints-sample.html)를 참조하세요.

## 오류: 리소스에서 iamPassRole을 수행할 권한이 없음
<a name="blueprint-workflow-error-4"></a>

AWS Glue에서 ["사용자: arn:aws:sts::123456789012:assumed-role/AWSGlueServiceRole/GlueSession에게 리소스 arn:aws:iam::123456789012:role/AWSGlueServiceRole에서 iam:PassRole을 수행할 권한이 부여되지 않음(User: arn:aws:sts::123456789012:assumed-role/AWSGlueServiceRole/GlueSession is not authorized to perform: iam:PassRole on resource: arn:aws:iam::123456789012:role/AWSGlueServiceRole)"]이라는 오류를 반환합니다.

워크플로의 작업 및 크롤러가 블루프린트에서 워크플로를 생성하기 위해 전달된 역할과 동일한 역할을 수임하는 경우 블루프린트 역할 자체에 `iam:PassRole` 권한이 포함되어야 합니다.

워크플로의 작업 및 크롤러가 블루프린트에서 워크플로 엔터티를 생성하기 위해 전달된 역할과 다른 역할을 수임하는 경우 블루프린트 역할에 블루프린트 역할 대신 수임한 다른 역할에 대한 `iam:PassRole` 권한이 포함되어야 합니다.

자세한 정보는 [블루프린트 역할에 대한 권한](https://docs.aws.amazon.com/glue/latest/dg/blueprints-personas-permissions.html#blueprints-role-permissions)을 참조하세요.

## 오류: 잘못된 cron 일정
<a name="blueprint-workflow-error-5"></a>

AWS Glue에서 ["일정 cron(0 0 \$1 \$1 \$1 \$1)이 잘못되었습니다.(The schedule cron(0 0 \$1 \$1 \$1 \$1) is invalid.)"]라는 오류를 반환합니다.

올바른 [cron](https://en.wikipedia.org/wiki/Cron) 표현식을 제공합니다. 자세한 내용은 [크롤러와 작업을 위한 시간 기반 일정](https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html)을 참조하십시오.

## 오류: 같은 이름의 트리거가 이미 있음
<a name="blueprint-workflow-error-6"></a>

AWS Glue에서 ["오류: 같은 이름의 트리거가 이미 있음(Error: a trigger with the same name already exists)"]이라는 오류를 반환합니다.

블루프린트에서는 워크플로 생성을 위해 레이아웃 스크립트에서 트리거를 정의할 필요가 없습니다. 트리거 생성은 두 작업 간에 정의된 종속성을 기반으로 블루프린트 라이브러리에서 관리합니다.

트리거의 이름은 다음과 같습니다.
+ 워크플로의 시작 트리거의 경우 이름은 <workflow\$1name>\$1starting\$1trigger입니다.
+ 하나 또는 여러 업스트림 노드의 완료에 종속되는 워크플로의 노드(작업/크롤러)의 경우. AWS Glue는 이름이 <workflow\$1name>\$1<node\$1name>\$1trigger인 트리거를 정의합니다.

이 오류는 동일한 이름의 트리거가 이미 존재함을 의미합니다. 기존 트리거를 삭제하고 워크플로 생성을 다시 실행할 수 있습니다.

**참고**  
워크플로를 삭제해도 워크플로 내의 노드는 삭제되지 않습니다. 워크플로가 삭제되더라도 트리거가 남아 있을 수 있습니다. 이로 인해 '워크플로가 이미 존재함' 오류가 발생하지 않을 수 있지만 워크플로를 생성하고 삭제한 다음 동일한 블루프린트에서 동일한 이름으로 다시 생성하려고 하는 경우 '트리거가 이미 존재함' 오류가 발생할 수 있습니다.

## 오류: 이름이 foo인 워크플로가 이미 있습니다.
<a name="blueprint-workflow-error-7"></a>

워크플로 이름은 고유해야 합니다. 다른 이름으로 시도합니다.

## 오류: 지정된 layoutGenerator 경로에서 모듈을 찾을 수 없음
<a name="blueprint-workflow-error-8"></a>

AWS Glue에서 "레이아웃 생성기 함수 ModuleNotFoundError를 실행하는 동안 알 수 없는 오류 발생: 'crawl\$1s3\$1locations'라는 모듈 없음(Unknown error executing layout generator function ModuleNotFoundError: No module named 'crawl\$1s3\$1locations')"이라는 오류를 반환합니다.

```
layoutGenerator": "crawl_s3_locations.layout.generate_layout"
```

예를 들어 위의 layoutGenerator 경로가 있는 경우 블루프린트 아카이브의 압축을 풀면 다음과 같아야 합니다.

```
$ unzip crawl_s3_locations.zip 
Archive:  crawl_s3_locations.zip
   creating: crawl_s3_locations/
  inflating: crawl_s3_locations/blueprint.cfg  
  inflating: crawl_s3_locations/layout.py    
  inflating: crawl_s3_locations/README.md
```

아카이브의 압축을 풀 때 블루프린트 아카이브가 다음과 같으면 위와 같은 오류가 발생할 수 있습니다.

```
$ unzip crawl_s3_locations.zip
Archive:  crawl_s3_locations.zip
  inflating: blueprint.cfg           
  inflating: layout.py               
  inflating: README.md
```

`crawl_s3_locations`라는 폴더가 없는 것을 볼 수 있으며 `layoutGenerator` 경로가 모듈 `crawl_s3_locations`를 통해 레이아웃 파일을 참조할 때 위의 오류가 발생할 수 있습니다.

## 오류: 연결 필드에 검증 오류
<a name="blueprint-workflow-error-9"></a>

AWS Glue에서 "레이아웃 생성기 함수 TypeError를 실행하는 동안 알 수 없는 오류 발생: 키 연결에 대한 값 ['foo']는 <class 'dict'> 유형이어야 함\$1(Unknown error executing layout generator function TypeError: Value ['foo'] for key Connections should be of type <class 'dict'>\$1)"라는 오류가 발생했습니다.

검증 오류입니다. `Job` 클래스의 `Connections` 필드에 딕셔너리가 필요하고 대신 값 목록이 제공되어 오류가 발생합니다.

```
User input was list of values
Connections= ['string']

Should be a dict like the following
Connections*=*{'Connections': ['string']}
```

블루프린트에서 워크플로를 생성하는 동안 이러한 런타임 오류를 방지하려면 [블루프린트 테스트](https://docs.aws.amazon.com/glue/latest/dg/developing-blueprints-testing.html)에 설명된 대로 워크플로, 작업 및 크롤러 정의를 검증할 수 있습니다.

레이아웃 스크립트에서 AWS Glue 작업, 크롤러 및 워크플로를 정의하려면 [AWS Glue 블루프린트 클래스 참조](https://docs.aws.amazon.com/glue/latest/dg/developing-blueprints-code-classes.html)의 구문을 참조하세요.

# AWS Glue 블루프린트에 대한 페르소나 및 역할의 권한
<a name="blueprints-personas-permissions"></a>

다음은 일반적인 페르소나 및 AWS Glue 블루프린트에 대한 페르소나와 역할에 대해 제안된 AWS Identity and Access Management(IAM) 권한 정책입니다.

**Topics**
+ [블루프린트 페르소나](#blueprints-personas)
+ [블루프린트 페르소나에 대한 권한](#blueprints-permssions)
+ [블루프린트 역할에 대한 권한](#blueprints-role-permissions)

## 블루프린트 페르소나
<a name="blueprints-personas"></a>

다음은 일반적으로 AWS Glue 블루프린트의 수명 주기와 관련된 페르소나입니다.


| 페르소나 | 설명 | 
| --- | --- | 
| AWS Glue 개발자 | 블루프린트를 개발, 테스트 및 게시합니다. | 
| AWS Glue 관리자 | 블루프린트에 대한 권한을 등록, 유지 관리 및 부여합니다. | 
| 데이터 분석가 | 블루프린트를 실행하여 워크플로를 생성합니다. | 

자세한 내용은 [AWS Glue의 블루프린트 개요](blueprints-overview.md) 섹션을 참조하세요.

## 블루프린트 페르소나에 대한 권한
<a name="blueprints-permssions"></a>

다음은 각 블루프린트 페르소나에 대해 제안된 권한입니다.



### 블루프린트에 대한 AWS Glue 개발자 권한
<a name="bp-persona-dev"></a>

AWS Glue 개발자는 블루프린트를 게시하는 데 사용되는 Amazon S3 버킷에 대한 쓰기 권한이 있어야 합니다. 종종 개발자는 블루프린트를 업로드한 후 등록합니다. 이 경우 개발자는 [블루프린트에 대한 AWS Glue 관리자 권한](#bp-persona-admin)에 나열된 권한이 필요합니다. 또한 개발자가 블루프린트를 등록한 후 테스트하려면 [블루프린트에 대한 데이터 분석가 권한](#bp-persona-analyst)에 나열된 권한도 필요합니다.

### 블루프린트에 대한 AWS Glue 관리자 권한
<a name="bp-persona-admin"></a>

다음 정책은 AWS Glue 블루프린트를 등록하고, 보고, 유지 관리할 수 있는 권한을 부여합니다.

**중요**  
다음 정책에서 *<s3-bucket-name>*과 *<prefix>*를 등록할 업로드된 블루프린트 ZIP 아카이브의 Amazon S3 경로로 바꿉니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:CreateBlueprint",
        "glue:UpdateBlueprint",
        "glue:DeleteBlueprint",
        "glue:GetBlueprint",
        "glue:ListBlueprints",
        "glue:BatchGetBlueprints"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/prefix/*"
    }
  ]
}
```

------

### 블루프린트에 대한 데이터 분석가 권한
<a name="bp-persona-analyst"></a>

다음 정책은 블루프린트를 실행하고 결과 워크플로 및 워크플로 구성 요소를 볼 수 있는 권한을 부여합니다. 또한 AWS Glue가 워크플로와 워크플로 구성 요소를 생성하기 위해 맡는 역할에 `PassRole`을 부여합니다.

이 정책은 모든 리소스에 대한 권한을 부여합니다. 개별 블루프린트에 대한 세분화된 액세스를 구성하려면 블루프린트 ARN에 다음 포맷을 사용합니다.

```
arn:aws:glue:<region>:<account-id>:blueprint/<blueprint-name>
```

**중요**  
다음 정책에서 *<account-id>*를 유효한 AWS 계정으로 바꾸고 *<role-name>*을 블루프린트를 실행하는 데 사용되는 역할의 이름으로 바꿉니다. 이 역할에 필요한 권한은 [블루프린트 역할에 대한 권한](#blueprints-role-permissions) 섹션을 참조하세요.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListBlueprints",
        "glue:GetBlueprint",
        "glue:StartBlueprintRun",
        "glue:GetBlueprintRun",
        "glue:GetBlueprintRuns",
        "glue:GetCrawler",
        "glue:ListTriggers",
        "glue:ListJobs",
        "glue:BatchGetCrawlers",
        "glue:GetTrigger",
        "glue:BatchGetWorkflows",
        "glue:BatchGetTriggers",
        "glue:BatchGetJobs",
        "glue:BatchGetBlueprints",
        "glue:GetWorkflowRun",
        "glue:GetWorkflowRuns",
        "glue:ListCrawlers",
        "glue:ListWorkflows",
        "glue:GetJob",
        "glue:GetWorkflow",
        "glue:StartWorkflowRun"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::111122223333:role/role-name"
    }
  ]
}
```

------

## 블루프린트 역할에 대한 권한
<a name="blueprints-role-permissions"></a>

다음은 블루프린트에서 워크플로를 생성하는 데 사용되는 IAM 역할에 대해 제안된 권한입니다. 역할이 `glue.amazonaws.com`과 신뢰 관계를 맺고 있어야 합니다.

**중요**  
다음 정책에서 *<account-id>*를 유효한 AWS 계정으로 바꾸고 *<role-name>*을 역할의 이름으로 바꿉니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:CreateJob",
        "glue:GetCrawler",
        "glue:GetTrigger",
        "glue:DeleteCrawler",
        "glue:CreateTrigger",
        "glue:DeleteTrigger",
        "glue:DeleteJob",
        "glue:CreateWorkflow",
        "glue:DeleteWorkflow",
        "glue:GetJob",
        "glue:GetWorkflow",
        "glue:CreateCrawler"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::111122223333:role/role-name"
    }
  ]
}
```

------

**참고**  
워크플로의 작업 및 크롤러가 이 역할이 아닌 다른 역할을 수임하는 경우 이 정책에는 블루프린트 역할 대신 다른 역할에 대한 `iam:PassRole` 권한이 포함되어야 합니다.

# AWS Glue에서 블루프린트 개발
<a name="orchestrate-using-blueprints"></a>

조직에는 단일 워크플로를 파라미터화하여 모두 처리할 수 있는 이점을 얻을 수 있는 유사한 ETL 사용 사례 집합이 있을 수 있습니다. 이 요구를 해결하기 위해 AWS Glue에서 워크플로를 생성하는 데 사용할 수 있는 **블루프린트를 정의할 수 있습니다. 블루프린트는 파라미터를 허용하므로 단일 블루프린트에서 데이터 분석가가 유사한 ETL 사용 사례를 처리하기 위해 다양한 워크플로를 생성할 수 있습니다. 블루프린트를 생성한 후에는 다른 부서, 팀 및 프로젝트에 재사용할 수 있습니다.

**Topics**
+ [AWS Glue의 블루프린트 개요](blueprints-overview.md)
+ [AWS Glue에서 블루프린트 개발](developing-blueprints.md)
+ [AWS Glue의 블루프린트 등록](registering-blueprints.md)
+ [AWS Glue에서 블루프린트 보기](viewing_blueprints.md)
+ [AWS Glue에서 블루프린트 업데이트](updating_blueprints.md)
+ [AWS Glue의 블루프린트에서 워크플로 생성](creating_workflow_blueprint.md)
+ [AWS Glue에서 블루프린트 실행 보기](viewing_blueprint_runs.md)

# AWS Glue의 블루프린트 개요
<a name="blueprints-overview"></a>

**참고**  
청사진 기능은 현재 아시아 태평양(자카르타) 리전 및 중동(UAE) 리전에서 AWS Glue 콘솔을 통해 사용할 수 없습니다.

AWS Glue 블루프린트는 AWS Glue 워크플로를 생성하고 공유하는 방법을 제공합니다. 유사한 사용 사례에 사용할 수 있는 복잡한 ETL 프로세스가 있는 경우 각 사용 사례에 대한 AWS Glue 워크플로를 생성하는 대신 단일 블루프린트를 생성할 수 있습니다.

블루프린트는 워크플로에 포함할 작업 및 크롤러를 지정하고 워크플로 사용자가 블루프린트를 실행하여 워크플로를 생성할 때 제공하는 파라미터를 지정합니다. 파라미터를 사용하면 단일 블루프린트에서 유사한 다양한 사용 사례에 대한 워크플로를 생성할 수 있습니다. 워크플로에 대한 자세한 내용은 [AWS Glue의 워크플로 개요](workflows_overview.md) 섹션을 참조하세요.

다음은 블루프린트의 사용 사례 예입니다.
+ 기존 데이터 집합을 분할하려고 합니다. 블루프린트의 입력 파라미터는 Amazon Simple Storage Service(Amazon S3) 소스 및 대상 경로와 파티션 열 목록입니다.
+ Amazon DynamoDB 테이블의 스냅샷을 Amazon Redshift와 같은 SQL 데이터 스토어로 생성하려고 합니다. 블루프린트에 대한 입력 파라미터는 DynamoDB 테이블 이름과 Amazon Redshift 클러스터 및 대상 데이터베이스를 지정하는 AWS Glue 연결입니다.
+ 여러 Amazon S3 경로의 CSV 데이터를 Parquet로 변환하려고 합니다. AWS Glue 워크플로에 각 경로에 대해 별도의 크롤러와 작업을 포함하려고 합니다. 입력 파라미터는 AWS Glue Data Catalog의 대상 데이터베이스와 쉼표로 구분된 Amazon S3 경로 목록입니다. 이 경우 워크플로가 생성하는 크롤러 및 작업의 수는 가변적입니다.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/s3Bm8ay53Ms/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/s3Bm8ay53Ms)


**블루프린트 구성 요소**  
블루프린트는 다음과 같은 구성 요소를 포함하는 ZIP 아카이브 파일입니다.
+ Python 레이아웃 생성기 스크립트

  워크플로 *레이아웃*, 즉 워크플로에 대해 생성할 크롤러 및 작업, 작업 및 크롤러 속성, 작업과 크롤러 간의 종속성을 지정하는 함수를 포함합니다. 이 함수는 블루프린트 파라미터를 허용하고 AWS Glue가 워크플로를 생성하는 데 사용하는 워크플로 구조(JSON 객체)를 반환합니다. Python 스크립트를 사용하여 워크플로를 생성하기 때문에 사용 사례에 적합한 고유한 논리를 추가할 수 있습니다.
+ 구성 파일

  워크플로 레이아웃을 생성하는 Python 함수의 정규화된 이름을 지정합니다. 또한 스크립트에서 사용하는 모든 블루프린트 파라미터의 이름, 데이터 유형 및 기타 속성을 지정합니다.
+ (선택 사항) ETL 스크립트 및 지원 파일

  고급 사용 사례로 작업에서 사용하는 ETL 스크립트의 위치를 파라미터화할 수 있습니다. ZIP 아카이브에 작업 스크립트 파일을 포함하고 스크립트를 복사할 Amazon S3 위치에 대한 블루프린트 파라미터를 지정할 수 있습니다. 레이아웃 생성기 스크립트는 ETL 스크립트를 지정된 위치에 복사하고 해당 위치를 작업 스크립트 위치 속성으로 지정할 수 있습니다. 스크립트에서 처리하는 경우 라이브러리 또는 기타 지원 파일을 포함할 수도 있습니다.

![\[Blueprint라는 레이블이 붙은 상자에는 2개의 작은 상자가 있습니다. 그 중 하나에는 Python Script라는 레이블이 붙었고 다른 하나에는 Config File이라는 레이블이 붙었습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/blueprint.png)


**블루프린트 실행**  
블루프린트에서 워크플로를 생성하는 경우 AWS Glue가 블루프린트를 실행하여 워크플로와 워크플로가 캡슐화하는 작업, 크롤러, 트리거를 생성하는 비동기 프로세스를 시작합니다. AWS Glue는 블루프린트 실행을 사용하여 워크플로 및 해당 구성 요소의 생성을 오케스트레이션합니다. 블루프린트 실행 상태를 확인하여 생성 프로세스의 상태를 봅니다. 블루프린트 실행에는 블루프린트 파라미터에 대해 제공한 값도 저장됩니다.

![\[Blueprint run이라는 레이블이 붙은 상자에는 Workflow 및 Parameter Values라는 아이콘이 있습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/blueprint-run.png)


AWS Glue 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 블루프린트 실행을 볼 수 있습니다. 워크플로를 보거나 문제를 해결할 때 언제든지 블루프린트 실행으로 돌아가 워크플로를 생성하는 데 사용된 블루프린트 파라미터 값을 볼 수 있습니다.

**블루프린트의 수명 주기**  
블루프린트는 AWS Glue로 개발, 테스트, 등록되고 워크플로를 생성하기 위해 실행됩니다. 일반적으로 블루프린트 수명 주기에는 세 가지 페르소나가 포함됩니다.


| 페르소나 | 업무 | 
| --- | --- | 
| AWS Glue 개발자 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/blueprints-overview.html)  | 
| AWS Glue 관리자 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/blueprints-overview.html)  | 
| 데이터 분석가 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/blueprints-overview.html)  | 

**다음 사항도 참조하세요.**  
[AWS Glue에서 블루프린트 개발](developing-blueprints.md)
[AWS Glue의 블루프린트에서 워크플로 생성](creating_workflow_blueprint.md)
[AWS Glue 블루프린트에 대한 페르소나 및 역할의 권한](blueprints-personas-permissions.md)

# AWS Glue에서 블루프린트 개발
<a name="developing-blueprints"></a>

AWS Glue 개발자는 데이터 분석가가 워크플로를 생성하는 데 사용할 수 있는 블루프린트를 생성하고 게시할 수 있습니다.

**Topics**
+ [블루프린트 개발 개요](developing-blueprints-overview.md)
+ [블루프린트 개발을 위한 사전 조건](developing-blueprints-prereq.md)
+ [블루프린트 코드 작성](developing-blueprints-code.md)
+ [샘플 블루프린트 프로젝트](developing-blueprints-sample.md)
+ [블루프린트 테스트](developing-blueprints-testing.md)
+ [블루프린트 게시](developing-blueprints-publishing.md)
+ [AWS Glue 블루프린트 클래스 참조](developing-blueprints-code-classes.md)
+ [블루프린트 샘플](developing-blueprints-samples.md)

**다음 사항도 참조하세요.**  
[AWS Glue의 블루프린트 개요](blueprints-overview.md)

# 블루프린트 개발 개요
<a name="developing-blueprints-overview"></a>

개발 프로세스의 첫 번째 단계는 블루프린트의 이점을 얻을 수 있는 일반적인 사용 사례를 파악하는 것입니다. 일반적인 사용 사례에는 일반적인 방식으로 해결해야 한다고 생각하는 반복적인 ETL 문제가 포함됩니다. 다음으로 일반화된 사용 사례를 구현하는 블루프린트를 설계하고 일반화된 사용 사례에서 특정 사용 사례를 정의할 수 있는 블루프린트 입력 파라미터를 정의합니다.

블루프린트는 블루프린트 파라미터 구성 파일이 포함된 프로젝트와 생성할 워크플로의 *레이아웃*을 정의하는 스크립트로 구성됩니다. 레이아웃은 생성할 작업 및 크롤러(또는 블루프린트 스크립트 용어의 *엔터티*)를 정의합니다.

레이아웃 스크립트에서 트리거를 직접 지정하지 않습니다. 대신 스크립트가 생성하는 작업과 크롤러 간의 종속성을 지정하는 코드를 작성합니다. AWS Glue에서는 종속성 사양에 따라 트리거를 생성합니다. 레이아웃 스크립트의 출력은 모든 워크플로 엔터티에 대한 사양을 포함하는 워크플로 객체입니다.

다음 AWS Glue 블루프린트 라이브러리를 사용하여 워크플로 객체를 구축합니다.
+ `awsglue.blueprint.base_resource` - 라이브러리에서 사용하는 기본 리소스의 라이브러리입니다.
+ `awsglue.blueprint.workflow` - `Workflow` 클래스를 정의하기 위한 라이브러리입니다.
+ `awsglue.blueprint.job` - `Job` 클래스를 정의하기 위한 라이브러리입니다.
+ `awsglue.blueprint.crawler` - `Crawler` 클래스를 정의하기 위한 라이브러리입니다.

레이아웃 생성을 위해 지원되는 유일한 다른 라이브러리는 Python 셸에 사용할 수 있는 라이브러리입니다.

블루프린트를 게시하기 전에 블루프린트 라이브러리에 정의된 방법을 사용하여 블루프린트를 로컬에서 테스트할 수 있습니다.

데이터 분석가에게 블루프린트를 제공할 준비가 되면 스크립트, 파라미터 구성 파일, 지원 파일(예: 추가 스크립트 및 라이브러리)을 배포 가능한 단일 자산으로 패키징합니다. 그런 다음 자산을 Amazon S3에 업로드하고 관리자에게 AWS Glue에 등록하도록 요청합니다.

추가 샘플 블루프린트 프로젝트에 대한 자세한 내용은 [샘플 블루프린트 프로젝트](developing-blueprints-sample.md) 및 [블루프린트 샘플](developing-blueprints-samples.md) 섹션을 참조하세요.

# 블루프린트 개발을 위한 사전 조건
<a name="developing-blueprints-prereq"></a>

블루프린트를 개발하려면 AWS Glue 사용과 Apache Spark ETL 작업 또는 Python 셸 작업을 위한 스크립트 작성에 익숙해야 합니다. 또한 다음 설정 태스크를 완료해야 합니다.
+ 블루프린트 레이아웃 스크립트에 사용할 4개의 AWS Python 라이브러리를 다운로드합니다.
+ AWS SDK를 설정합니다.
+ AWS CLI를 설정합니다.

## Python 라이브러리 다운로드
<a name="prereqs-get-libes"></a>

GitHub에서 다음 라이브러리를 다운로드하고 프로젝트에 설치합니다.
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/base\$1resource.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/base_resource.py)
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/workflow.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/workflow.py)
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/crawler.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/crawler.py)
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/job.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/job.py)

## AWS Java SDK 설정
<a name="prereqs-java-preview-sdk"></a>

AWS Java SDK의 경우 블루프린트용 API가 `jar` 포함된 파일을 추가해야 합니다.

1. 아직 설정하지 않은 경우 AWS SDK for Java를 설정합니다.
   + Java 1.x의 경우 *AWS SDK for Java Developer Guide*의 [Set up the AWS SDK for Java](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-install.html) 지침을 따르세요.
   + Java 2.x의 경우 *AWS SDK for Java 2.x Developer Guide*의 [Setting up the AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup.html) 지침을 따르세요.

1. 블루프린트용 API에 대한 액세스 권한이 있는 클라이언트 `jar` 파일을 다운로드합니다.
   + Java 1.x의 경우: s3://awsglue-custom-blueprints-preview-artifacts/awsglue-java-sdk-preview/AWSGlueJavaClient-1.11.x.jar
   + Java 2.x의 경우: s3://awsglue-custom-blueprints-preview-artifacts/awsglue-java-sdk-v2-preview/AwsJavaSdk-Glue-2.0.jar

1. AWS Java SDK에서 제공하는 AWS Glue 클라이언트를 재정의하려면 Java 클래스 경로 앞에 클라이언트 `jar`를 추가합니다.

   ```
   export CLASSPATH=<path-to-preview-client-jar>:$CLASSPATH
   ```

1. (선택 사항) 다음 Java 애플리케이션으로 SDK를 테스트합니다. 애플리케이션이 빈 목록을 출력해야 합니다.

   `accessKey` 및 `secretKey`를 자격 증명으로 바꾸고 `us-east-1`을 리전으로 바꿉니다.

   ```
   import com.amazonaws.auth.AWSCredentials;
   import com.amazonaws.auth.AWSCredentialsProvider;
   import com.amazonaws.auth.AWSStaticCredentialsProvider;
   import com.amazonaws.auth.BasicAWSCredentials;
   import com.amazonaws.services.glue.AWSGlue;
   import com.amazonaws.services.glue.AWSGlueClientBuilder;
   import com.amazonaws.services.glue.model.ListBlueprintsRequest;
   
   public class App{
       public static void main(String[] args) {
           AWSCredentials credentials = new BasicAWSCredentials("accessKey", "secretKey");
           AWSCredentialsProvider provider = new AWSStaticCredentialsProvider(credentials);
           AWSGlue glue = AWSGlueClientBuilder.standard().withCredentials(provider)
                   .withRegion("us-east-1").build();
           ListBlueprintsRequest request = new ListBlueprintsRequest().withMaxResults(2);
           System.out.println(glue.listBlueprints(request));
       }
   }
   ```

## AWS Python SDK 설정
<a name="prereqs-python-preview-sdk"></a>

다음 단계에서는 컴퓨터에 Python 버전 2.7 이상 또는 버전 3.9 이상이 설치되어 있다고 가정합니다.

1. 다음 boto3 휠 파일을 다운로드합니다. 열거나 저장하라는 메시지가 표시되면 s3://awsglue-custom-blueprints-preview-artifacts/aws-python-sdk-preview/boto3-1.17.31-py2.py3-none-any.whl 파일을 저장합니다.

1. botocore 휠 파일인 s3://awsglue-custom-blueprints-preview-artifacts/aws-python-sdk-preview/botocore-1.20.31-py2.py3-none-any.whl을 다운로드합니다.

1. Python 버전을 확인합니다.

   ```
   python --version
   ```

1. Python 버전에 따라 다음 명령을 입력합니다(Linux의 경우).
   + Python 2.7 이상용입니다.

     ```
     python3 -m pip install --user virtualenv
     source env/bin/activate
     ```
   + Python 3.9 이상용입니다.

     ```
     python3 -m venv python-sdk-test
     source python-sdk-test/bin/activate
     ```

1. botocore 휠 파일을 설치합니다.

   ```
   python3 -m pip install <download-directory>/botocore-1.20.31-py2.py3-none-any.whl
   ```

1. boto3 휠 파일을 설치합니다.

   ```
   python3 -m pip install <download-directory>/boto3-1.17.31-py2.py3-none-any.whl
   ```

1. `~/.aws/credentials` 및 `~/.aws/config` 파일에서 자격 증명과 기본 리전을 구성합니다. 자세한 내용은 *AWS Command Line Interface User Guide*의 [Configuring the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)를 참조하세요.

1. (선택 사항) 설정을 테스트합니다. 다음 명령은 빈 목록을 반환합니다.

   `us-east-1`을 해당 리전으로 바꿉니다.

   ```
   $ python
   >>> import boto3
   >>> glue = boto3.client('glue', 'us-east-1')
   >>> glue.list_blueprints()
   ```

## 미리 보기 AWS CLI 설정
<a name="prereqs-setup-cli"></a>

1. 아직 수행하지 않았다면 컴퓨터에 AWS Command Line Interface(AWS CLI)를 설치 및/또는 업데이트합니다. 이를 수행하는 가장 쉬운 방법은 Python 설치 프로그램 유틸리티인 `pip`를 사용하는 것입니다.

   ```
   pip install awscli --upgrade --user
   ```

   AWS CLI에 대한 전체 설치 지침은 [AWS Command Line Interface 설치](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)에서 찾을 수 있습니다.

1. s3://awsglue-custom-blueprints-preview-artifacts/awscli-preview-build/awscli-1.19.31-py2.py3-none-any.whl에서 AWS CLI 휠 파일을 다운로드합니다.

1. AWS CLI 휠 파일을 설치합니다.

   ```
   python3 -m pip install awscli-1.19.31-py2.py3-none-any.whl
   ```

1. `aws configure` 명령을 실행합니다. AWS 자격 증명(액세스 키 및 보안 암호 키 포함) 및 AWS 리전을 구성합니다. AWS CLI 구성에 대한 자세한 내용은 [AWS CLI 구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)에서 찾을 수 있습니다.

1. AWS CLI를 테스트합니다. 다음 명령은 빈 목록을 반환합니다.

   `us-east-1`을 해당 리전으로 바꿉니다.

   ```
   aws glue list-blueprints --region us-east-1
   ```

# 블루프린트 코드 작성
<a name="developing-blueprints-code"></a>

생성하는 각 블루프린트 프로젝트에는 최소한 다음 파일이 포함되어야 합니다.
+ 워크플로를 정의하는 Python 레이아웃 스크립트. 스크립트에는 워크플로의 엔터티(작업 및 크롤러)와 이들 간의 종속성을 정의하는 기능이 포함되어 있습니다.
+ 다음을 정의하는 구성 파일, `blueprint.cfg` 
  + 워크플로 레이아웃 정의 기능의 전체 경로.
  + 블루프린트에서 허용하는 파라미터.

**Topics**
+ [블루프린트 레이아웃 스크립트 생성](developing-blueprints-code-layout.md)
+ [구성 파일 생성](developing-blueprints-code-config.md)
+ [블루프린트 파라미터 지정](developing-blueprints-code-parameters.md)

# 블루프린트 레이아웃 스크립트 생성
<a name="developing-blueprints-code-layout"></a>

블루프린트 레이아웃 스크립트에는 워크플로에서 엔터티를 생성하는 함수가 포함되어야 합니다. 원하는 대로 이 함수의 이름을 지정할 수 있습니다. AWS Glue에서는 구성 파일을 사용하여 함수의 정규화된 이름을 확인합니다.

레이아웃 함수는 다음을 수행합니다.
+ (선택 사항) `Job` 클래스를 인스턴스화하여 `Job` 객체를 생성하고 `Command` 및 `Role` 등의 인수를 전달합니다. AWS Glue 콘솔 또는 API를 사용하여 작업을 생성하는 경우 지정할 작업 속성입니다.
+ (선택 사항) `Crawler` 클래스를 인스턴스화하여 `Crawler` 객체를 생성하고 이름, 역할 및 대상 인수를 전달합니다.
+ 객체(워크플로 엔터티) 간의 종속성을 나타내려면 `DependsOn` 및 `WaitForDependencies` 추가 인수를 `Job()` 및 `Crawler()`에 전달합니다. 이러한 인수는 이 섹션의 뒷부분에서 설명합니다.
+ `Workflow` 클래스를 인스턴스화하여 AWS Glue에 반환되는 워크플로 객체를 생성하고 `Name` 인수, `Entities` 인수, 선택적 `OnSchedule` 인수를 전달합니다. 이 `Entities` 인수는 워크플로에 포함할 모든 작업 및 크롤러를 지정합니다. `Entities` 객체를 구성하는 방법을 보려면 이 섹션의 뒷부분에 나오는 샘플 프로젝트를 참조하세요.
+ `Workflow` 객체를 반환합니다.

`Job`, `Crawler` 및 `Workflow` 클래스의 정의는 [AWS Glue 블루프린트 클래스 참조](developing-blueprints-code-classes.md) 섹션을 참조하세요.

레이아웃 함수에 사용할 수 있는 입력 인수는 다음과 같습니다.


| 인수 | 설명 | 
| --- | --- | 
| user\$1params | 블루프린트 파라미터 이름 및 값의 Python 딕셔너리. 자세한 내용은 [블루프린트 파라미터 지정](developing-blueprints-code-parameters.md) 섹션을 참조하세요. | 
| system\$1params | 두 가지 속성(region 및 accountId)을 포함하는 Python 딕셔너리. | 

다음은 `Layout.py`라는 파일의 샘플 레이아웃 생성기 스크립트입니다.

```
import argparse
import sys
import os
import json
from awsglue.blueprint.workflow import *
from awsglue.blueprint.job import *
from awsglue.blueprint.crawler import *


def generate_layout(user_params, system_params):

    etl_job = Job(Name="{}_etl_job".format(user_params['WorkflowName']),
                  Command={
                      "Name": "glueetl",
                      "ScriptLocation": user_params['ScriptLocation'],
                      "PythonVersion": "2"
                  },
                  Role=user_params['PassRole'])
    post_process_job = Job(Name="{}_post_process".format(user_params['WorkflowName']),
                            Command={
                                "Name": "pythonshell",
                                "ScriptLocation": user_params['ScriptLocation'],
                                "PythonVersion": "2"
                            },
                            Role=user_params['PassRole'],
                            DependsOn={
                                etl_job: "SUCCEEDED"
                            },
                            WaitForDependencies="AND")
    sample_workflow = Workflow(Name=user_params['WorkflowName'],
                            Entities=Entities(Jobs=[etl_job, post_process_job]))
    return sample_workflow
```

샘플 스크립트는 필요한 Blueprint 라이브러리를 가져오고 2개의 작업으로 워크플로를 생성하는 `generate_layout` 함수를 포함합니다. 이것은 매우 간단한 스크립트입니다. 보다 복잡한 스크립트는 추가 로직 및 파라미터를 사용하여 많은 작업과 크롤러 또는 다양한 수의 작업과 크롤러가 있는 워크플로를 생성할 수 있습니다.

## DependsOn 인수 사용
<a name="developing-blueprints-code-layout-depends-on"></a>

`DependsOn` 인수는 이 엔터티가 워크플로 내의 다른 엔터티에 대해 갖는 종속성의 딕셔너리 표현입니다. 형식은 다음과 같습니다.

```
DependsOn = {dependency1 : state, dependency2 : state, ...}
```

이 딕셔너리의 키는 엔터티의 이름이 아닌 객체 참조를 나타내는 반면 값은 감시할 상태에 해당하는 문자열입니다. AWS Glue는 적절한 트리거를 유추합니다. 유효한 상태는 [조건 구조](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-trigger.html#aws-glue-api-jobs-trigger-Condition)를 참조하세요.

예를 들어 작업은 크롤러의 성공적인 완료에 따라 달라질 수 있습니다. 다음과 같이 이름이 `crawler2`인 크롤러 객체를 정의하는 경우

```
crawler2 = Crawler(Name="my_crawler", ...)
```

그러면 `crawler2`에 종속된 객체에는 다음과 같은 생성자 인수가 포함됩니다.

```
DependsOn = {crawler2 : "SUCCEEDED"}
```

예:

```
job1 = Job(Name="Job1", ..., DependsOn = {crawler2 : "SUCCEEDED", ...})
```

엔터티에 대해 `DependsOn`이 생략된 경우 해당 엔터티는 워크플로 시작 트리거에 따라 달라집니다.

## WaitForDependencies 인수 사용
<a name="developing-blueprints-code-layout-wait-for-dependencies"></a>

`WaitForDependencies` 인수는 작업 또는 크롤러 엔터티가 종속된 *모든* 엔터티가 완료될 때까지 또는 *하나라도*완료될 때까지 기다려야 하는지 여부를 정의합니다.

허용되는 값은 "`AND`" 또는 "`ANY`"입니다.

## OnSchedule 인수 사용
<a name="developing-blueprints-code-layout-on-schedule"></a>

`Workflow` 클래스 생성자의 `OnSchedule` 인수는 워크플로에 대한 시작 트리거 정의를 정의하는 `cron` 표현식입니다.

이 인수가 지정되면 AWS Glue는 해당 일정으로 일정 트리거를 생성합니다. 지정되지 않은 경우 워크플로의 시작 트리거는 온디맨드 트리거입니다.

# 구성 파일 생성
<a name="developing-blueprints-code-config"></a>

블루프린트 구성 파일은 워크플로 생성을 위한 스크립트 진입점과 블루프린트에서 허용하는 파라미터를 정의하는 필수 파일입니다. 파일의 이름은 `blueprint.cfg`여야 합니다.

다음은 샘플 구성 파일입니다.

```
{
    "layoutGenerator": "DemoBlueprintProject.Layout.generate_layout",
    "parameterSpec" : {
           "WorkflowName" : {
                "type": "String",
                "collection": false
           },
           "WorkerType" : {
                "type": "String",
                "collection": false,
                "allowedValues": ["G1.X", "G2.X"],
                "defaultValue": "G1.X"
           },
           "Dpu" : {
                "type" : "Integer",
                "allowedValues" : [2, 4, 6],
                "defaultValue" : 2
           },
           "DynamoDBTableName": {
                "type": "String",
                "collection" : false
           },
           "ScriptLocation" : {
                "type": "String",
                "collection": false
    	}
    }
}
```

`layoutGenerator` 속성은 레이아웃을 생성하는 스크립트에서 함수의 정규화된 이름을 지정합니다.

`parameterSpec` 속성은 이 블루프린트에서 허용하는 파라미터를 지정합니다. 자세한 내용은 [블루프린트 파라미터 지정](developing-blueprints-code-parameters.md) 섹션을 참조하세요.

**중요**  
구성 파일에 워크플로 이름이 블루프린트 파라미터로 포함되거나 레이아웃 스크립트에서 고유한 워크플로 이름을 생성해야 합니다.

# 블루프린트 파라미터 지정
<a name="developing-blueprints-code-parameters"></a>

구성 파일에는 `parameterSpec` JSON 객체의 블루프린트 파라미터 사양이 포함되어 있습니다. `parameterSpec`은 하나 이상의 파라미터 객체를 포함합니다.

```
"parameterSpec": {
    "<parameter_name>": {
      "type": "<parameter-type>",
      "collection": true|false, 
      "description": "<parameter-description>",
      "defaultValue": "<default value for the parameter if value not specified>"
      "allowedValues": "<list of allowed values>" 
    },
    "<parameter_name>": {    
       ...
    }
  }
```

다음은 각 파라미터 객체를 코딩하는 규칙입니다.
+ 파라미터 이름과 `type`은 필수입니다. 다른 모든 속성은 선택 사항입니다.
+ `defaultValue` 속성을 지정하는 경우 파라미터는 선택 사항입니다. 그렇지 않으면 파라미터가 필수이며 블루프린트에서 워크플로를 생성하는 데이터 분석가가 해당 값을 제공해야 합니다.
+ `collection` 속성을 `true`로 설정하면 파라미터가 값 컬렉션을 사용할 수 있습니다. 컬렉션은 모든 데이터 유형이 될 수 있습니다.
+ `allowedValues`를 지정하면 AWS Glue 콘솔에 데이터 분석가가 블루프린트에서 워크플로를 생성할 때 선택할 수 있는 값의 드롭다운 목록이 표시됩니다.

다음은 `type`에 허용되는 값입니다.


| 파라미터 데이터 유형 | 참고 | 
| --- | --- | 
| String | - | 
| Integer | - | 
| Double | - | 
| Boolean | 가능한 값은 true 및 false입니다. AWS Glue 콘솔의 <블루프린트> 페이지에서 워크플로 생성(Create a workflow from <blueprint>) 페이지에 확인란을 생성합니다. | 
| S3Uri | s3://로 시작하여 Amazon S3 경로를 완성합니다. [<블루프린트>에서 워크플로 생성(Create a workflow from <blueprint>)]에서 텍스트 필드와 [찾아보기(Browse)] 버튼을 생성합니다. | 
| S3Bucket | Amazon S3 버킷 이름만입니다. <블루프린트>에서 워크플로 생성(Create a workflow from <blueprint>) 페이지에서 버킷 선택기를 생성합니다. | 
| IAMRoleArn | AWS Identity and Access Management(IAM) 역할의 Amazon 리소스 이름(ARN)입니다. <블루프린트>에서 워크플로 생성(Create a workflow from <blueprint>) 페이지에서 역할 선택기를 생성합니다. | 
| IAMRoleName | IAM 역할의 이름입니다. <블루프린트>에서 워크플로 생성(Create a workflow from <blueprint>) 페이지에서 역할 선택기를 생성합니다. | 

# 샘플 블루프린트 프로젝트
<a name="developing-blueprints-sample"></a>

데이터 포맷 변환은 빈번한 추출, 변환, 로드 사용 사례입니다. 일반적인 분석 워크로드에서는 Parquet 또는 ORC와 같은 열 기반 파일 포맷이 CSV 또는 JSON과 같은 텍스트 포맷보다 선호됩니다. 이 샘플 블루프린트를 사용하면 CSV/JSON 등의 데이터를 Amazon S3의 파일용 Parquet로 변환할 수 있습니다.

이 블루프린트는 블루프린트 파라미터로 정의된 S3 경로 목록을 가져와 데이터를 Parquet 포맷으로 변환한 다음 다른 블루프린트 파라미터로 지정된 S3 위치에 씁니다. 레이아웃 스크립트는 각 경로에 대한 크롤러 및 작업을 생성합니다. 또한 레이아웃 스크립트는 `Conversion.py`의 ETL 스크립트를 다른 블루프린트 파라미터로 지정된 S3 버킷에 업로드합니다. 그런 다음 레이아웃 스크립트는 업로드된 스크립트를 각 작업에 대한 ETL 스크립트로 지정합니다. 프로젝트의 ZIP 아카이브에는 레이아웃 스크립트, ETL 스크립트 및 Blueprint 구성 파일이 포함되어 있습니다.

추가 샘플 블루프린트 프로젝트에 대한 자세한 내용은 [블루프린트 샘플](developing-blueprints-samples.md) 섹션을 참조하세요.

다음은 `Layout.py` 파일에 있는 레이아웃 스크립트입니다.

```
from awsglue.blueprint.workflow import *
from awsglue.blueprint.job import *
from awsglue.blueprint.crawler import *
import boto3

s3_client = boto3.client('s3')

# Ingesting all the S3 paths as Glue table in parquet format
def generate_layout(user_params, system_params):
    #Always give the full path for the file
    with open("ConversionBlueprint/Conversion.py", "rb") as f:
        s3_client.upload_fileobj(f, user_params['ScriptsBucket'], "Conversion.py")
    etlScriptLocation = "s3://{}/Conversion.py".format(user_params['ScriptsBucket'])    
    crawlers = []
    jobs = []
    workflowName = user_params['WorkflowName']
    for path in user_params['S3Paths']:
      tablePrefix = "source_" 
      crawler = Crawler(Name="{}_crawler".format(workflowName),
                        Role=user_params['PassRole'],
                        DatabaseName=user_params['TargetDatabase'],
                        TablePrefix=tablePrefix,
                        Targets= {"S3Targets": [{"Path": path}]})
      crawlers.append(crawler)
      transform_job = Job(Name="{}_transform_job".format(workflowName),
                         Command={"Name": "glueetl",
                                  "ScriptLocation": etlScriptLocation,
                                  "PythonVersion": "3"},
                         Role=user_params['PassRole'],
                         DefaultArguments={"--database_name": user_params['TargetDatabase'],
                                           "--table_prefix": tablePrefix,
                                           "--region_name": system_params['region'],
                                           "--output_path": user_params['TargetS3Location']},
                         DependsOn={crawler: "SUCCEEDED"},
                         WaitForDependencies="AND")
      jobs.append(transform_job)
    conversion_workflow = Workflow(Name=workflowName, Entities=Entities(Jobs=jobs, Crawlers=crawlers))
    return conversion_workflow
```

다음은 해당 블루프린트 구성 파일인 `blueprint.cfg`입니다.

```
{
    "layoutGenerator": "ConversionBlueprint.Layout.generate_layout",
    "parameterSpec" : {
        "WorkflowName" : {
            "type": "String",
            "collection": false,
            "description": "Name for the workflow."
        },
        "S3Paths" : {
            "type": "S3Uri",
            "collection": true,
            "description": "List of Amazon S3 paths for data ingestion."
        },
        "PassRole" : {
            "type": "IAMRoleName",
            "collection": false,
            "description": "Choose an IAM role to be used in running the job/crawler"
        },
        "TargetDatabase": {
            "type": "String",
            "collection" : false,
            "description": "Choose a database in the Data Catalog."
        },
        "TargetS3Location": {
            "type": "S3Uri",
            "collection" : false,
            "description": "Choose an Amazon S3 output path: ex:s3://<target_path>/."
        },
        "ScriptsBucket": {
            "type": "S3Bucket",
            "collection": false,
            "description": "Provide an S3 bucket name(in the same AWS Region) to store the scripts."
        }
    }
}
```

`Conversion.py` 파일의 다음 스크립트는 업로드된 ETL 스크립트입니다. 변환하는 동안 파티션 구성표를 유지합니다.

```
import sys
from pyspark.sql.functions import *
from pyspark.context import SparkContext
from awsglue.transforms import *
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.utils import getResolvedOptions
import boto3

args = getResolvedOptions(sys.argv, [
    'JOB_NAME',
    'region_name',
    'database_name',
    'table_prefix',
    'output_path'])
databaseName = args['database_name']
tablePrefix = args['table_prefix']
outputPath = args['output_path']

glue = boto3.client('glue', region_name=args['region_name'])

glue_context = GlueContext(SparkContext.getOrCreate())
spark = glue_context.spark_session
job = Job(glue_context)
job.init(args['JOB_NAME'], args)

def get_tables(database_name, table_prefix):
    tables = []
    paginator = glue.get_paginator('get_tables')
    for page in paginator.paginate(DatabaseName=database_name, Expression=table_prefix+"*"):
        tables.extend(page['TableList'])
    return tables

for table in get_tables(databaseName, tablePrefix):
    tableName = table['Name']
    partitionList = table['PartitionKeys']
    partitionKeys = []
    for partition in partitionList:
        partitionKeys.append(partition['Name'])

    # Create DynamicFrame from Catalog
    dyf = glue_context.create_dynamic_frame.from_catalog(
        name_space=databaseName,
        table_name=tableName,
        additional_options={
            'useS3ListImplementation': True
        },
        transformation_ctx='dyf'
    )

    # Resolve choice type with make_struct
    dyf = ResolveChoice.apply(
        frame=dyf,
        choice='make_struct',
        transformation_ctx='resolvechoice_' + tableName
    )

    # Drop null fields
    dyf = DropNullFields.apply(
        frame=dyf,
        transformation_ctx="dropnullfields_" + tableName
    )

    # Write DynamicFrame to S3 in glueparquet
    sink = glue_context.getSink(
        connection_type="s3",
        path=outputPath,
        enableUpdateCatalog=True,
        partitionKeys=partitionKeys
    )
    sink.setFormat("glueparquet")

    sink.setCatalogInfo(
        catalogDatabase=databaseName,
        catalogTableName=tableName[len(tablePrefix):]
    )
    sink.writeFrame(dyf)

job.commit()
```

**참고**  
2개의 Amazon S3 경로만 샘플 블루프린트에 대한 입력으로 제공될 수 있습니다. 이는 AWS Glue 트리거가 2개의 크롤러 작업만 호출하도록 제한되기 때문입니다.

# 블루프린트 테스트
<a name="developing-blueprints-testing"></a>

코드를 개발하는 동안 워크플로 레이아웃이 올바른지 확인하기 위해 로컬 테스트를 수행해야 합니다.

로컬 테스트는 AWS Glue 작업, 크롤러 또는 트리거를 생성하지 않습니다. 대신 레이아웃 스크립트를 로컬에서 실행하고 `to_json()` 및 `validate()` 메서드를 사용하여 객체를 인쇄하고 오류를 찾습니다. 이러한 방법은 라이브러리에 정의 된 3가지 클래스 모두에서 사용할 수 있습니다.

AWS Glue가 레이아웃 함수에 전달하는 `user_params` 및 `system_params` 인수를 처리하는 두 가지 방법이 있습니다. 테스트 벤치 코드는 샘플 블루프린트 파라미터 값의 딕셔너리를 생성하고 이를 `user_params` 인수로 레이아웃 함수에 전달할 수 있습니다. 또는 `user_params`에 대한 참조를 제거하고 하드코딩된 문자열로 바꿀 수 있습니다.

코드에서 `system_params` 인수의 `region` 및 `accountId` 속성을 사용하는 경우 `system_params`에 대한 딕셔너리를 전달할 수 있습니다.

**블루프린트를 테스트하려면**

1. 라이브러리가 있는 디렉터리에서 Python 인터프리터를 시작하거나 블루프린트 파일과 제공된 라이브러리를 원하는 IDE(통합 개발 환경)로 로드합니다.

1. 코드가 제공된 라이브러리를 가져 오는지 확인합니다.

1. 레이아웃 기능에 코드를 추가하여 엔터티 또는 `Workflow` 객체에서 `validate()` 또는 `to_json()`을 호출합니다. 예를 들어 코드가 `mycrawler`라는 `Crawler` 객체를 생성하는 경우 다음과 같이 `validate()`를 호출할 수 있습니다.

   ```
   mycrawler.validate()
   ```

   다음과 같이 `mycrawler`를 인쇄 할 수 있습니다.

   ```
   print(mycrawler.to_json())
   ```

   객체에서 `to_json`을 호출하면 ` to_json()`이 `validate()`를 호출하기 때문에 `validate()`도 호출할 필요가 없습니다.

   워크플로 객체에서 이러한 메서드를 호출하는 것이 가장 유용합니다. 스크립트가 워크플로 객체의 이름을 `my_workflow`라고 가정하고 다음과 같이 워크플로 객체를 검증하고 인쇄합니다.

   ```
   print(my_workflow.to_json())
   ```

   `to_json()` 및 `validate()`에 대한 자세한 내용은 [클래스 메서드](developing-blueprints-code-classes.md#developing-blueprints-code-methods)섹션을 참조하세요.

   이 섹션의 뒷부분에 나오는 예제와 같이 `pprint`를 가져와서 워크플로 객체를 예쁘게 인쇄할 수도 있습니다.

1. 코드를 실행하고, 오류를 수정하고, 마지막으로 `validate()` 또는 `to_json()`에 대한 호출을 제거합니다.

**Example**  
다음 예제는 샘플 블루프린트 파라미터의 딕셔너리를 구성하고 레이아웃 함수 `generate_compaction_workflow`에 `user_params` 인수로 전달하는 방법을 보여줍니다. 또한 생성된 워크플로 객체를 예쁘게 인쇄하는 방법을 보여줍니다.  

```
from pprint import pprint
from awsglue.blueprint.workflow import *
from awsglue.blueprint.job import *
from awsglue.blueprint.crawler import *
 
USER_PARAMS = {"WorkflowName": "compaction_workflow",
               "ScriptLocation": "s3://amzn-s3-demo-bucket/scripts/threaded-compaction.py",
               "PassRole": "arn:aws:iam::111122223333:role/GlueRole-ETL",
               "DatabaseName": "cloudtrial",
               "TableName": "ct_cloudtrail",
               "CoalesceFactor": 4,
               "MaxThreadWorkers": 200}
 
 
def generate_compaction_workflow(user_params: dict, system_params: dict) -> Workflow:
    compaction_job = Job(Name=f"{user_params['WorkflowName']}_etl_job",
                         Command={"Name": "glueetl",
                                  "ScriptLocation": user_params['ScriptLocation'],
                                  "PythonVersion": "3"},
                         Role="arn:aws:iam::111122223333:role/AWSGlueServiceRoleDefault",
                         DefaultArguments={"DatabaseName": user_params['DatabaseName'],
                                           "TableName": user_params['TableName'],
                                           "CoalesceFactor": user_params['CoalesceFactor'],
                                           "max_thread_workers": user_params['MaxThreadWorkers']})
 
    catalog_target = {"CatalogTargets": [{"DatabaseName": user_params['DatabaseName'], "Tables": [user_params['TableName']]}]}
 
    compacted_files_crawler = Crawler(Name=f"{user_params['WorkflowName']}_post_crawl",
                                      Targets = catalog_target,
                                      Role=user_params['PassRole'],
                                      DependsOn={compaction_job: "SUCCEEDED"},
                                      WaitForDependencies="AND",
                                      SchemaChangePolicy={"DeleteBehavior": "LOG"})
 
    compaction_workflow = Workflow(Name=user_params['WorkflowName'],
                                   Entities=Entities(Jobs=[compaction_job],
                                                     Crawlers=[compacted_files_crawler]))
    return compaction_workflow
 
generated = generate_compaction_workflow(user_params=USER_PARAMS, system_params={})
gen_dict = generated.to_json()
 
pprint(gen_dict)
```

# 블루프린트 게시
<a name="developing-blueprints-publishing"></a>

블루프린트를 개발한 후에는 Amazon S3에 업로드해야 합니다. 블루프린트를 게시하는 데 사용하는 Amazon S3 버킷에 대한 쓰기 권한이 있어야 합니다. 또한 블루프린트를 등록할 AWS Glue 관리자에게 Amazon S3 버킷에 대한 읽기 액세스 권한이 있는지 확인해야 합니다. AWS Glue 블루프린트의 페르소나 및 역할에 대해 제안된 AWS Identity and Access Management(IAM) 권한 정책은 [AWS Glue 블루프린트에 대한 페르소나 및 역할의 권한](blueprints-personas-permissions.md) 섹션을 참조하세요.

**블루프린트를 게시하려면**

1. 필요한 스크립트, 리소스 및 블루프린트 구성 파일을 생성합니다.

1. 모든 파일을 ZIP 아카이브에 추가하고 ZIP 파일을 Amazon S3에 업로드합니다. 사용자가 블루프린트를 등록하고 실행할 리전과 동일한 리전에 있는 S3 버킷을 사용합니다.

   다음 명령을 사용하여 명령줄에서 ZIP 파일을 생성할 수 있습니다.

   ```
   zip -r folder.zip folder
   ```

1. 원하는 AWS 계정에 읽기 권한을 부여하는 버킷 정책을 추가합니다. 다음은 샘플 정책입니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::111122223333:root"
         },
         "Action": "s3:GetObject",
         "Resource": "arn:aws:s3:::my-blueprints/*"
       }
     ]
   }
   ```

------

1. Amazon S3 버킷에 대한 IAM `s3:GetObject` 권한을 AWS Glue 관리자 또는 블루프린트를 등록할 사람에게 부여합니다. 관리자에게 부여할 샘플 정책은 [블루프린트에 대한 AWS Glue 관리자 권한](blueprints-personas-permissions.md#bp-persona-admin) 섹션을 참조하세요.

블루프린트의 로컬 테스트를 완료한 후 AWS Glue에서 블루프린트를 테스트할 수도 있습니다. AWS Glue에서 블루프린트를 테스트하려면 등록이 필요합니다. IAM 권한 부여를 사용하거나 별도의 테스트 계정을 사용하여 등록된 블루프린트를 볼 수 있는 사람을 제한할 수 있습니다.

**또한 다음 섹션도 참조하세요.**  
[AWS Glue의 블루프린트 등록](registering-blueprints.md)

# AWS Glue 블루프린트 클래스 참조
<a name="developing-blueprints-code-classes"></a>

AWS Glue 블루프린트용 라이브러리는 워크플로 레이아웃 스크립트에서 사용하는 세 가지 클래스인 `Job`, `Crawler` 및 `Workflow`를 정의합니다.

**Topics**
+ [작업 클래스](#developing-blueprints-code-jobclass)
+ [크롤러 클래스](#developing-blueprints-code-crawlerclass)
+ [워크플로 클래스](#developing-blueprints-code-workflowclass)
+ [클래스 메서드](#developing-blueprints-code-methods)

## 작업 클래스
<a name="developing-blueprints-code-jobclass"></a>

`Job` 클래스는 AWS Glue ETL 작업을 나타냅니다.

**필수 생성자 인수**  
다음은 `Job` 클래스에 대한 필수 생성자 인수입니다.


| 인수 이름 | Type | 설명 | 
| --- | --- | --- | 
| Name | str | 작업에 할당할 이름입니다. AWS Glue는 작업을 다른 블루프린트 실행에서 생성된 작업과 구별하기 위해 이름에 임의로 생성된 접미사를 추가합니다. | 
| Role | str | 실행 중 작업이 수임해야 하는 역할의 Amazon 리소스 이름(ARN)입니다. | 
| Command | dict | API 문서의 [JobCommand 구조](aws-glue-api-jobs-job.md#aws-glue-api-jobs-job-JobCommand)에 지정된 작업 명령. | 

**선택적 생성자 인수**  
다음은 `Job` 클래스에 대한 선택적 생성자 인수입니다.


| 인수 이름 | Type | 설명 | 
| --- | --- | --- | 
| DependsOn | dict | 작업이 종속된 워크플로 엔터티의 목록입니다. 자세한 내용은 [DependsOn 인수 사용](developing-blueprints-code-layout.md#developing-blueprints-code-layout-depends-on) 섹션을 참조하세요. | 
| WaitForDependencies | str | 작업이 종속된 모든 엔터티가 실행되기 전에 완료될 때까지 기다릴지 아니면 하나라도 완료될 때까지 기다릴지 나타냅니다. 자세한 내용은 [WaitForDependencies 인수 사용](developing-blueprints-code-layout.md#developing-blueprints-code-layout-wait-for-dependencies) 섹션을 참조하세요. 작업이 하나의 엔티티에만 종속되는 경우 생략합니다. | 
| (작업 속성) | - | AWS Glue API 설명서의 [작업 구조](aws-glue-api-jobs-job.md#aws-glue-api-jobs-job-Job)에 나열된 모든 작업 속성(CreatedOn 및 LastModifiedOn 제외)입니다. | 

## 크롤러 클래스
<a name="developing-blueprints-code-crawlerclass"></a>

`Crawler` 클래스는 AWS Glue 크롤러를 나타냅니다.

**필수 생성자 인수**  
다음은 `Crawler` 클래스에 대한 필수 생성자 인수입니다.


| 인수 이름 | Type | 설명 | 
| --- | --- | --- | 
| Name | str | 크롤러에 할당할 이름입니다. AWS Glue는 크롤러를 다른 블루프린트 실행에서 생성된 크롤러와 구별하기 위해 이름에 임의로 생성된 접미사를 추가합니다. | 
| Role | str | 크롤러가 실행 중 수임해야 하는 역할의 ARN입니다. | 
| Targets | dict | 크롤링할 대상 컬렉션입니다. Targets 클래스 생성자 인수는 API 문서의 [CrawlerTargets 구조](aws-glue-api-crawler-crawling.md#aws-glue-api-crawler-crawling-CrawlerTargets)에 정의되어 있습니다. 모두 Targets 생성자 인수는 선택 사항이지만 적어도 하나는 전달해야합니다. | 

**선택적 생성자 인수**  
다음은 `Crawler` 클래스에 대한 선택적 생성자 인수입니다.


| 인수 이름 | Type | 설명 | 
| --- | --- | --- | 
| DependsOn | dict | 크롤러가 종속된 워크플로 엔터티의 목록입니다. 자세한 내용은 [DependsOn 인수 사용](developing-blueprints-code-layout.md#developing-blueprints-code-layout-depends-on) 섹션을 참조하세요. | 
| WaitForDependencies | str | 크롤러가 종속된 모든 엔터티가 실행되기 전에 완료될 때까지 기다릴지 아니면 하나라도 완료될 때까지 기다릴지 나타냅니다. 자세한 내용은 [WaitForDependencies 인수 사용](developing-blueprints-code-layout.md#developing-blueprints-code-layout-wait-for-dependencies) 섹션을 참조하세요. 크롤러가 하나의 엔티티에만 종속된 경우에는 생략합니다. | 
| (크롤러 속성) | - | 다음 예외사항과 함께 AWS Glue API 설명서의 [크롤러 구조](aws-glue-api-crawler-crawling.md#aws-glue-api-crawler-crawling-Crawler)에 나열된 모든 크롤러 속성:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/developing-blueprints-code-classes.html) | 

## 워크플로 클래스
<a name="developing-blueprints-code-workflowclass"></a>

`Workflow` 클래스는 AWS Glue 워크플로를 나타냅니다. 워크플로 레이아웃 스크립트는 `Workflow` 객체를 반환합니다. AWS Glue에서는 이 객체를 기반으로 하여 워크플로를 생성합니다.

**필수 생성자 인수**  
다음은 `Workflow` 클래스에 대한 필수 생성자 인수입니다.


| 인수 이름 | Type | 설명 | 
| --- | --- | --- | 
| Name | str | 워크플로에 할당할 이름입니다. | 
| Entities | Entities | 워크플로에 포함할 엔터티 (작업 및 크롤러)의 컬렉션입니다. Entities 클래스 생성자는 Crawler 객체의 목록인 Crawlers 인수와 Job 객체의 목록인 Jobs 인수를 허용합니다. | 

**선택적 생성자 인수**  
다음은 `Workflow` 클래스에 대한 선택적 생성자 인수입니다.


| 인수 이름 | Type | 설명 | 
| --- | --- | --- | 
| Description | str | [워크플루 구조](aws-glue-api-workflow.md#aws-glue-api-workflow-Workflow)을(를) 참조하세요. | 
| DefaultRunProperties | dict | [워크플루 구조](aws-glue-api-workflow.md#aws-glue-api-workflow-Workflow)을(를) 참조하세요. | 
| OnSchedule | str | cron 표현식입니다. | 

## 클래스 메서드
<a name="developing-blueprints-code-methods"></a>

세 클래스 모두 다음 메서드를 포함합니다.

**validate()**  
객체의 속성을 검증하고 오류가 발견되면 메시지를 출력하고 종료합니다. 오류가 없으면 출력을 생성하지 않습니다. `Workflow` 클래스의 경우 워크플로의 모든 엔터티에서 자신을 호출합니다.

**to\$1json()**  
객체를 JSON으로 직렬화합니다. 또한 `validate()`를 호출합니다. `Workflow` 클래스의 경우 JSON 객체에는 작업 및 크롤러 목록과 작업 및 크롤러 종속성 사양에 의해 생성된 트리거 목록이 포함됩니다.

# 블루프린트 샘플
<a name="developing-blueprints-samples"></a>

[AWS Glue 블루프린트 Github 리포지토리](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/samples)에서 사용할 수 있는 샘플 블루프린트 프로젝트가 많이 있습니다. 이 샘플은 참조용이며 프로덕션 용도로 사용되지 않습니다.

샘플 프로젝트의 제목은 다음과 같습니다.
+ 압축: 이 블루프린트는 원하는 파일 크기에 따라 입력 파일을 더 큰 청크로 압축하는 작업을 생성합니다.
+ 변환: 이 블루프린트은 다양한 표준 파일 포맷의 입력 파일을 분석 워크로드에 최적화된 Apache Parkore 포맷으로 변환합니다.
+ Amazon S3 위치 크롤링: 이 블루프린트는 여러 Amazon S3 위치를 크롤링하여 Data Catalog에 메타데이터 테이블을 추가합니다.
+ Data Catalog에 대한 사용자 지정 연결: 이 블루프린트는 AWS Glue 사용자 지정 커넥터를 사용하여 데이터 스토어에 액세스하고, 레코드를 읽고, 레코드 스키마를 기준으로 AWS Glue Data Catalog에 테이블 정의를 채웁니다.
+ 인코딩: 이 블루프린트은 UTF가 아닌 파일을 UTF로 인코딩된 파일로 변환합니다.
+ 분할: 이 블루프린트는 특정 파티션 키를 기반으로 출력 파일을 파티션에 배치하는 분할 작업을 생성합니다.
+ Amazon S3 데이터를 DynamoDB 테이블로 가져오기: 이 블루프린트는 Amazon S3에서 DynamoDB 테이블로 데이터를 가져옵니다.
+ 관리 대상 표준 테이블: 이 블루프린트는 AWS Glue Data Catalog 테이블을 Lake Formation 테이블로 가져옵니다.

# AWS Glue의 블루프린트 등록
<a name="registering-blueprints"></a>

AWS Glue 개발자가 블루프린트를 코딩하고 ZIP 아카이브를 Amazon Simple Storage Service(Amazon S3)에 업로드한 후 AWS Glue 관리자가 블루프린트를 등록해야 합니다. 블루프린트를 등록하면 사용할 수 있습니다.

블루프린트를 등록하면 AWS Glue는 블루프린트 아카이브를 예약된 Amazon S3 위치에 복사합니다. 그런 다음 업로드 위치에서 아카이브를 삭제할 수 있습니다.

블루프린트를 등록하려면 업로드된 아카이브가 포함된 Amazon S3 위치에 대한 읽기 권한이 필요합니다. AWS Identity and Access Management(IAM) 권한 `glue:CreateBlueprint`도 필요합니다. 블루프린트를 등록하고, 보고, 유지 관리해야 하는 AWS Glue 관리자에 대해 제안된 권한은 [블루프린트에 대한 AWS Glue 관리자 권한](blueprints-personas-permissions.md#bp-persona-admin) 섹션을 참조하세요.

AWS Glue 콘솔, AWS Glue API 또는 AWS Command Line Interface(AWS CLI)를 사용하여 블루프린트를 등록할 수 있습니다.

**블루프린트를 등록하려면(콘솔)**

1. Amazon S3의 블루프린트 ZIP 아카이브에 대한 읽기 권한(`s3:GetObject`)이 있는지 확인합니다.

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

   블루프린트를 등록할 권한이 있는 사용자로 로그인합니다. 블루프린트 ZIP 아카이브가 포함된 Amazon S3 버킷과 동일한 AWS 리전으로 전환합니다.

1. 탐색 창에서 **블루프린트(Blueprints)**를 선택합니다. 그런 다음 **블루프린트** 페이지에서 **블루프린트 추가(Add blueprint)**를 선택합니다.

1. 블루프린트 이름과 선택적 설명을 입력합니다.

1. [**ZIP 아카이브 위치(S3)(ZIP archive location (S3))**]에 업로드된 블루프린트 ZIP 아카이브의 Amazon S3 경로를 입력합니다. 경로에 아카이브 파일 이름을 포함하고 경로를 `s3://`로 시작합니다.

1. (선택 사항) 태그를 하나 이상 추가합니다.

1. [**블루프린트 추가(Add blueprint)**]를 선택합니다.

   **블루프린트** 페이지가 반환되고 블루프린트 상태가 `CREATING`임을 표시합니다. 상태가 `ACTIVE` 또는 `FAILED`로 변경될 때까지 새로 고침 버튼을 선택합니다.

1. 상태가 `FAILED`인 경우 블루프린트를 선택하고 [**작업(Actions)**] 메뉴에서 [**보기(View)**]를 선택합니다.

   세부 정보 페이지에 실패 이유가 표시됩니다. 오류 메시지가 “위치의 객체에 액세스할 수 없습니다...(Unable to access object at location...)” 또는 “위치의 객체에 대한 액세스가 거부되었습니다...(Access denied on object at location...)”인 경우 다음 요구 사항을 검토합니다.
   + 로그인한 사용자는 Amazon S3의 블루프린트 ZIP 아카이브에 대한 읽기 권한이 있어야 합니다.
   + ZIP 아카이브가 포함된 Amazon S3 버킷에는 AWS 계정 ID에 객체에 대한 읽기 권한을 부여하는 버킷 정책이 있어야 합니다. 자세한 내용은 [AWS Glue에서 블루프린트 개발](developing-blueprints.md) 섹션을 참조하세요.
   + 사용 중인 Amazon S3 버킷은 콘솔에서 로그인한 리전과 동일한 리전에 있어야 합니다.

1. 데이터 분석가에게 블루프린트에 대한 권한이 있는지 확인합니다.

   데이터 분석가를 위한 제안된 IAM 정책은 [블루프린트에 대한 데이터 분석가 권한](blueprints-personas-permissions.md#bp-persona-analyst)에 나와 있습니다. 이 정책은 모든 리소스에 `glue:GetBlueprint`를 부여합니다. 정책이 리소스 수준에서 보다 세분화된 경우 데이터 분석가에게 이 새로 생성된 리소스에 대한 권한을 부여합니다.

**블루프린트를 등록하려면(AWS CLI)**

1. 다음 명령을 입력합니다.

   ```
   aws glue create-blueprint --name <blueprint-name> [--description <description>] --blueprint-location s3://<s3-path>/<archive-filename>
   ```

1. 다음 명령을 입력하여 블루프린트 상태를 확인합니다. 상태가 `ACTIVE` 또는 `FAILED`가 될 때까지 명령을 반복합니다.

   ```
   aws glue get-blueprint --name <blueprint-name>
   ```

   상태가 `FAILED`이고 오류 메시지가 “위치의 객체에 액세스할 수 없습니다...(Unable to access object at location...)” 또는 “위치의 객체에 대한 액세스가 거부되었습니다...(Access denied on object at location...)”인 경우 다음 요구 사항을 검토합니다.
   + 로그인한 사용자는 Amazon S3의 블루프린트 ZIP 아카이브에 대한 읽기 권한이 있어야 합니다.
   + ZIP 아카이브가 포함된 Amazon S3 버킷에는 AWS 계정 ID에 객체에 대한 읽기 권한을 부여하는 버킷 정책이 있어야 합니다. 자세한 내용은 [블루프린트 게시](developing-blueprints-publishing.md) 섹션을 참조하세요.
   + 사용 중인 Amazon S3 버킷은 콘솔에서 로그인한 리전과 동일한 리전에 있어야 합니다.

**다음 사항도 참조하세요.**  
[AWS Glue의 블루프린트 개요](blueprints-overview.md)

# AWS Glue에서 블루프린트 보기
<a name="viewing_blueprints"></a>

블루프린트를 보고 블루프린트 설명, 상태 및 파라미터 사양을 검토하고 블루프린트 ZIP 아카이브를 다운로드합니다.

AWS Glue 콘솔, AWS Glue API 또는 AWS Command Line Interface(AWS CLI)를 사용하여 블루프린트를 볼 수 있습니다.

**블루프린트를 보려면(콘솔)**

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창에서 **블루프린트(Blueprints)**를 선택합니다.

1. **블루프린트** 페이지에서 블루프린트를 선택합니다. [**작업(Actions)**] 메뉴에서 [**보기(View)**]을 선택합니다.

**블루프린트를 보려면(AWS CLI)**
+ 블루프린트 이름, 설명 및 상태만 보려면 다음 명령을 입력합니다. *<blueprint-name>*을 보려는 블루프린트의 이름으로 바꿉니다.

  ```
  aws glue get-blueprint --name <blueprint-name>
  ```

  명령 출력은 다음과 같습니다.

  ```
  {
      "Blueprint": {
          "Name": "myDemoBP",
          "CreatedOn": 1587414516.92,
          "LastModifiedOn": 1587428838.671,
          "BlueprintLocation": "s3://amzn-s3-demo-bucket1/demo/DemoBlueprintProject.zip",
          "Status": "ACTIVE"
      }
  }
  ```

  파라미터 사양도 보려면 다음 명령을 입력합니다.

  ```
  aws glue get-blueprint --name <blueprint-name>  --include-parameter-spec
  ```

  명령 출력은 다음과 같습니다.

  ```
  {
      "Blueprint": {
          "Name": "myDemoBP",
          "CreatedOn": 1587414516.92,
          "LastModifiedOn": 1587428838.671,
          "ParameterSpec": "{\"WorkflowName\":{\"type\":\"String\",\"collection\":false,\"description\":null,\"defaultValue\":null,\"allowedValues\":null},\"PassRole\":{\"type\":\"String\",\"collection\":false,\"description\":null,\"defaultValue\":null,\"allowedValues\":null},\"DynamoDBTableName\":{\"type\":\"String\",\"collection\":false,\"description\":null,\"defaultValue\":null,\"allowedValues\":null},\"ScriptLocation\":{\"type\":\"String\",\"collection\":false,\"description\":null,\"defaultValue\":null,\"allowedValues\":null}}",
          "BlueprintLocation": "s3://awsexamplebucket1/demo/DemoBlueprintProject.zip",
          "Status": "ACTIVE"
      }
  }
  ```

  `--include-blueprint` 인수를 추가하여 AWS Glue가 저장한 블루프린트 ZIP 아카이브를 다운로드하기 위해 브라우저에 붙여넣을 수 있는 URL을 출력에 포함합니다.

**다음 사항도 참조하세요.**  
[AWS Glue의 블루프린트 개요](blueprints-overview.md)

# AWS Glue에서 블루프린트 업데이트
<a name="updating_blueprints"></a>

수정된 레이아웃 스크립트, 수정된 블루프린트 파라미터 집합 또는 수정된 지원 파일이 있는 경우 블루프린트를 업데이트할 수 있습니다. 블루프린트를 업데이트하면 새 버전이 생성됩니다.

블루프린트를 업데이트해도 블루프린트에서 생성된 기존 워크플로에는 영향이 없습니다.

AWS Glue 콘솔, AWS Glue API 또는 AWS Command Line Interface(AWS CLI)를 사용하여 블루프린트를 업데이트할 수 있습니다.

다음 절차에서는 AWS Glue 개발자가 업데이트된 블루프린트 ZIP 아카이브를 생성하여 Amazon S3에 업로드했다고 가정합니다.

**블루프린트를 업데이트하려면(콘솔)**

1. Amazon S3의 블루프린트 ZIP 아카이브에 대한 읽기 권한(`s3:GetObject`)이 있는지 확인합니다.

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

   블루프린트를 업데이트할 권한이 있는 사용자로 로그인합니다. 블루프린트 ZIP 아카이브가 포함된 Amazon S3 버킷과 동일한 AWS 리전으로 전환합니다.

1. 탐색 창에서 **블루프린트(Blueprints)**를 선택합니다.

1. **블루프린트** 페이지에서 블루프린트를 선택하고 **작업(Actions)** 메뉴에서 **편집(Edit)**을 선택합니다.

1. [**블루프린터 편집(Edit a blueprint)**] 페이지에서 블루프린트 [**설명(Description)**] 또는 [**ZIP 아카이브 위치(S3)(ZIP archive location (S3))**]를 업데이트합니다. 경로에 아카이브 파일 이름을 포함해야 합니다.

1. **저장**을 선택합니다.

   **블루프린트** 페이지가 반환되고 블루프린트 상태가 `UPDATING`임을 표시합니다. 상태가 `ACTIVE` 또는 `FAILED`로 변경될 때까지 새로 고침 버튼을 선택합니다.

1. 상태가 `FAILED`인 경우 블루프린트를 선택하고 [**작업(Actions)**] 메뉴에서 [**보기(View)**]를 선택합니다.

   세부 정보 페이지에 실패 이유가 표시됩니다. 오류 메시지가 “위치의 객체에 액세스할 수 없습니다...(Unable to access object at location...)” 또는 “위치의 객체에 대한 액세스가 거부되었습니다...(Access denied on object at location...)”인 경우 다음 요구 사항을 검토합니다.
   + 로그인한 사용자는 Amazon S3의 블루프린트 ZIP 아카이브에 대한 읽기 권한이 있어야 합니다.
   + ZIP 아카이브가 포함된 Amazon S3 버킷에는 AWS 계정 ID에 객체에 대한 읽기 권한을 부여하는 버킷 정책이 있어야 합니다. 자세한 내용은 [블루프린트 게시](developing-blueprints-publishing.md) 섹션을 참조하세요.
   + 사용 중인 Amazon S3 버킷은 콘솔에서 로그인한 리전과 동일한 리전에 있어야 합니다.
**참고**  
업데이트가 실패하면 성공적으로 등록되거나 업데이트된 블루프린트의 최신 버전이 다음 블루프린트 실행에 사용됩니다.

**블루프린트를 업데이트하려면(AWS CLI)**

1. 다음 명령을 입력합니다.

   ```
   aws glue update-blueprint --name <blueprint-name> [--description <description>] --blueprint-location s3://<s3-path>/<archive-filename>
   ```

1. 다음 명령을 입력하여 블루프린트 상태를 확인합니다. 상태가 `ACTIVE` 또는 `FAILED`가 될 때까지 명령을 반복합니다.

   ```
   aws glue get-blueprint --name <blueprint-name>
   ```

   상태가 `FAILED`이고 오류 메시지가 “위치의 객체에 액세스할 수 없습니다...(Unable to access object at location...)” 또는 “위치의 객체에 대한 액세스가 거부되었습니다...(Access denied on object at location...)”인 경우 다음 요구 사항을 검토합니다.
   + 로그인한 사용자는 Amazon S3의 블루프린트 ZIP 아카이브에 대한 읽기 권한이 있어야 합니다.
   + ZIP 아카이브가 포함된 Amazon S3 버킷에는 AWS 계정 ID에 객체에 대한 읽기 권한을 부여하는 버킷 정책이 있어야 합니다. 자세한 내용은 [블루프린트 게시](developing-blueprints-publishing.md) 섹션을 참조하세요.
   + 사용 중인 Amazon S3 버킷은 콘솔에서 로그인한 리전과 동일한 리전에 있어야 합니다.

**다음 사항도 참조하세요.**  
[AWS Glue의 블루프린트 개요](blueprints-overview.md)

# AWS Glue의 블루프린트에서 워크플로 생성
<a name="creating_workflow_blueprint"></a>

AWS Glue 워크플로를 수동으로 생성하여 한 번에 하나의 구성 요소를 추가하거나 AWS Glue [블루프린트](blueprints-overview.md)에서 워크플로를 생성할 수 있습니다. AWS Glue에는 일반적인 사용 사례에 대한 블루프린트가 포함되어 있습니다. AWS Glue 개발자가 추가 블루프린트를 생성할 수 있습니다.

**중요**  
워크플로 내 작업, 크롤러, 트리거의 총수를 100개 이하로 제한합니다. 100개가 넘게 포함될 경우 워크플로 실행을 재개하거나 중지하려고 할 때 오류가 발생할 수 있습니다.

블루프린트를 사용하면 블루프린트에서 정의한 일반화된 사용 사례를 기반으로 특정 사용 사례에 대한 워크플로를 빠르게 생성할 수 있습니다. 블루프린트 파라미터에 대한 값을 제공하여 특정 사용 사례를 정의합니다. 예를 들어 데이터 집합을 분할하는 블루프린트에는 Amazon S3 소스 및 대상 경로가 파라미터로 포함될 수 있습니다.

AWS Glue는 블루프린트를 *실행*하여 블루프린트에서 워크플로를 생성합니다. 블루프린트 실행은 제공한 파라미터 값을 저장하고 워크플로 및 해당 구성 요소 생성의 진행률과 결과를 추적하는 데 사용됩니다. 워크플로 문제를 해결할 때 블루프린트 실행을 보고 워크플로 생성에 사용된 블루프린트 파라미터 값을 확인할 수 있습니다.

워크플로를 생성하고 보려면 특정 IAM 권한이 필요합니다. 제안된 IAM 정책은 [블루프린트에 대한 데이터 분석가 권한](blueprints-personas-permissions.md#bp-persona-analyst) 섹션을 참조하세요.

AWS Glue 콘솔, AWS Glue API 또는 AWS Command Line Interface(AWS CLI)를 사용하여 블루프린트에서 워크플로를 생성할 수 있습니다.

**블루프린트에서 워크플로를 생성하려면(콘솔)**

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

   워크플로를 생성할 권한이 있는 사용자로 로그인합니다.

1. 탐색 창에서 **블루프린트(Blueprints)**를 선택합니다.

1. 블루프린트를 선택하고 [**작업(Actions)**] 메뉴에서 [**워크플로 생성(Create workflow)**]을 선택합니다.

1. [**<blueprint-name>에서 워크플로 생성(Create a workflow from <blueprint-name>)**] 페이지에서 다음 정보를 입력합니다.  
**블루프린트 파라미터**  
블루프린트 파라미터는 블루프린트 설계에 따라 다릅니다. 파라미터에 대한 질문은 개발자에게 문의하세요. 블루프린트에는 일반적으로 워크플로 이름에 대한 파라미터가 포함됩니다.  
**IAM 역할**  
AWS Glue가 워크플로 및 해당 구성 요소를 생성하기 위해 맡는 역할입니다. 역할에는 워크플로, 작업, 크롤러 및 트리거를 생성하고 삭제할 수 있는 권한이 있어야 합니다. 역할에 제안되는 정책은 [블루프린트 역할에 대한 권한](blueprints-personas-permissions.md#blueprints-role-permissions) 섹션을 참조하세요.

1. **제출**을 선택합니다.

   [**블루프린트 세부 정보(Blueprint Details)**] 페이지가 나타나고 아래쪽에 블루프린트 실행 목록이 표시됩니다.

1. 블루프린트 실행 목록의 최상위 블루프린트 실행에서 워크플로 생성 상태를 확인합니다.

   초기 상태는 `RUNNING`입니다. 상태가 `SUCCEEDED` 또는 `FAILED`로 바뀔 때까지 새로 고침 버튼을 선택합니다.

1. 다음 중 하나를 수행하세요.
   + 완료 상태가 `SUCCEEDED`이면 [**워크플로(Workflows)**] 페이지로 이동하여 새로 생성된 워크플로를 선택하여 실행할 수 있습니다. 워크플로를 실행하기 전에 설계 그래프를 검토할 수 있습니다.
   + 완료 상태가 `FAILED`인 경우 블루프린트를 선택하고 [**작업(Actions)**] 메뉴에서 [**보기(View)**]를 선택하여 오류 메시지를 봅니다.

워크플로와 블루프린트에 대한 자세한 내용은 다음 주제를 참조하세요.
+ [AWS Glue의 워크플로 개요](workflows_overview.md)
+ [AWS Glue에서 블루프린트 업데이트](updating_blueprints.md)
+ [AWS Glue에서 워크플로 수동 생성 및 구축](creating_running_workflows.md)

# AWS Glue에서 블루프린트 실행 보기
<a name="viewing_blueprint_runs"></a>

블루프린트 실행을 보고 다음 정보를 확인합니다.
+ 생성된 워크플로의 이름입니다.
+ 워크플로를 생성하는 데 사용된 블루프린트 파라미터 값입니다.
+ 워크플로 생성 작업의 상태입니다.

AWS Glue 콘솔, AWS Glue API 또는 AWS Command Line Interface(AWS CLI)를 사용하여 블루프린트 실행을 볼 수 있습니다.

**블루프린트 실행을 보려면(콘솔)**

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창에서 **블루프린트(Blueprints)**를 선택합니다.

1. **블루프린트** 페이지에서 블루프린트를 선택합니다. [**작업(Actions)**] 메뉴에서 [**보기(View)**]을 선택합니다.

1. [**블루프린트 세부 정보(Blueprint Details)**] 페이지 하단에서 블루프린트 실행을 선택하고 [**작업(Actions)**] 메뉴에서 [**보기(View)**]를 선택합니다.

**블루프린트 실행을 보려면(AWS CLI)**
+ 다음 명령을 입력합니다. *<blueprint-name>*을 블루프린트의 이름으로 바꿉니다. *<blueprint-run-id>*를 블루프린트 실행 ID로 바꿉니다.

  ```
  aws glue get-blueprint-run --blueprint-name <blueprint-name> --run-id <blueprint-run-id>
  ```

**다음 사항도 참조하세요.**  
[AWS Glue의 블루프린트 개요](blueprints-overview.md)