

# 블루프린트 코드 작성
<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>) 페이지에서 역할 선택기를 생성합니다. | 