

# 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] 해당 파일 또는 디렉터리 없음: \* \*'demo-project/foo.py'(Unknown error executing layout generator function FileNotFoundError: [Errno 2] No such file or directory: \* \*'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 \* \* \* \*)이 잘못되었습니다.(The schedule cron(0 0 \* \* \* \*) 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\_name>\_starting\_trigger입니다.
+ 하나 또는 여러 업스트림 노드의 완료에 종속되는 워크플로의 노드(작업/크롤러)의 경우. AWS Glue는 이름이 <workflow\_name>\_<node\_name>\_trigger인 트리거를 정의합니다.

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

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

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

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

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

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

```
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'> 유형이어야 함\!(Unknown error executing layout generator function TypeError: Value ['foo'] for key Connections should be of type <class 'dict'>\!)"라는 오류가 발생했습니다.

검증 오류입니다. `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)의 구문을 참조하세요.