

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

# 撰寫藍圖程式碼
<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> (從 <藍圖> 建立工作流程) 頁面上產生角色選擇器。 | 