

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

# 中的協調 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 中，您可以建立稱為觸發的資料目錄物件，用來手動或自動啟動一或多個爬蟲程式，或是擷取、轉換和載入 (ETL) 任務。使用觸發，您可以設計相依任務和爬蟲程式的鏈結。

**注意**  
您可以透過定義「工作流程」**來完成相同的事情。工作流程較適用於建立複雜得多任務 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>

當「引發」**時，觸發可以啟動指定的任務和爬蟲程式。觸發可以視需要、根據排程，或是根據事件組合來引發。

**注意**  
單一觸發只能啟動兩個爬蟲程式。如果您要編目多個資料存放區，請為每個爬蟲程式使用多個來源，而不要同時執行多個爬蟲程式。

觸發可以處於數種狀態中的其中一種。觸發可以是 `CREATED`、`ACTIVATED` 或 `DEACTIVATED`。其中也有轉換狀態，例如 `ACTIVATING`。如要停止引發觸發，您可以停用觸發。您稍後可以重新啟用。

觸發有三種類型：

**已排程**  
以 `cron` 為基礎的時間類型觸發。  
您可以根據排程建立一組任務或是爬蟲程式的觸發。您可以指定限制條件，例如任務或爬蟲程式的執行頻率、在一週中的哪一天執行，以及執行的時間。這些限制條件是以 `cron` 為基礎。當您正在設定觸發的排程時，請考慮 cron 的功能和限制。例如，如果您選擇在每個月的 31 日執行您的爬蟲程式，請注意有些月份不到 31 天。如需 Cron 的詳細資訊，請參閱 [任務和爬蟲程式以時間為基礎的排程](monitor-data-warehouse-schedule.md)。

**有條件**  
在上一個任務或爬蟲程式，或是多個任務或多個爬蟲程式滿足條件清單後引發的觸發。  
 當您建立條件式觸發時，您可以指定要監看的任務清單和爬蟲程式清單。針對每個監看的任務或爬蟲程式，您可以指定要監看的狀態，例如成功、失敗、逾時等。觸發會在監看的任務或爬蟲程式以指定狀態結束時引發。您可以設定觸發，使其在發生任何監看事件，或是所有監看事件都發生時引發。  
例如，您可以設定觸發 T1 在任務 J1 和任務 J2 成功完成時啟動任務 J3，以及另外一個觸發 T2 在任務 J1 或任務 J2 失敗時啟動任務 J4。  
下表列出觸發監看的任務和爬蟲程式完成狀態 (事件)。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/about-triggers.html)

**隨需**  
在您啟用時引發的觸發。隨需觸發永遠不會進入 `ACTIVATED` 或 `DEACTIVATED` 狀態。這些觸發一律會停留在 `CREATED` 狀態。

如此一來，這些觸發便會在存在時準備就緒以供引發；您可以在建立這些觸發時設定標記來啟用排程和條件式觸發。

**重要**  
因其他任務或爬蟲程式完成而執行的任務或爬蟲程式稱為「相依」**。相依任務或爬蟲程式只有在完成的任務或爬蟲程式是由觸發啟動時，才會啟動。相依鏈中所有的任務或爬蟲程式都必須是單一 **scheduled (排程)** 或 **on-demand (隨需)** 觸發的子代。

**使用觸發傳遞任務參數**  
觸發可以將參數傳遞至啟動的任務。參數包括任務引數、逾時值、安全組態等。如果觸發啟動多個任務，參數會傳遞至每個任務。

以下是由觸發所傳遞任務引數的規則：
+ 如果鍵/值對中的鍵與預設任務引數相符，則傳遞的引數會覆寫預設引數。如果鍵與預設引數不符，則引數會做為額外引數傳遞給任務。
+ 如果鍵/值對中的鍵與不可覆寫的引數相符，則會忽略傳遞的引數。

如需詳細資訊，請參閱 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 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue主控台。

1. 在導覽窗格的 **ETL** 下，選擇 **Triggers (觸發)**。然後請選擇 **Add trigger (新增觸發)**。

1. 提供下列屬性：  
**名稱**  
為您的觸發條件設定唯一的獨特名稱。  
**觸發條件類型**  
請指定下列其中一項：  
   + **Schedule: (排程：)** 觸發會以特定頻率和時間引發。
   + **Job events: (任務事件：)** 條件式觸發。觸發會在清單中的任何或所有任務與其指定的狀態相符時引發。若要引發觸發，監看的任務必須是由觸發所啟動。針對任何您選擇的任務，您只能監看一個任務事件 (完成狀態)。
   + **On-demand: (隨需：)** 觸發會在啟動時引發。

1. 完成觸發精靈。在 **Review (檢閱)** 頁面上，您可以啟用 **Schedule (排程)** 而 **Job events (任務事件)** (條件式) 會立即觸發，方法是選取 **Enable trigger on creation (在建立時啟用觸發)**。

**新增觸發 (AWS CLI)**
+ 輸入與以下相似的命令。

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

  這個命令會建立名為 `MyTrigger` 的排程觸發，在 UTC 時間每天下午 12:00 執行，並啟動名為 `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 表達式有六個必要欄位，以空格隔開。

**語法**

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


| **欄位** | **Values (數值)** | **萬用字元** | 
| --- | --- | --- | 
|  分鐘  |  0–59  |  , - \$1 /  | 
|  小時  |  0–23  |  , - \$1 /  | 
|  月中的日  |  1–31  |  , - \$1 ? / L W  | 
|  月  |  1-12 或 JAN-DEC  |  , - \$1 /  | 
|  週中的日  |  1-7 或 SUN-SAT  |  , - \$1 ? / L  | 
|  年  |  1970-2199  |  , - \$1 /  | 

**萬用字元**
+ **,** (逗號) 萬用字元包含額外的值。在 `Month` 欄位，`JAN,FEB,MAR` 包括 January (一月)、February (二月)、March (三月)。
+ **-** (破折號) 萬用字元用於指定範圍。在 `Day` 欄位中，1–15 包含指定月份的 1 至 15 號。
+ **\$1** (星號) 包含欄位中所有的值。在 `Hours` 欄位，**\$1** 包含每個小時。
+ **/** (斜線) 萬用字元用於指定增量。在 `Minutes` 欄位，您可以輸入 **1/10** 指定每 10 分鐘的間隔，從小時的第一分鐘開始 (例如第 11、第 21、第 31 分鐘)。
+ **?** (問號) 萬用字元用於表示不限定任何一個。在 `Day-of-month` 欄位，您可以輸入 **7**，如果您不在意這個月的 7 號是星期幾，就可以在 Day-of-week (週中的日) 欄位中輸入 **?**。
+ **L** 萬用字元在 `Day-of-month` 或 `Day-of-week` 欄位可指定月份或週的最後一天。
+ **W** 萬用字元在 `Day-of-month` 欄位可指定任務日。在 `Day-of-month` 欄位，`3W` 指定的是月份中最接近第三個任務日的日子。

**限制**
+ 您無法在同一個 cron 表達式中指定 `Day-of-month` 和 `Day-of-week` 欄位。如果您在其中一個欄位指定了數值，就必須在另一個欄位中使用 **?** (問號)​。
+ 不支援頻率多於 5 分鐘的 Cron 表達式。

**範例**  
建立排程時，您可以使用下列 cron 字串範例。


| 分鐘 | 小時 | 月中的日 | 月 | 週中的日 | 年 | 意義 | 
| --- | --- | --- | --- | --- | --- | --- | 
|  0  |  10  |  \$1  |  \$1  |  ?  |  \$1  |  在每天上午 10:00 (UTC) 執行  | 
|  15  |  12  |  \$1  |  \$1  |  ?  |  \$1  |  在每天下午 12:15 (UTC) 執行  | 
|  0  |  18  |  ?  |  \$1  |  MON-FRI  |  \$1  |  在每週一至週五下午 6:00 (UTC) 執行  | 
|  0  |  8  |  1  |  \$1  |  ?  |  \$1  |  在每個月第一天上午 8:00 (UTC) 執行  | 
|  0/15  |  \$1  |  \$1  |  \$1  |  ?  |  \$1  |  每 15 分鐘執行  | 
|  0/10  |  \$1  |  ?  |  \$1  |  MON-FRI  |  \$1  |  在週一至週五每 10 分鐘執行  | 
|  0/5  |  8-17  |  ?  |  \$1  |  MON-FRI  |  \$1  |  在週一至週五上午 8:00 至下午 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 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue主控台。

1. 在導覽窗格的 **ETL** 下，選擇 **Triggers (觸發)**。

1. 選取所需觸發旁邊的核取方塊，並在 **Action (動作)** 選單上，選擇 **Enable trigger (啟用觸發)** 來啟用觸發，或是選擇 **Disable trigger (停用觸發)** 來停用觸發。

**啟用或停用觸發 (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>

一些組織的複雜擷取、轉換和載入 (ETL) 程序最好使用多個相依 AWS Glue 任務和爬蟲程式來實作。使用 AWS Glue *工作流程*，您可以設計一個複雜的多任務、多爬蟲程式 ETL 程序，讓 AWS Glue 可以作為單一實體來執行和追蹤。建立工作流程並在工作流程中指定任務、爬蟲程式和觸發程序之後，您可以隨需或依排程執行工作流程。

**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 管理主控台 或 一次手動建置工作流程元件 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/zh_tw/glue/latest/dg/workflows_overview.html)

  `GetWorkflowRun` API 操作會傳回觸發工作流程的批次條件。

無論工作流程的啟動方式為何，您都可以在建立工作流程時指定並行工作流程執行的最大數目。

如果事件或事件批次啟動最終失敗的工作流程執行，則不再考慮該事件或事件批次來啟動工作流程執行。只有在下一個事件或事件批次到達時，才會啟動新的工作流程執行。

**重要**  
將工作流程中的任務、爬蟲程式和觸發程序總數限制在 100 或更少。如果包含超過 100 個，則嘗試繼續或停止工作流程執行時可能會出現錯誤。

如果工作流程執行會超過為工作流程設定的並行限制，即使符合事件條件，也不會啟動工作流程執行。建議您根據預期的事件量調整工作流程並行限制。AWS Glue 不會重試因超出並行限制而失敗的工作流程執行。同樣地，建議您根據預期的事件數量，在工作流程中調整任務和爬蟲程式的並行限制。

**工作流程執行屬性**  
若要共享和管理整個工作流程回合的狀態，您可以定義預設工作流程回合屬性。這些屬性都是名稱/值對，可供工作流程中的所有任務使用。使用 AWS Glue API，任務可以擷取工作流程執行屬性，並為稍後在工作流程中出現的任務修改它們。

**工作流程圖**  
下圖顯示 AWS Glue 主控台的基本工作流程圖形。您的工作流程可能擁有數十個元件。

![\[顯示工作流程 Graph (圖形) 標籤的主控台螢幕擷取畫面。此圖形包含代表排程觸發的 5 個圖示、2 項任務、一個事件成功觸發，以及更新結構描述的爬蟲程式。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/graph-complete-with-tabs.png)


此工作流程是由排程觸發 `Month-close1` 啟動，這會啟動兩項任務 `De-duplicate` 和 `Fix phone numbers`。成功完成這兩項任務時，事件觸發 `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 管理主控台 並在 https：//[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 (複製現有的項目)**，然後選擇要複製的觸發。接著選擇 **Add (新增)**。

     此觸發會和它監看的任務及爬蟲程式以及它啟動的任務及爬蟲程式一起出現在圖形中。

     如果不小心選了錯誤的觸發，請選取圖形中的觸發，然後選擇 **Remove (移除)**。
   + 選擇 **Add new (新增)**，然後完成 **Add trigger (新增觸發)** 表單。

     1. 對於 **Trigger type (觸發類型)**，選取 **Schedule (排程)**、**On demand (隨需)** 或 **EventBridge**。

        對於觸發類型 **Schedule (排程)**，選擇其中一個 **Frequency (頻率)** 選項。選擇 **Custom (自訂)** 輸入 `cron` 表達式。

        對於觸發類型 **EventBridge event (EventBridge 事件)**，輸入 **Number of events (事件數)** (批次大小)，並選擇性地輸入 **Time delay (時間延遲)** (批次時段)。如果您省略 **Time delay (時間延遲)**，批次時段預設為 15 分鐘。如需詳細資訊，請參閱[AWS Glue 中的工作流程概觀](workflows_overview.md)。

     1. 選擇**新增**。

     此觸發會和預留位置節點 (標記為 **Add node (新增節點)**) 一起出現在圖形中。在下列範例中，啟動觸發是名為 `Month-close1` 的排程觸發。

     此時，尚未儲存觸發。  
![\[圖形有兩個矩形節點：一項觸發和一個預留位置節點。箭頭會從觸發節點指向預留位置節點。\]](http://docs.aws.amazon.com/zh_tw/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 trigger (新增觸發)** 對話方塊中，執行下列其中一項操作：
   + 選擇 **Add new (新增)**，然後完成 **Add trigger (新增觸發)** 表單。接著選擇 **Add (新增)**。

     此觸發會出現在圖形中。您會在後續步驟中完成此觸發。
   + 選擇 **Clone existing (複製現有的項目)**，然後選擇要複製的觸發。接著選擇 **Add (新增)**。

     此觸發會和它監看的任務及爬蟲程式以及它啟動的任務及爬蟲程式一起出現在圖形中。

     如果您不小心選擇了錯誤的觸發，請在圖形中選取該觸發，然後選擇 **Remove (移除)**。

1. 如已新增新的觸發，請完成以下步驟：

   1. 選取新的觸發。

      當以下圖形出現時，會選取觸發 `De-dupe/fix succeeded`，且預留位置節點顯示為要監看的 (1) 事件和 (2) 動作。  
![\[圖形有許多節點，其中兩個是預留位置節點，稱為 1 號和 2 號。\]](http://docs.aws.amazon.com/zh_tw/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>

Amazon EventBridge 也稱為 CloudWatch Events，可讓您自動化 AWS 服務，並自動回應系統事件，例如應用程式可用性問題或資源變更。來自 AWS 服務的事件會以近乎即時的方式交付至 EventBridge。您可編寫簡單的規則，來指示您在意的事件，以及當事件符合規則時所要自動執行的動作。

透過 EventBridge 支援，AWS Glue 可以在事件驅動的架構中作為事件生產者和消費者。對於工作流程，AWS Glue 支援任何類型的 EventBridge 事件作為消費者。最常見的使用案例是 Amazon S3 儲存貯體中的新物件。如果您的資料以不規則或未定義的間隔送達，您可以儘可能接近其到達處理此資料。

**注意**  
AWS Glue 不提供 EventBridge 訊息的保證傳遞。如果 EventBridge 傳送重複的訊息，AWS Glue 不會執行重複資料刪除。您必須根據使用案例來管理冪等性。  
請務必正確設定 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 儲存貯體的名稱。
具有有效 AWS 帳戶 ID 的 *<account-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. 建立 EventBridge 服務在將事件傳遞至 AWS Glue 時可擔任的 IAM 角色。

   1. 在 IAM 主控台的 **Create role (建立角色)**頁面上，選擇**AWS Service (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 命令參考*中的 [create-workflow](https://docs.aws.amazon.com/cli/latest/reference/glue/create-workflow.html)。

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

1. 輸入下列命令為工作流程建立 EventBridge 事件觸發。這將是工作流程的啟動觸發。將 *<actions>* 替換成要執行的動作 (要啟動的任務和爬蟲程式)。

   請參閱 *AWS CLI 命令參考*中的 [create-trigger](https://docs.aws.amazon.com/cli/latest/reference/glue/create-trigger.html) 以取得如何編寫 `actions` 引數程式碼的詳細資訊。

   ```
   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**  

   下列範例會建立觸發，以在三個 EventBridge 事件到達後或第一個 EventBridge 事件到達後五分鐘 (以先到達者為準) 啟動 `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. 執行下列命令以建立 JSON 參數範本，您可以編輯該範本，以指定後續 `put-rule` 命令。將輸出儲存在檔案中。在此範例中，檔案稱為 `ruleCommand`。

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

      如需關於 `--generate-cli-skeleton` 參數的詳細資訊，請參閱《*AWS 命令行介面使用者指南*》中的[從 JSON 或 YAML 輸入檔案產生 AWS CLI Skeleton 及輸入參數](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. 輸入下列 `put-rule` 命令，該命令會從檔案 `ruleCommand` 中讀取輸入參數。

      ```
      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 管理主控台 並在 https：//[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 管理主控台 並在 https：//[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：//[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/zh_tw/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 來停止工作流程執行。當您停止工作流程執行時，所有執行中任務和爬蟲程式都會立即終止，尚未啟動的任務和爬蟲程式則永遠不會啟動。所有執行中任務和爬蟲程式可能需要一分鐘的時間才會停止。工作流程執行狀態會從 **Running (執行中)** 變成 **Stopping (停止中)**，而當工作流程執行完全停止時，狀態會變成 **Stopped (已停止)**。

在工作流程執行停止之後，您可以檢視執行圖形，查看哪些任務和爬蟲程式已完成，哪些從未啟動。然後，您可以判斷是否必須執行任何步驟以確保資料完整性。停止工作流程執行會導致系統不執行任何自動復原操作。

**停止工作流程執行 (主控台)**

1. 在 https：//[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>*，並用要停止之工作流程執行的執行 ID 取代 *<run-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/zh_tw/glue/latest/dg/images/workflow_W1.png)


工作流程執行會以下列方式繼續：

1. 觸發器 T1 啟動任務 J1。

1. 成功完成 J1 會引發觸發器 T2 和 T3，它們分別執行任務 J2 和 J3。

1. 任務 J2 和 J3 失敗。

1. 觸發器 T4 和 T5 取決於 J2 和 J3 的成功完成，因此它們不會觸發，並且任務 J4 和 J5 不會執行。工作流程 W1 只是部分執行。

現在假設導致 J2 和 J3 失敗的問題得到更正。會選取 J2 和 J3 作為繼續工作流程執行的起點。

![\[任務 J2 和 J3 被標記為要繼續的節點。下游觸發器和任務會顯示為成功執行。\]](http://docs.aws.amazon.com/zh_tw/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 (歷史記錄)] 索引標籤下的資料表包含兩列，每個工作流程執行各一列。第一列同時有執行 ID 和先前的執行 ID。第二列只有一個執行 ID。第一列中的上一個執行 ID 與第二列中的執行 ID 相同。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/previous-run-id.png)


**注意**  
在本討論的其餘部分，「已繼續的工作流程執行」一詞指的是先前工作流程執行繼續時所建立的工作流程執行。「原始工作流程執行」是指只有部分執行且需要繼續的工作流程執行。

**已繼續的工作流程執行圖**  
在已繼續的工作流程執行中，雖然只執行一部分節點，但執行圖是完整的圖形。也就是說，未在已繼續的工作流程中執行的節點會從原始工作流程執行的執行圖中複製。在原始工作流程執行中執行的複製任務和爬蟲程式節點包括執行詳細資訊。

再次考慮上圖中的工作流程 W1。從 J2 和 J3 開始繼續工作流程執行時，已繼續的工作流程執行的執行圖會顯示所有任務 (J1 至 J5)，以及所有觸發器 (T1 至 T5)。J1 的執行詳細資訊會從原始工作流程執行複製。

**工作流程執行快照**  
當工作流程執行啟動時，AWS Glue 會在該時間點拍攝工作流程設計圖的快照。此快照用於工作流程執行期間。如果您在執行開始後對任何觸發器進行變更，這些變更不會影響目前的工作流程執行。快照可確保工作流程以一致的方式繼續執行。

快照只會讓觸發器變成不可變。您在工作流程執行期間對下游任務和爬蟲程式所做的變更，會對目前的執行生效。

## 繼續工作流程執行
<a name="how-to-resume-workflow"></a>

請依照下列步驟繼續工作流程執行。您可以使用 AWS Glue主控台、API 或 AWS Command Line Interface () 來繼續工作流程執行AWS CLI。

**繼續工作流程執行 (主控台)**

1. 在 https：//[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 (繼續)** 核取方塊。  
![\[執行圖顯示三個節點，包括失敗的任務節點。右側的任務詳細資訊窗格包含 [Resume (繼續)] 核取方塊。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/workflow-pre-select-resume.png)

   節點會變更顏色，並在右上角顯示一個小的繼續圖示。  
![\[執行圖的變更會以文字描述。[Resume (繼續)] 核取方塊已選取。\]](http://docs.aws.amazon.com/zh_tw/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` 命令列出會重新啟動兩個節點，但範例輸出指出只有一個節點會重新啟動。這是因為一個節點位於另一個節點的下游，而下游節點仍會由工作流程的正常流程重新啟動。

## 繼續工作流程執行的注意事項與限制
<a name="resume-workflow-notes"></a>

繼續工作流程執行時，請記住下列注意事項和限制。
+ 只有當工作流程處於 `COMPLETED` 狀態時，您才能繼續工作流程執行。
**注意**  
即使工作流程執行中的一個或多個節點未完成，工作流程執行狀態也會顯示為 `COMPLETED`。請務必檢查執行圖以發現任何未成功完成的節點。
+ 您可以從原始工作流程執行嘗試執行的任何任務或爬蟲程式節點，繼續工作流程執行。您無法從觸發器節點繼續工作流程執行。
+ 重新啟動節點並不會重設其狀態。部分處理的任何資料都不會復原。
+ 您可以繼續多次執行失敗的工作流程。不過，繼續執行只能再繼續一次。對於其他重試，請改為繼續原始失敗的執行
+ 如果您選取兩個要重新啟動的節點，而且它們彼此相依，則上游節點會在下游節點之前執行。事實上，選取下游節點是多餘的，因為它會根據工作流程的正常流程來執行。

# 在 AWS Glue 中取得及設定工作流程執行屬性
<a name="workflow-run-properties-code"></a>

在您的 AWS Glue 工作流程中，使用工作流程回合屬性在任務中共享和管理狀態。您可以在建立工作流程時設定預設回合屬性。然後，當任務執行時，它們可以擷取回合屬性值並選擇性修改它們，供後續工作流程中的任務輸入使用。當任務修改回合屬性時，只有工作流程回合有新的值。預設的執行屬性不會受到影響。

如果您的 AWS Glue 任務不是工作流程的一部分，則不會設定這些屬性。

以下來自擷取、轉換和載入 (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>

考慮條件式觸發 T，它會在任務 J1 完成時觸發任務 J2。

```
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>

以下範例示範簡單的雙觸發工作流程。
+ 節點：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 物件。此物件的長度上限為 128 KB。
+ 藍圖 ZIP 封存的未壓縮大小上限為 5 MB。壓縮大小上限為 1 MB。
+ 將工作流程中的任務、爬蟲程式和觸發程序總數限制在 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)
+ [錯誤：缺少藍圖組態檔](#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 任務、爬蟲程式和工作流程。

# AWS Glue 藍圖的人物和角色許可
<a name="blueprints-personas-permissions"></a>

以下是藍圖中角色和角色的典型角色和建議 AWS Identity and Access Management (IAM) AWS Glue 許可政策。

**Topics**
+ [藍圖人物](#blueprints-personas)
+ [藍圖人物的許可](#blueprints-permssions)
+ [藍圖角色的許可](#blueprints-role-permissions)

## 藍圖人物
<a name="blueprints-personas"></a>

以下是通常參與 AWS Glue 藍圖生命週期的人物。


| 人物 | Description | 
| --- | --- | 
| 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>* 替換為 Amazon S3 路徑，以便上傳藍圖 ZIP 封存進行註冊。

------
#### [ 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>

**注意**  
Glue 主控台中的下列區域目前無法使用藍圖功能：亞太區域 （雅加達） AWS 和中東 （阿拉伯聯合大公國）。

AWS Glue 藍圖提供建立和共用 AWS Glue 工作流程的方法。當存在可用於類似使用案例的複雜 ETL 程序時，您可以建立單一藍圖，而不是為每個使用案例各建立一個 AWS Glue 工作流程。

藍圖會指定工作流程中要包含的任務和爬蟲程式，並指定工作流程使用者在執行藍圖以建立工作流程時提供的參數。使用參數可讓單一藍圖產生各種類似使用案例的工作流程。如需工作流程的相關詳細資訊，請參閱 [AWS Glue 中的工作流程概觀](workflows_overview.md)。

以下是藍圖的使用案例範例：
+ 您想要分割現有的資料集。藍圖的輸入參數是 Amazon Simple Storage Service (Amazon S3) 來源和目標路徑，以及分割區欄的清單。
+ 您想要將 Amazon DynamoDB 資料表快照到像 Amazon Redshift 這樣的 SQL 資料存放區。藍圖的輸入參數是 DynamoDB 資料表名稱和 AWS Glue 連線，用於指定 Amazon Redshift 叢集和目標資料庫。
+ 您想要將多個 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 指令碼複製到指定的位置，並將該位置指定為任務指令碼位置屬性。您也可以包含任何程式庫或其他支援檔案，前提是您的指令碼處理它們。

![\[標記為藍圖的框包含兩個較小的框，一個標記為 Python 指令碼和另一個標記為 Config 檔案。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/blueprint.png)


**藍圖執行**  
當您從藍圖建立工作流程時，AWS Glue 會執行藍圖，此藍圖會啟動非同步處理程序以建立工作流程，以及工作流程封裝的任務、爬蟲程式和觸發。AWS Glue 會使用藍圖執行來協調工作流程及其元件的建立。您可以透過檢視藍圖執行狀態來檢視建立程序的狀態。藍圖執行也會儲存您為藍圖參數提供的值。

![\[標示為藍圖執行的方塊包含標示為工作流程和參數值的圖示。\]](http://docs.aws.amazon.com/zh_tw/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/zh_tw/glue/latest/dg/blueprints-overview.html)  | 
| AWS Glue 管理員 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/blueprints-overview.html)  | 
| 資料分析 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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 Shell 的程式庫。

發佈藍圖之前，您可以使用藍圖程式庫中定義的方法在本機測試藍圖。

當您準備好將藍圖提供給資料分析師使用時，您可以將指令碼、參數組態檔以及任何支援的檔案 (例如其他指令碼和程式庫) 封裝成單一可部署的資產。然後，您將資產上傳到 Amazon S3，並要求管理員向 AWS Glue 註冊。

如需藍圖範例專案的相關資訊，請參閱[範例藍圖專案](developing-blueprints-sample.md)和[藍圖範例](developing-blueprints-samples.md)。

# 開發藍圖的先決條件
<a name="developing-blueprints-prereq"></a>

若想開發藍圖，您應先熟悉如何使用 AWS Glue 以及為 Apache Spark ETL 任務或 Python Shell 任務編寫指令碼。此外，您也必須完成下列設定任務。
+ 下載四個 AWS Python 程式庫以用於您的藍圖配置指令碼。
+ 設定 AWS SDKs。
+ 設定 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 開發套件
<a name="prereqs-java-preview-sdk"></a>

對於 AWS Java 開發套件，您必須新增包含藍圖 API `jar`的檔案。

1. 如果您尚未這麼做，請設定適用於 Java 的 AWS 開發套件。
   + 對於 Java 1.x，請按照*適用於 Java 的 AWS SDK 開發人員指南*中[設定 適用於 Java 的 AWS SDK](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-install.html)的指示進行。
   + 對於 Java 2.x，請按照*AWS SDK for Java 2.x 開發人員指南*中[設定 AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup.html)的指示進行。

1. 下載用戶端 `jar` 檔案，該檔案可以存取藍圖的 API。
   + 對於 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. 將用戶端新增至 Java classpath `jar` 的正面，以覆寫 AWS Java 開發套件提供的 AWS Glue 用戶端。

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

1. (選用) 使用下列 Java 應用程式測試開發套件。應用程式應輸出空的清單。

   使用您的憑證取代 `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 wheel 檔案。如果提示開啟或儲存，請儲存檔案。s3://awsglue-custom-blueprints-preview-artifacts/aws-python-sdk-preview/boto3-1.17.31-py2.py3-none-any.whl

1. 下載以下 botocore wheel 檔案：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 wheel 檔案。

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

1. 安裝 boto3 wheel 檔案。

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

1. 在 `~/.aws/credentials` 和 `~/.aws/config` 檔案中設定您的憑證和預設區域。如需詳細資訊，請參閱 *AWS Command Line Interface 使用者指南*中的[設定 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)。執行此動作最簡單的方法是使用 `pip` (Python 安裝程式公用程式)：

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

   您可以在這裡找到 AWS CLI 的完整安裝指示：[安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)。

1. 從以下位置下載 AWS CLI wheel 檔案：s3：//awsglue-custom-blueprints-preview-artifacts/awscli-preview-build/awscli-1.19.31-py2.py3-none-any.whl

1. 安裝 AWS CLI wheel 檔案。

   ```
   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)。

配置函數必須接受以下輸入引數。


| 引數 | Description | 
| --- | --- | 
| user\$1params | 藍圖參數名稱與值的 Python 字典。如需詳細資訊，請參閱[指定藍圖參數](developing-blueprints-code-parameters.md)。 | 
| system\$1params | Python 字典包含兩個屬性：region 和 accountId。 | 

以下是名為 `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
```

範例指令碼會匯入所需的藍圖程式庫，並包含會產生具有兩個任務之工作流程的 `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 | 完整的 Amazon S3 路徑，開頭為 s3://。在 Create a workflow from <blueprint> (從 <藍圖> 建立工作流程) 頁面上產生文字欄位和 Browse (瀏覽) 按鈕。 | 
| S3Bucket | 僅限 Amazon S3 儲存貯體名稱。在 Create a workflow from <blueprint> (從 <藍圖> 建立工作流程) 頁面上產生儲存貯體選擇器。 | 
| IAMRoleArn | (IAM) 角色的 Amazon Resource Name AWS Identity and Access Management (ARN)。在 Create a workflow from <blueprint> (從 <藍圖> 建立工作流程) 頁面上產生角色選擇器。 | 
| IAMRoleName | IAM 角色的名稱。在 Create a workflow from <blueprint> (從 <藍圖> 建立工作流程) 頁面上產生角色選擇器。 | 

# 範例藍圖專案
<a name="developing-blueprints-sample"></a>

資料格式轉換是頻繁的擷取、轉換和載入 (ETL) 使用案例。在一般的分析工作負載中，以欄為基礎的檔案格式 (例如 Parquet 或 ORC) 優先於 CSV 或 JSON 等文字格式。此範例藍圖可讓您將資料從 CSV/JSON 等格式轉換為 Parquet，以供 Amazon S3 上的檔案使用。

此藍圖會取得藍圖參數定義的 S3 路徑清單，將資料轉換為 Prquet 格式，並將其寫入另一個藍圖參數指定的 S3 位置。配置指令碼會為每個路徑建立爬蟲程式和任務。配置指令碼還會將 `Conversion.py` 中的 ETL 指令碼上傳至另一個藍圖參數指定的 S3 儲存貯體。然後，配置指令碼會將上傳的指令碼指定為每個任務的 ETL 指令碼。專案的 ZIP 封存包含配置指令碼、ETL 指令碼和藍圖組態檔。

如需藍圖範例專案的相關資訊，請參閱[藍圖範例](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()
```

**注意**  
只能提供兩個 Amazon S3 路徑做為範例藍圖的輸入。這是因為 AWS Glue 觸發程序僅限於叫用兩個爬蟲程式動作。

# 測試藍圖
<a name="developing-blueprints-testing"></a>

當您開發程式碼時，您應該執行本機測試，以確認工作流程配置是否正確。

本機測試不會產生 AWS Glue 任務、爬蟲程式或觸發程序。相反地，您可以在本機執行配置指令碼，並使用 `to_json()` 和 `validate()` 方法來列印物件並尋找錯誤。這些方法可用於程式庫中定義的全部三個類別。

有兩種方式可以處理 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`，則不需要同時呼叫 `validate()`，因為 ` to_json()` 會呼叫 `validate()`。

   在工作流程物件上呼叫這些方法非常有用。假設您的指令碼將工作流程物件命名為 `my_workflow`，請如下所示驗證和列印工作流程物件。

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

   如需 `to_json()` 和 `validate()` 的更多相關資訊，請參閱[Class 方法](developing-blueprints-code-classes.md#developing-blueprints-code-methods)。

   您也可以匯入 `pprint`，然後美化顯示工作流程物件，如本節稍後的範例所示。

1. 執行程式碼、修正錯誤，最後移除對 `validate()` 或 `to_json()` 的呼叫。

**Example**  
下列範例顯示如何建構範例藍圖參數的字典，並將其作為 `user_params` 引數傳遞給配置函數 `generate_compaction_workflow`。它也會顯示如何美化顯示產生的工作流程物件。  

```
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**
+ [Job 類別](#developing-blueprints-code-jobclass)
+ [Crawler 類別](#developing-blueprints-code-crawlerclass)
+ [Workflow 類別](#developing-blueprints-code-workflowclass)
+ [Class 方法](#developing-blueprints-code-methods)

## Job 類別
<a name="developing-blueprints-code-jobclass"></a>

`Job` 類別代表 AWS Glue ETL 任務。

**必要建構函數引數**  
以下為 `Job` 類別的必要建構函數引數。


| 引數名稱 | Type | 說明 | 
| --- | --- | --- | 
| Name | str | 要指派給任務的名稱。AWS Glue 會在名稱中新增隨機產生的尾碼，以區分任務與其他藍圖執行所建立的任務。 | 
| Role | str | 任務在執行時應擔任角色的 Amazon Resource Name (ARN)。 | 
| Command | dict | Job 命令，如 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)。如果任務僅依賴於一個實體，則省略。 | 
| (Job 屬性) | - | AWS Glue API 文件 [Job 結構](aws-glue-api-jobs-job.md#aws-glue-api-jobs-job-Job) 中列出的任何任務屬性 (CreatedOn 和 LastModifiedOn 除外)。 | 

## Crawler 類別
<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)。如果爬蟲程式只依賴一個實體，則省略。 | 
| (Crawler 屬性) | - | AWS Glue API 文件 [Crawler 結構](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/zh_tw/glue/latest/dg/developing-blueprints-code-classes.html) | 

## Workflow 類別
<a name="developing-blueprints-code-workflowclass"></a>

`Workflow` 類別代表 AWS Glue 工作流程。工作流程配置指令碼會傳回 `Workflow` 物件。AWS Glue 會根據該物件建立工作流程。

**必要建構函數引數**  
以下為 `Workflow` 類別的必要建構函數引數。


| 引數名稱 | Type | 說明 | 
| --- | --- | --- | 
| Name | str | 要指派給工作流程的名稱。 | 
| Entities | Entities | 要包含在工作流程中的實體 (任務和爬蟲程式) 集合。Entities 類別建構函數接受 Jobs 引數 (Job 物件的清單)，以及 Crawlers 引數 (Crawler 物件的清單)。 | 

**選用建構函數引數**  
以下為 `Workflow` 類別的選用建構函數引數。


| 引數名稱 | Type | 說明 | 
| --- | --- | --- | 
| Description | str | 請參閱 [Workflow 結構](aws-glue-api-workflow.md#aws-glue-api-workflow-Workflow)。 | 
| DefaultRunProperties | dict | 請參閱 [Workflow 結構](aws-glue-api-workflow.md#aws-glue-api-workflow-Workflow)。 | 
| OnSchedule | str | cron 表達式。 | 

## Class 方法
<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 Prquet 格式，並針對分析工作負載進行最佳化。
+ 網路爬取 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 主控台。

   以具有註冊藍圖的許可的使用者身分登入。切換到與 Amazon S3 儲存貯體相同的 AWS 區域，其中包含藍圖 ZIP 封存。

1. 在導覽窗格中，選擇 **blueprints** (藍圖)。然後在 **blueprints** (藍圖) 頁面，選擇 **Add blueprint** (新增藍圖)。

1. 輸入藍圖名稱，以及選用描述。

1. 對於 **ZIP archive location (S3) (ZIP 封存位置 (S3))**，輸入已上傳藍圖 ZIP 封存的 Amazon S3 路徑。在路徑中包含封存檔案名稱，並以 `s3://` 開頭。

1. (選用) 新增標記一或多個標籤。

1. 選擇 **Add blueprint (新增藍圖)**。

   **blueprints** (藍圖) 頁面會傳回，並顯示藍圖狀態為 `CREATING`。選擇重新整理按鈕，直到狀態變更為 `ACTIVE` 或 `FAILED`。

1. 如果狀態為 `FAILED`，請選取藍圖，然後在 **Actions (動作)** 選單，選擇 **View (檢視)**。

   詳細資訊頁面會顯示失敗的原因。如果錯誤訊息為「無法存取以下位置的物件...」或「以下位置的物件存取被拒絕...」，請檢閱下列需求：
   + 您登入的使用者身分必須具有 Amazon S3 中藍圖 ZIP 封存的讀取許可。
   + 包含 ZIP 封存檔的 Amazon S3 儲存貯體必須具有儲存貯體政策，將物件的讀取許可授予 AWS 您的帳戶 ID。如需詳細資訊，請參閱[AWS Glue 中的開發藍圖](developing-blueprints.md)。
   + 您使用的 Amazon S3 儲存貯體必須與您在主控台上登入的區域位在同一區域。

1. 確保資料分析師具有藍圖的許可。

   [藍圖的資料分析師許可](blueprints-personas-permissions.md#bp-persona-analyst) 中顯示適用於資料分析師的建議 IAM 政策。此政策授予任何資源上的 `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` 並且錯誤訊息為「無法存取以下位置的物件...」或「以下位置的物件存取被拒絕...」中，請檢閱下列需求：
   + 您登入的使用者身分必須具有 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. 在 **blueprints** (藍圖) 頁面上，選取藍圖。然後在 **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` 引數以在輸出中包含 URL，您可以貼到瀏覽器中，來下載 AWS Glue 儲存的藍圖 ZIP 封存。

**另請參閱：**  
[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 主控台。

   以具有更新藍圖的使用者身分登入。切換到與 Amazon S3 儲存貯體相同的 AWS 區域，其中包含藍圖 ZIP 封存。

1. 在導覽窗格中，選擇 **blueprints** (藍圖)。

1. 在 **Blueprints** (藍圖) 頁面上，選取藍圖，然後在 **Actions** (動作) 選單，選擇 **Edit** (編輯)。

1. 在 **Edit a blueprint (編輯藍圖)** 頁面上，更新藍圖 **Description (描述)** 或 **ZIP archive location (S3) (ZIP 封存位置 (S3))**。務必在路徑中包含封存名稱。

1. 選擇**儲存**。

   **blueprints** (藍圖) 頁面會傳回，並顯示藍圖狀態為 `UPDATING`。選擇重新整理按鈕，直到狀態變更為 `ACTIVE` 或 `FAILED`。

1. 如果狀態為 `FAILED`，請選取藍圖，然後在 **Actions (動作)** 選單，選擇 **View (檢視)**。

   詳細資訊頁面會顯示失敗的原因。如果錯誤訊息為「無法存取以下位置的物件...」或「以下位置的物件存取被拒絕...」，請檢閱下列需求：
   + 您登入的使用者身分必須具有 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` 並且錯誤訊息為「無法存取以下位置的物件...」或「以下位置的物件存取被拒絕...」中，請檢閱下列需求：
   + 您登入的使用者身分必須具有 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. 在 **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. 在 **blueprints** (藍圖) 頁面上，選取藍圖。然後在 **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)