

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 對 AWS Glue 中的藍圖錯誤進行故障診斷
<a name="blueprint_workflow_troubleshoot"></a>

如果在使用 AWS Glue 藍圖時遇到錯誤，請使用下列解決方案，以協助您找到問題來源並修復問題。

**Topics**
+ [錯誤：缺少 PySpark 模組](#blueprint-workflow-error-1)
+ [錯誤：缺少藍圖組態檔](#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 傳回錯誤「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 檔案 *compaction.zip* 中。

允許使用上述任一格式建立檔案。但是，請確認 `blueprint.cfg` 具有產生配置的指令碼中函數名稱的正確路徑。

**範例**  
在案例 1：`blueprint.cfg` 應該具備 `layoutGenerator`，如下所示：

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

在案例 2：`blueprint.cfg` 應該具備 `layoutGenerator`，如下所示

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

如果未正確包含此路徑，您可能會看到指示的錯誤。例如，如果您具備案例 2 中所述的資料夾結構，而您的 `layoutGenerator` 表示為案例 1，則會看到上述錯誤。

## 錯誤：缺少藍圖組態檔
<a name="blueprint-workflow-error-2"></a>

AWS Glue 傳回錯誤「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 傳回錯誤「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 傳回錯誤「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 傳回錯誤「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 傳回錯誤「Trigger with name 'foo\$1starting\$1trigger' already submitted with different configuration」。

藍圖不需要您在配置指令碼中定義觸發以建立工作流程。藍圖程式庫會根據兩個動作之間定義的相依性來管理觸發建立。

觸發的命名如下：
+ 對於工作流程中的啟動觸發，命名為 <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 傳回錯誤「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 傳回錯誤「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 藍圖類別參考](https://docs.aws.amazon.com/glue/latest/dg/developing-blueprints-code-classes.html)中的語法，以在配置指令碼中定義 AWS Glue 任務、爬蟲程式和工作流程。