

# 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_cn/glue/latest/dg/about-triggers.html)

**按需**  
在激活时触发的触发器。按需触发器永远不会进入 `ACTIVATED` 或 `DEACTIVATED` 状态。它们始终处于 `CREATED` 状态。

因此，它们一旦存在就可以立即触发。而对于计划触发器和条件触发器，则可以设置一个标记，用于在创建时激活它们。

**重要**  
作为其他作业或爬网程序完成的结果而运行的作业或爬网程序称为*依赖项*。仅当完成的作业或爬网程序由触发器启动时，才会启动依赖作业或爬网程序。依赖链中的所有作业或爬网程序都必须是单个**计划**或**按需**触发器的子代。

**通过触发器传递作业参数**  
触发器可以将参数传递给它所启动的作业。参数包括作业参数、超时值、安全配置等。如果触发器启动多个作业，则参数会传递给每个作业。

以下是触发器传递作业参数的规则：
+ 如果键值对中的键与默认作业参数匹配，则传递的参数将覆盖默认参数。如果键与默认参数不匹配，则该参数将作为附加参数传递给作业。
+ 如果键值对中的键与不可覆盖的参数匹配，则会忽略传递的参数。

有关更多信息，请参阅 AWS Glue API 中的[触发](aws-glue-api-jobs-trigger.md)。

# 添加触发器
<a name="console-triggers"></a>

您可以使用 AWS Glue 控制台、 AWS Command Line Interface (AWS CLI) 或 AWS Glue API 添加触发器。

**添加触发器（控制台）**

1. 登录 AWS 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 在导航窗格中，于 **ETL** 下，选择 **Triggers (触发器)**。选择 **Add trigger (添加触发器)**。

1. 提供以下属性：  
**名称**  
赋予您的触发器一个唯一的名称。  
**触发器类型**  
指定下列项之一：  
   + **Schedule (计划)**：触发器按特定的频率和时间触发。
   + **Job events (作业事件)**：条件触发器。当列表中的任何或所有作业进入其指定状态时，触发器就会触发。要让触发器触发，受监控的作业必须由触发器启动。对于您选择的任何作业，您只能监控一个作业事件（完成状态）。
   + **On-demand (按需)**：触发器会在激活时触发。

1. 完成触发器向导。在 **Review (审查)** 页面上，您可以选择 **Enable trigger on creation (在创建时启用触发器)**，立即激活 **Schedule (计划)** 和 **Job events (任务事件)**（条件）触发。

**添加触发器 (AWS CLI)**
+ 输入类似以下的命令。

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

  此命令会创建一个名为 `MyTrigger` 的计划触发器 ，该触发器每天在 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)
```


| **字段** | **值** | **通配符** | 
| --- | --- | --- | 
|  分钟  |  0-59  |  , - \$1 /  | 
|  小时  |  0-23  |  , - \$1 /  | 
|  Day-of-month  |  1-31  |  , - \$1 ? / L W  | 
|  Month  |  1-12 或 JAN-DEC  |  , - \$1 /  | 
|  星期几  |  1-7 或 SUN-SAT  |  , - \$1 ? / L  | 
|  Year  |  1970-2199  |  , - \$1 /  | 

**通配符**
+ **,**（逗号）通配符包含其他值。在 `Month` 字段中，`JAN,FEB,MAR` 将包含 January、February 和 March。
+ **-**（破折号）通配符用于指定范围。在 `Day` 字段中，1-15 将包含指定月份的 1-15 日。
+ **\$1**（星号）通配符包含该字段中的所有值。在 `Hours` 字段中，**\$1** 将包含每个小时。
+ **/**（正斜杠）通配符用于指定增量。在 `Minutes` 字段中，您可以输入 **1/10** 以指定从一个小时的第一分钟开始的每个第十分钟（例如，第 11 分钟、第 21 分钟和第 31 分钟）。
+ **?**（问号）通配符用于指定一个或另一个。在 `Day-of-month` 字段中，您可以输入 **7**，如果您不介意 7 日是星期几，则可以在“星期几”字段中输入 **?**。
+ ** 或 ** 字段中的 `Day-of-month`L`Day-of-week` 通配符用于指定月或周的最后一天。
+ `Day-of-month` 字段中的 **W** 通配符用于指定工作日。在 `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  |  每月第 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 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/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_cn/glue/latest/dg/workflows_overview.html)

  `GetWorkflowRun` API 操作返回触发工作流的批处理条件。

无论工作流程如何启动，您都可以在创建工作流时指定并发工作流运行的最大数量。

如果某个事件或某批事件启动的工作流最终运行失败，则不再考虑使用该事件或该批事件来启动工作流程运行。只有在下一个事件或下一批事件到达时，才会启动新的工作流运行。

**重要**  
将工作流中任务、爬网程序和触发器的总数限制为 100 个或更少。如果包含超过 100 个，则在尝试恢复或停止工作流运行时可能会出错。

如果工作流运行超过为工作流设置的并发限制，即使满足事件条件，也不会启动工作流运行。建议根据预期的事件量调整工作流并发限制。AWS Glue 不会重试因超出并发限制而失败的工作流运行。同样，建议根据预期的事件量调整工作流中的任务和爬网程序的并发限制。

**工作流运行属性**  
要在工作流程运行中共享和管理状态，您可以定义默认工作流程运行属性。这些属性是名称/值对，可用于工作流程中的所有作业。利用 AWS Glue API，任务可以检索工作流运行属性，并针对工作流中后面的任务修改它们。

**工作流图**  
下图显示 AWS Glue 控制台上的基本工作流图。您的工作流程可能拥有几十个组件。

![\[显示工作流 Graph (图表) 选项卡的控制台屏幕截图。图中包含 5 个图标，它们分别表示 1 个计划触发器、两个任务、1 个事件成功触发器以及 1 个更新架构的爬网程序。\]](http://docs.aws.amazon.com/zh_cn/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 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/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 event (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_cn/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_cn/glue/latest/dg/images/graph-dual-placeholders.png)

   1. （如果触发器已监视某个事件，并且您想添加更多作业或爬网程序以进行监视，则为可选。） 选择要监视的事件占位符节点，然后在 **Add job(s) and crawler(s) to watch (添加要监视的作业和爬网程序)** 对话框中，选择一个或多个作业或爬网程序。选择要监视的事件（SUCCEEDED、FAILED 等）并选择 **Add (添加)**。

   1. 确保已选择触发器，然后选择操作占位符节点。

   1. 在 **Add jobs(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 存储桶的名称。
将 *<account-id>* 替换为有效 AWS 账户 ID。
将 *<region>* 替换为区域的名称（例如，`us-east-1`）。
将 *<rule-name>* 替换为要分配给 EventBridge 规则的名称。

1. 确保您拥有 AWS Identity and Access Management（IAM）权限，可以创建和查看 EventBridge 规则和目标。以下是您可以附加的一个示例策略。您可能需要将其范围缩小，以限制操作和资源。

------
#### [ 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 (亚马逊云科技服务)**。然后，选择服务 **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 命令参考》**中的[创建工作流](https://docs.aws.amazon.com/cli/latest/reference/glue/create-workflow.html)，了解有关其他可选命令行参数的信息。

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

1. 输入以下命令，为工作流创建 EventBridge 事件触发器。这将是工作流的启动触发器。将 *<actions>* 替换为要执行的操作（要启动的任务和爬网程序）。

   请参阅《AWS CLI 命令参考》**中的[创建触发器](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 事件到达后，或者第一个事件到达后五分钟（以先到者为准），启动 `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 骨架和输入参数](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 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/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 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 在导航窗格中，选择 **Workflows (工作流)**。

1. 选择工作流。然后在底部，选择 **History (历史记录)** 选项卡。

1. 选择工作流运行，然后选择 **View run details (查看运行详细信息)**。

1. 在运行详细信息页面上，找到 **Run properties (运行属性)** 字段，然后查找 **aws:eventIds** 密钥。

   该密钥的值是一系列 EventBridge 事件 ID。

**查看工作流启动的 EventBridge 事件（AWS API）**
+ 在 Python 脚本中包含以下代码。

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

  `batched_events` 将是一系列字符串，其中每个字符串均为一个事件 ID。

**另请参阅**  
[https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)
[AWS Glue 中的工作流概述](workflows_overview.md)

# 在 AWS Glue 中运行和监控工作流
<a name="running_monitoring_workflow"></a>

如果工作流程的启动触发器是按需触发器，请从 AWS Glue 控制台启动工作流程。完成以下步骤，运行并监控工作流。如果工作流失败，您可以查看运行图，确定失败的节点。为帮助进行故障排除，如果工作流根据蓝图创建，您可以查看蓝图运行，了解工作流创建所用的蓝图参数值。有关更多信息，请参阅 [在 AWS Glue 中查看蓝图运行](viewing_blueprint_runs.md)。

您可以使用 AWS Glue 控制台、API、或 AWS Command Line Interface（AWS CLI）运行和监控工作流。

**运行和监控工作流（控制台）**

1. 通过 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 打开 AWS Glue 控制台。

1. 在导航窗格中，在 **ETL** 下，选择 **Workflows (工作流程)**。

1. 选择工作流程。在 **Actions (操作)** 菜单上，选择 **Run (运行)**。

1. 选中工作流列表中的 **Last run status (上次运行状态)** 列。选择刷新按钮，查看正在进行的工作流状态。

1. 当工作流正在运行或者已完成（或失败）后，请按照以下步骤查看运行详细信息。

   1. 确保已选择工作流，然后选择 **History (历史记录)** 选项卡。

   1. 选择当前或最近的工作流运行，然后选择 **View run details (查看运行详细信息)**。

      工作流运行时图会显示当前运行状态。

   1. 选择图表中的任意节点，查看该节点的详细信息和状态。  
![\[运行图会显示启动触发器，用于启动任务。另一个触发器用于监控任务完成情况。任务节点（包含剪贴板图标和任务名称的矩形）已选，并且任务详细信息在右侧窗格中显示。任务详细信息包括任务运行 ID 和状态。\]](http://docs.aws.amazon.com/zh_cn/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://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 打开 AWS Glue 控制台。

1. 在导航窗格中，在 **ETL** 下，选择 **Workflows (工作流程)**。

1. 选择正在运行的工作流程，然后选择 **History (历史记录)** 选项卡。

1. 选择工作流程运行，然后选择 **Stop run (停止运行)**。

   运行状态更改为 **Stopping (正在停止)**。

1. （可选）选择工作流程运行，选择 **View run details (查看运行详细信息)**，然后查看运行图。

**停止工作流程运行 (AWS CLI)**
+ 输入以下命令。将 *<workflow-name>* 替换为工作流程的名称，并将 *<run-id>* 替换为要停止的工作流程运行的运行 ID。

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

  以下是 **stop-workflow-run** 命令的示例。

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

# 修复和恢复工作流运行
<a name="resuming-workflow"></a>

 如果工作流中的一个或多个节点（任务或爬网程序）未成功完成，这意味着工作流仅部分运行。找到根本原因并进行更正后，您可以选择要从中恢复工作流运行的一个或多个节点，然后恢复工作流运行。然后，所选节点以及这些节点下游的所有节点就会运行。

**Topics**
+ [恢复工作流运行：工作原理](#resume-workflow-howitworks)
+ [恢复工作流运行](#how-to-resume-workflow)
+ [工作流运行恢复的注释和限制](#resume-workflow-notes)

## 恢复工作流运行：工作原理
<a name="resume-workflow-howitworks"></a>

请考虑下图中的工作流 W1。

![\[触发器以矩形显示，任务以圆形显示。左侧触发器 T1 通过运行任务 J1 启动工作流。存在后续触发器和任务，但任务 J2 和 J3 失败，因此下游触发器和任务显示为未运行状态。\]](http://docs.aws.amazon.com/zh_cn/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_cn/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_cn/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://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_cn/glue/latest/dg/images/workflow-pre-select-resume.png)

   节点会更改颜色，并在右上角显示一个小恢复图标。  
![\[文本介绍了运行图的相关更改。Resume (恢复) 复选框处于选中状态。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/workflow-post-select-resume.png)

1. 完成前面 2 个步骤，以便其他节点重新启动。

1. 选择 **Resume run (恢复运行)**。

**恢复工作流运行（AWS CLI）**

1. 确保您拥有 `glue:ResumeWorkflowRun` IAM 权限。

1. 检索要重新启动的节点的节点 ID。

   1.  运行原始工作流运行的 `get-workflow-run` 命令。提供工作流名称和运行 ID，然后添加 `--include-graph` 选项，如以下示例所示。从控制台上的 **History (历史记录)** 选项卡中获取运行 ID，或者运行 `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 作业不属于工作流程的一部分，则不会设置这些属性。

以下 Python 示例代码来自提取、转换和加载（ETL）任务，该代码演示如何获取工作流运行属性。

```
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 通用网络/图表 (JUNG) 框架。由于所有这些库都以类似方式表示图表，因此需要最少的转换。

根据与工作流程关联的触发器的最新定义，此 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 对象。此对象的最大长度为 128KB。
+ 蓝图 ZIP 格式归档文件的最大未压缩大小为 5MB。最大未压缩大小为 1MB。
+ 将工作流中任务、爬网程序和触发器的总数限制为 100 个或更少。如果包含超过 100 个，则在尝试恢复或停止工作流运行时可能会出错。

## 工作流限制
<a name="workflow-restrictions"></a>

请记住以下工作流限制：其中一些注释更多地针对手动创建工作流的用户。
+ Amazon EventBridge 事件触发器的最大批处理大小为 100。最大窗口大小为 900 秒（15 分钟）。
+ 一个触发器只能与一个工作流程关联。
+ 仅允许一个启动触发器（按需或计划）。
+ 如果工作流程中的某个作业或爬网程序由工作流外部的触发器启动，则工作流程中依赖于该作业或爬网程序完成（成功或其他状态）的任何触发器都不会触发。
+ 同样，如果工作流中的某个任务或爬网程序具有触发器，而该触发器依赖于工作流内外部的任务或爬网程序完成（成功或其他状态），则如果任务或爬网程序是从工作流内部启动的，只有工作流内部的触发器在任务或爬网程序完成时触发。

# 排查 AWS Glue 中的蓝图错误
<a name="blueprint_workflow_troubleshoot"></a>

如果您在使用 AWS Glue 蓝图时遇到错误，则可以使用以下解决方案来帮助您查找问题的根源并解决问题。

**Topics**
+ [错误：缺少 PySpark 模块](#blueprint-workflow-error-1)
+ [错误：缺少蓝图配置文件](#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)
+ [错误：在指定的布局生成器路径中找不到模块](#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 格式文件。

对于第二种情况，蓝图所需的所有文件均不在文件夹内，而是作为根文件添加到 zip 格式文件 *compaction.zip* 下面。

允许使用上述两种格式创建文件。但是，请确保 `blueprint.cfg` 有正确路径指向布局生成脚本中函数的名称。

**示例**  
对于案例 1：`blueprint.cfg` 应该具有 `layoutGenerator`，如下所示：

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

对于案例 2：`blueprint.cfg` 应该具有 `layoutGenerator`，如下所示：

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

如果没有正确包含此路径，您可能会看到指示的错误。例如，如果您拥有案例 2 中提到的文件夹结构，并且具有案例 1 中指明的 `layoutGenerator`，您可能会看到上面的错误。

## 错误：缺少蓝图配置文件
<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

此错误意味着已存在具有相同名称的触发器。您可以删除现有触发器并重新运行工作流创建。

**注意**  
删除工作流不会删除工作流内的节点。虽然工作流已删除，但触发器可能会保留。因此，您可能不会收到“workflow already exists”错误，但如果创建工作流、删除工作流并尝试从同一蓝图使用相同的名称重新创建，您可能会收到“trigger already exists”错误。

## 错误：名称为 foo 的工作流已存在。
<a name="blueprint-workflow-error-7"></a>

工作流名称应该唯一。请尝试使用其他名称。

## 错误：在指定的布局生成器路径中找不到模块
<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 Glue 蓝图角色的 AWS Identity and Access Management（IAM）权限策略建议。

**Topics**
+ [蓝图角色](#blueprints-personas)
+ [蓝图角色的权限](#blueprints-permssions)
+ [蓝图角色的权限](#blueprints-role-permissions)

## 蓝图角色
<a name="blueprints-personas"></a>

以下是 AWS Glue 蓝图生命周期中通常涉及的角色。


| 角色 | 说明 | 
| --- | --- | 
| AWS Glue 开发人员 | 开发、测试和发布蓝图。 | 
| AWS Glue 管理员 | 蓝图上的注册、维护和授予权限。 | 
| 数据分析人员 | 运行蓝图以创建工作流。 | 

有关更多信息，请参阅 [AWS Glue 中的蓝图概览](blueprints-overview.md)。

## 蓝图角色的权限
<a name="blueprints-permssions"></a>

以下是针对每个蓝图角色的建议权限。



### 蓝图的 AWS Glue 开发人员权限
<a name="bp-persona-dev"></a>

AWS Glue 开发人员必须具有写入用于发布蓝图的 Amazon S3 存储桶的权限。通常，开发人员在上传蓝图后注册蓝图。在这种情况下，开发人员需要具有 [蓝图的 AWS Glue 管理员权限](#bp-persona-admin) 中列出的权限。此外，如果开发人员希望在蓝图注册后测试蓝图，还需要具有 [蓝图的数据分析人员权限](#bp-persona-analyst) 中列出的权限。

### 蓝图的 AWS Glue 管理员权限
<a name="bp-persona-admin"></a>

以下策略授予注册、查看和维护 AWS Glue 蓝图的权限。

**重要**  
在以下策略中，将 *<s3-bucket-name>* 和 *<prefix>* 替换为 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>

**注意**  
蓝图功能目前在 AWS Glue 控制台的以下区域不可用：亚太地区（雅加达）和中东（阿联酋）。

AWS Glue 蓝图提供了一种创建和共享 AWS Glue 工作流的方法。当存在可用于类似用例的复杂 ETL 流程时，您可以创建单个蓝图，而不是为每个使用案例创建一个 AWS Glue 工作流。

蓝图指定要包含在工作流中的任务和爬网程序，并指定工作流用户在运行蓝图创建工作流时提供的参数。参数的使用使单个蓝图能够为各种类似的用例生成工作流。有关工作流的更多信息，请参阅[AWS Glue 中的工作流概述](workflows_overview.md)。

以下是蓝图的示例用例：
+ 您想要对现有数据集进行分区。蓝图的输入参数包括 Amazon Simple Storage Service（Amazon S3）源和目标路径以及分区列列表。
+ 您希望将 Amazon DynamoDB 表快照到 SQL 数据存储（如 Amazon Redshift）中。蓝图的输入参数包括 DynamoDB 表名称和 AWS Glue 连接，它指定 Amazon Redshift 集群和目标数据库。
+ 您想将多个 Amazon S3 路径中的 CSV 数据转换为 Parquet。您希望 AWS Glue 工作流为每个路径包含一个单独的爬网程序和任务。输入参数是 AWS Glue 数据目录中的目标数据库和以逗号分隔的 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_cn/glue/latest/dg/images/blueprint.png)


**蓝图运行**  
从蓝图创建工作流时，AWS Glue 会运行蓝图，这会开启一个异步过程来创建工作流以及工作流封装的任务、爬网程序和触发器。AWS Glue 使用蓝图运行来编排工作流及其组件的创建。您可以通过查看蓝图运行状态来查看创建过程的状态。蓝图运行还存储您为蓝图参数提供的值。

![\[标记为“蓝图运行”的框包含标记为“工作流”和“参数值”的图标。\]](http://docs.aws.amazon.com/zh_cn/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_cn/glue/latest/dg/blueprints-overview.html)  | 
| AWS Glue 管理员 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/blueprints-overview.html)  | 
| 数据分析人员 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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 任务编写脚本。此外，您还必须完成以下设置任务。
+ 下载 4 个 AWS Python 库，以在蓝图布局脚本中使用。
+ 设置 AWS SDK。
+ 设置 AWS CLI。

## 下载 Python 库
<a name="prereqs-get-libes"></a>

从 GitHub 下载以下库，并将它们安装到您的项目中：
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/base\$1resource.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/base_resource.py)
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/workflow.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/workflow.py)
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/crawler.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/crawler.py)
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/job.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/job.py)

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

对于 AWS Java SDK，您必须添加 `jar` 文件，其中包含适用于蓝图的 API。

1. 如果您还没有这样做，请设置 AWS SDK for Java。
   + 对于 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. 将客户端 `jar` 添加到 Java 类路径前，覆盖由 AWS Java SDK 提供的 AWS Glue 客户端。

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

1. （可选）使用以下 Java 应用程序测试 SDK。应用程序应输出空列表。

   将 `accessKey` 和 `secretKey` 替换为您的凭证，然后将 `us-east-1` 替换为您的区域。

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

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

以下步骤假定您的计算机上已安装 Python 版本 2.7 或更高版本，或者版本 3.9 或更高版本。

1. 下载下面的 boto3 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)。

该布局函数接受以下输入参数。


| 参数 | 说明 | 
| --- | --- | 
| 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 | 从 s3:// 开始完成 Amazon S3 路径。Create a workflow from <blueprint> (从 <blueprint> 创建工作流) 页面生成文本字段和 Browse (浏览) 按钮。 | 
| S3Bucket | 仅限 Amazon S3 存储桶名称。在 Create a workflow from <blueprint> (从 <blueprint> 创建工作流) 页生成存储桶选取器。 | 
| IAMRoleArn | AWS Identity and Access Management（IAM）角色的 Amazon Resource Name（ARN）。在 Create a workflow from <blueprint> (从 <blueprint> 创建工作流) 页生成角色选取器。 | 
| IAMRoleName | IAM 角色的名称。在 Create a workflow from <blueprint> (从 <blueprint> 创建工作流) 页生成角色选取器。 | 

# 示例蓝图项目
<a name="developing-blueprints-sample"></a>

数据格式转换是一种常见的提取、转换和加载（ETL）使用案例。在典型的分析工作负载中，基于列的文件格式（如 Parquet 或 ORC）优先于 CSV 或 JSON 等文本格式。此示例蓝图使您能够将 CSV/JSON/ 等格式的数据转换为 Amazon S3 文件的 Parquet。

此蓝图采用由蓝图参数定义的 S3 路径列表，将数据转换为 Parquet 格式，并将其写入另一个蓝图参数指定的 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()` 的更多信息，请参阅 [类方法](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 Identity and Access Management（IAM）权限策略和用于 AWS Glue 蓝图的角色方面的相关建议，请参阅[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. 对 AWS Glue 管理员或对任何注册蓝图的人员授予 Amazon S3 存储桶的 IAM `s3:GetObject` 访问权限。有关授予管理员的示例策略，请参阅[蓝图的 AWS Glue 管理员权限](blueprints-personas-permissions.md#bp-persona-admin)。

完成蓝图的本地测试后，您可能还需要在 AWS Glue 上测试蓝图。要在 AWS Glue 上测试蓝图，则必须注册。您可以使用 IAM 授权或使用单独的测试账户来限制可以查看已注册蓝图的人员。

**另请参阅：**  
[在 AWS Glue 中注册蓝图](registering-blueprints.md)

# AWS Glue 蓝图类参考
<a name="developing-blueprints-code-classes"></a>

适用于 AWS Glue 蓝图的库定义了在工作流布局脚本中使用的三个类：`Job`、`Crawler` 和 `Workflow`。

**Topics**
+ [作业类](#developing-blueprints-code-jobclass)
+ [爬网程序类](#developing-blueprints-code-crawlerclass)
+ [工作流类](#developing-blueprints-code-workflowclass)
+ [类方法](#developing-blueprints-code-methods)

## 作业类
<a name="developing-blueprints-code-jobclass"></a>

`Job` 类表示一个 AWS Glue ETL 任务。

**强制构造函数参数**  
以下是适用于 `Job` 类的强制构造函数参数。


| 参数名 | Type | 说明 | 
| --- | --- | --- | 
| Name | str | 要分配给任务的名称。AWS Glue 将随机生成的后缀添加到名称中，以区分其他蓝图运行创建的任务。 | 
| Role | str | 任务在执行时应担任角色的 Amazon Resource Name（ARN）。 | 
| Command | dict | 任务命令，如指定在 API 文档中的 [JobCommand 结构](aws-glue-api-jobs-job.md#aws-glue-api-jobs-job-JobCommand)。 | 

**可选构造函数参数**  
以下是适用于 `Job` 类的可选构造函数参数。


| 参数名 | Type | 说明 | 
| --- | --- | --- | 
| DependsOn | dict | 任务所依赖的工作流实体的列表。有关更多信息，请参阅 [使用 DependsOn 参数](developing-blueprints-code-layout.md#developing-blueprints-code-layout-depends-on)。 | 
| WaitForDependencies | str | 指示任务是应该等待它依赖的全部实体完成，还是等待任意实体完成。有关更多信息，请参阅 [使用 WaitForDependencies 参数](developing-blueprints-code-layout.md#developing-blueprints-code-layout-wait-for-dependencies)。如果任务仅依赖于一个实体，则省略。 | 
| （任务属性） | - | 任何任务属性都在 AWS Glue API 文档中的[作业结构](aws-glue-api-jobs-job.md#aws-glue-api-jobs-job-Job)内列出（CreatedOn 和 LastModifiedOn 除外）。 | 

## 爬网程序类
<a name="developing-blueprints-code-crawlerclass"></a>

`Crawler` 类表示一个 AWS Glue 爬网程序。

**强制构造函数参数**  
以下是适用于 `Crawler` 类的强制构造函数参数。


| 参数名 | Type | 说明 | 
| --- | --- | --- | 
| Name | str | 要分配给爬网程序的名称。AWS Glue 将随机生成的后缀添加到名称中，以区分其他蓝图运行创建的爬网程序。 | 
| Role | str | 运行时爬网程序应担任角色的 ARN。 | 
| Targets | dict | 要网络爬取的目标集合。Targets 类构造函数在 API 文档中的[CrawlerTargets 结构](aws-glue-api-crawler-crawling.md#aws-glue-api-crawler-crawling-CrawlerTargets)内定义。全部 Targets 构造函数参数是可选的，但您必须至少传递一个。 | 

**可选构造函数参数**  
以下是适用于 `Crawler` 类的可选构造函数参数。


| 参数名 | Type | 说明 | 
| --- | --- | --- | 
| DependsOn | dict | 爬网程序所依赖的工作流实体列表。有关更多信息，请参阅 [使用 DependsOn 参数](developing-blueprints-code-layout.md#developing-blueprints-code-layout-depends-on)。 | 
| WaitForDependencies | str | 指示爬网程序是应该等待它依赖的全部实体完成，还是等待任意实体完成。有关更多信息，请参阅 [使用 WaitForDependencies 参数](developing-blueprints-code-layout.md#developing-blueprints-code-layout-wait-for-dependencies)。如果爬网程序仅依赖于一个实体，则省略。 | 
| （爬网程序属性） | - | 所有爬网程序属性都在 AWS Glue API 文档中的[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_cn/glue/latest/dg/developing-blueprints-code-classes.html) | 

## 工作流类
<a name="developing-blueprints-code-workflowclass"></a>

`Workflow` 类表示一个 AWS Glue 工作流。工作流布局脚本返回 `Workflow` 对象。AWS Glue 基于此对象创建工作流。

**强制构造函数参数**  
以下是适用于 `Workflow` 类的强制构造函数参数。


| 参数名 | Type | 说明 | 
| --- | --- | --- | 
| Name | str | 要向工作流分配的名称。 | 
| Entities | Entities | 要包含在工作流中的实体（任务和爬网程序）的集合。Entities 类构造函数接受 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 表达式 | 

## 类方法
<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 Parquet 格式，该格式针对分析工作负载进行了优化。
+ 网络爬取 Amazon S3 位置：此蓝图对多个 Amazon S3 位置进行网络爬取，将元数据表添加到数据目录。
+ 自定义到数据目录的连接：此蓝图使用 AWS Glue 自定义连接器访问数据存储，读取记录，并根据记录架构填充 AWS Glue 数据目录中的表定义。
+ 编码：此蓝图将您的非 UTF 文件转换为 UTF 编码的文件。
+ 分区：此蓝图创建一个分区任务，根据特定的分区键将输出文件放入分区。
+ 将 Amazon S3 数据导入到 DynamoDB 表中：此蓝图将数据从 Amazon S3 导入到 DynamoDB 表中。
+ 所管理的标准表：此蓝图将 AWS Glue 数据目录表导入到 Lake Formation 表中。

# 在 AWS Glue 中注册蓝图
<a name="registering-blueprints"></a>

在 AWS Glue 开发人员已编码蓝图并将 ZIP 格式归档上传到 Amazon Simple Storage Service（Amazon S3）后，AWS Glue 管理员必须注册蓝图。注册蓝图使其可供使用。

注册蓝图时，AWS Glue 将蓝图归档复制到预留的 Amazon S3 位置。然后，您可以从上传位置删除归档。

如要注册蓝图，您需要对包含上传归档的 Amazon S3 位置具有读取权限。您还需要 AWS Identity and Access Management（IAM）权限 `glue:CreateBlueprint`。有关必须注册、查看和维护蓝图的 AWS Glue 管理员的建议权限，请参阅 [蓝图的 AWS Glue 管理员权限](blueprints-personas-permissions.md#bp-persona-admin)。

您可以使用 AWS Glue 控制台、AWS Glue API 或 AWS Command Line Interface（AWS CLI）来注册蓝图。

**注册蓝图（控制台）**

1. 确保您对 Amazon S3 中的蓝图 ZIP 格式归档具有读取权限（`s3:GetObject`）。

1. 通过 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 打开 AWS Glue 控制台。

   以具有蓝图注册权限的用户身份登录。切换到包含蓝图 ZIP 格式归档的 Amazon S3 存储桶所在的相同 AWS 区域。

1. 在导航窗格中，选择 **blueprints（蓝图）**。然后在 **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 (查看)**。

   详细信息页面会显示故障原因。如果错误消息为“Unable to access object at location...”或者“Access denied on object at location...”，请检查以下要求：
   + 您在登录时使用的用户身份必须对 Amazon S3 中的蓝图 ZIP 格式归档具有读取权限。
   + 包含 ZIP 格式归档的 Amazon S3 存储桶必须具有存储桶策略，该策略会为您的 AWS 账户 ID 授予对象读取权限。有关更多信息，请参阅 [AWS Glue 中的开发蓝图](developing-blueprints.md)。
   + 您使用的 Amazon S3 存储桶必须位于您在控制台上登录的相同区域。

1. 确保数据分析人员对蓝图具有相应的权限。

   针对数据分析人员的建议 IAM policy 如[蓝图的数据分析人员权限](blueprints-personas-permissions.md#bp-persona-analyst)所述。该策略授予对任何资源的 `glue:GetBlueprint` 权限。如果您的策略在资源级别更精细，则授予数据分析人员对此新建资源的权限。

**注册蓝图（AWS CLI）**

1. 输入以下命令。

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

1. 要检查蓝图状态，请输入以下命令。重复该命令，直到状态变为 `ACTIVE` 或者 `FAILED`。

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

   如果状态为 `FAILED` 并且错误消息为“Unable to access object at location...”或“Access denied on object at location...”，请检查以下要求：
   + 您在登录时使用的用户身份必须对 Amazon S3 中的蓝图 ZIP 格式归档具有读取权限。
   + 包含 ZIP 格式归档的 Amazon S3 存储桶必须具有存储桶策略，该策略会为您的 AWS 账户 ID 授予对象读取权限。有关更多信息，请参阅 [发布蓝图](developing-blueprints-publishing.md)。
   + 您使用的 Amazon S3 存储桶必须位于您在控制台上登录的相同区域。

**另请参阅：**  
[AWS Glue 中的蓝图概览](blueprints-overview.md)

# 在 AWS Glue 中查看蓝图
<a name="viewing_blueprints"></a>

查看蓝图，了解蓝图描述、状态和参数规范，并下载蓝图 ZIP 格式归档。

您可以使用 AWS Glue 控制台、AWS Glue API 或 AWS Command Line Interface（AWS CLI）来查看蓝图。

**查看蓝图（控制台）**

1. 打开 AWS Glue 控制台，地址：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/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 控制台。

   以具有蓝图更新权限的用户身份登录。切换到包含蓝图 ZIP 格式归档的 Amazon S3 存储桶所在的相同 AWS 区域。

1. 在导航窗格中，选择 **blueprints（蓝图）**。

1. 在 **blueprints（蓝图）**页面上，选择一个蓝图，然后在 **Actions（操作）**菜单上选择 **Edit（编辑）**。

1. 在 **Edit a blueprint (编辑蓝图)** 页面上，更新蓝图 **Description (描述)** 或者 **ZIP archive location (S3) (ZIP 归档位置（S3）)**。请务必在路径中包含归档文件的名称。

1. 选择 **Save (保存)**。

   返回 **blueprints（蓝图）**页面，蓝图状态显示为 `UPDATING`。选择刷新按钮，直到状态更改为 `ACTIVE` 或者 `FAILED`。

1. 如果状态为 `FAILED`，则选择蓝图，然后在 **Actions (操作)** 菜单上，选择 **View (查看)**。

   详细信息页面会显示故障原因。如果错误消息为“Unable to access object at location...”或者“Access denied on object at location...”，请检查以下要求：
   + 您在登录时使用的用户身份必须对 Amazon S3 中的蓝图 ZIP 格式归档具有读取权限。
   + 包含 ZIP 格式归档的 Amazon S3 存储桶必须具有存储桶策略，该策略会为您的 AWS 账户 ID 授予对象读取权限。有关更多信息，请参阅 [发布蓝图](developing-blueprints-publishing.md)。
   + 您使用的 Amazon S3 存储桶必须位于您在控制台上登录的相同区域。
**注意**  
如果更新失败，则下次蓝图运行将使用已成功注册或更新的最新蓝图版本。

**更新蓝图（AWS CLI）**

1. 输入以下命令。

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

1. 要检查蓝图状态，请输入以下命令。重复该命令，直到状态变为 `ACTIVE` 或者 `FAILED`。

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

   如果状态为 `FAILED` 并且错误消息为“Unable to access object at location...”或“Access denied on object at location...”，请检查以下要求：
   + 您在登录时使用的用户身份必须对 Amazon S3 中的蓝图 ZIP 格式归档具有读取权限。
   + 包含 ZIP 格式归档的 Amazon S3 存储桶必须具有存储桶策略，该策略会为您的 AWS 账户 ID 授予对象读取权限。有关更多信息，请参阅 [发布蓝图](developing-blueprints-publishing.md)。
   + 您使用的 Amazon S3 存储桶必须位于您在控制台上登录的相同区域。

**另请参阅**  
[AWS Glue 中的蓝图概览](blueprints-overview.md)

# 在 AWS Glue 中从蓝图创建工作流
<a name="creating_workflow_blueprint"></a>

您可以手动创建 AWS Glue 工作流，一次添加一个组件，也可以从 AWS Glue [蓝图](blueprints-overview.md)创建工作流。AWS Glue 包括常见用例的蓝图。您的 AWS Glue 开发人员可以创建其他蓝图。

**重要**  
将工作流中任务、爬网程序和触发器的总数限制为 100 个或更少。如果包含超过 100 个，则在尝试恢复或停止工作流运行时可能会出错。

使用蓝图时，您可以根据蓝图定义的常见使用案例快速生成特定使用案例的工作流。您可以通过为蓝图参数提供值来定义特定使用案例。例如，对数据集进行分区的蓝图可以将 Amazon S3 源和目标路径作为参数。

AWS Glue 通过*运行*蓝图从蓝图创建工作流。蓝图运行保存您提供的参数值，并用于跟踪工作流及其组件的创建进度和结果。对工作流进行问题排查时，您可以查看蓝图运行以确定用于创建工作流的蓝图参数值。

要创建和查看工作流，您需要特定的 IAM 权限。有关建议的 IAM policy，请参阅[蓝图的数据分析人员权限](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> (从 <blueprint-name> 创建工作流)** 页面上，输入以下信息：  
**蓝图参数**  
这些因蓝图设计而异。有关参数的问题，请咨询开发人员。蓝图通常包含工作流名称的参数。  
**IAM 角色**  
AWS Glue 在创建工作流及其组件时承担的角色。该角色必须具有创建和删除工作流、任务、爬网程序和触发器的权限。有关该角色的建议策略，请参阅 [蓝图角色的权限](blueprints-personas-permissions.md#blueprints-role-permissions)。

1. 选择 **Submit (提交)**。

   此时会显示 **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. 打开 AWS Glue 控制台，地址：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/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)