

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

# AWS Glue 中的開發藍圖
<a name="orchestrate-using-blueprints"></a>

您的組織可能有一組類似的 ETL 使用案例，這些案例可能會受益於能夠參數化單一工作流程來處理所有工作流程。為了解決此需求，AWS Glue 可讓您定義*藍圖*，可讓您用來產生工作流程。藍圖接受參數，因此資料分析師可以從單一藍圖建立不同的工作流程來處理類似的 ETL 使用案例。在您建立藍圖後，您可以將藍圖重複使用於不同部門、團隊和專案。

**Topics**
+ [AWS Glue 中的藍圖概觀](blueprints-overview.md)
+ [AWS Glue 中的開發藍圖](developing-blueprints.md)
+ [在 AWS Glue 中註冊藍圖](registering-blueprints.md)
+ [檢視 AWS Glue 中的藍圖](viewing_blueprints.md)
+ [更新 AWS Glue 中的藍圖](updating_blueprints.md)
+ [在 AWS Glue 中從藍圖建立工作流程](creating_workflow_blueprint.md)
+ [檢視 AWS Glue 中的藍圖執行](viewing_blueprint_runs.md)

# AWS Glue 中的藍圖概觀
<a name="blueprints-overview"></a>

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

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

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

以下是藍圖的使用案例範例：
+ 您想要分割現有的資料集。藍圖的輸入參數是 Amazon Simple Storage Service (Amazon S3) 來源和目標路徑，以及分割區欄的清單。
+ 您想要將 Amazon DynamoDB 資料表快照到像 Amazon Redshift 這樣的 SQL 資料存放區。藍圖的輸入參數是 DynamoDB 資料表名稱和 AWS Glue 連線，用於指定 Amazon Redshift 叢集和目標資料庫。
+ 您想要將多個 Amazon S3 路徑中的 CSV 資料轉換為 Parquet。您想要 AWS Glue 工作流程，以針對每個路徑包含個別的爬蟲程式和任務。輸入參數是 AWS Glue Data Catalog 中的目的地資料庫，以及 Amazon S3 路徑的逗號分隔清單。請注意，在此情況下，工作流程建立的爬蟲程式和任務數目會變動。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/s3Bm8ay53Ms/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/s3Bm8ay53Ms)


**藍圖元件**  
藍圖是含有下列元件的 ZIP 封存：
+ Python 配置產生器指令碼

  包含指定工作流程*配置*的函數—為工作流程建立的爬蟲程式和任務、任務和爬蟲程式屬性，以及任務和爬蟲程式之間的相依性。此函數接受藍圖參數，並傳回 AWS Glue 用於產生工作流程的工作流程結構 (JSON 物件)。因為您使用 Python 指令碼來產生工作流程，所以您可以新增適合您使用案例的自己邏輯。
+ 組態檔案

  指定產生工作流程配置的 Python 函數完整名稱。同時指定指令碼所使用之所有藍圖參數的名稱、資料類型和其他屬性。
+ (選用) ETL 指令碼和支援檔案

  做為進階使用案例，您可以參數化任務所使用之 ETL 指令碼的位置。您可以在 ZIP 封存中包含任務指令碼檔案，並為要將指令碼複製到的 Amazon S3 位置指定藍圖參數。配置產生器指令碼可以將 ETL 指令碼複製到指定的位置，並將該位置指定為任務指令碼位置屬性。您也可以包含任何程式庫或其他支援檔案，前提是您的指令碼處理它們。

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


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

![\[標示為藍圖執行的方塊包含標示為工作流程和參數值的圖示。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/blueprint-run.png)


您可以使用 AWS Glue主控台或 AWS Command Line Interface () 檢視藍圖執行AWS CLI。檢視或疑難排解工作流程時，您一律可以傳回藍圖執行以檢視用於建立工作流程的藍圖參數值。

**藍圖的生命週期**  
藍圖使用 AWS Glue 來開發、測試、註冊，然後執行以建立工作流程。藍圖生命週期通常涉及三個人物。


| 人物 | 任務​ | 
| --- | --- | 
| AWS Glue 開發人員 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/blueprints-overview.html)  | 
| AWS Glue 管理員 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/blueprints-overview.html)  | 
| 資料分析 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/blueprints-overview.html)  | 

**另請參閱**  
[AWS Glue 中的開發藍圖](developing-blueprints.md)
[在 AWS Glue 中從藍圖建立工作流程](creating_workflow_blueprint.md)
[AWS Glue 藍圖的人物和角色許可](blueprints-personas-permissions.md)

# AWS Glue 中的開發藍圖
<a name="developing-blueprints"></a>

作為 AWS Glue 開發人員，您可以建立和發佈藍圖，供資料分析師用來產生工作流程。

**Topics**
+ [開發藍圖概觀](developing-blueprints-overview.md)
+ [開發藍圖的先決條件](developing-blueprints-prereq.md)
+ [撰寫藍圖程式碼](developing-blueprints-code.md)
+ [範例藍圖專案](developing-blueprints-sample.md)
+ [測試藍圖](developing-blueprints-testing.md)
+ [發佈藍圖](developing-blueprints-publishing.md)
+ [AWS Glue 藍圖類別參考](developing-blueprints-code-classes.md)
+ [藍圖範例](developing-blueprints-samples.md)

**另請參閱**  
[AWS Glue 中的藍圖概觀](blueprints-overview.md)

# 開發藍圖概觀
<a name="developing-blueprints-overview"></a>

開發程序的第一個步驟是找出可從藍圖中受益的常見使用案例。一個典型的使用案例涉及重複出現的 ETL 問題，您認為應該以一般方式解決。接下來，設計實作一般化使用案例的藍圖，並定義藍圖輸入參數，這些參數搭配使用可以從一般化使用案例定義特定的使用案例。

藍圖包含內含藍圖參數組態檔的專案，以及定義工作流程要產生之*配置*的指令碼。配置定義要建立的任務和爬蟲程式 (在藍圖指令碼術語中稱為*實體*)。

請勿直接在配置指令碼中指定任何觸發程序。而是改為撰寫程式碼來指定指令碼建立之任務與爬蟲程式之間的相依性。AWS Glue 會根據您的相依性規範來產生觸發程序。配置指令碼的輸出是工作流程物件，其中包含所有工作流程實體的規格。

您可以使用以下 AWS Glue 藍圖程式庫來建置工作流程物件：
+ `awsglue.blueprint.base_resource` – 程式庫所使用的基本資源程式庫。
+ `awsglue.blueprint.workflow` – 用於定義 `Workflow` 類別的程式庫。
+ `awsglue.blueprint.job` – 用於定義 `Job` 類別的程式庫。
+ `awsglue.blueprint.crawler` – 用於定義 `Crawler` 類別的程式庫。

唯一支援配置產生的其他程式庫是可用於 Python Shell 的程式庫。

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

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

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

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

若想開發藍圖，您應先熟悉如何使用 AWS Glue 以及為 Apache Spark ETL 任務或 Python Shell 任務編寫指令碼。此外，您也必須完成下列設定任務。
+ 下載四個 AWS Python 程式庫以用於您的藍圖配置指令碼。
+ 設定 AWS SDKs。
+ 設定 AWS CLI。

## 下載 Python 程式庫
<a name="prereqs-get-libes"></a>

從 GitHub 下載以下程式庫，並將它們安裝到您的專案中：
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/base\$1resource.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/base_resource.py)
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/workflow.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/workflow.py)
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/crawler.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/crawler.py)
+ [https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/job.py](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/awsglue/blueprint/job.py)

## 設定 AWS Java 開發套件
<a name="prereqs-java-preview-sdk"></a>

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

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

1. 下載用戶端 `jar` 檔案，該檔案可以存取藍圖的 API。
   + 對於 Java 1.x：s3://awsglue-custom-blueprints-preview-artifacts/awsglue-java-sdk-preview/AWSGlueJavaClient-1.11.x.jar
   + 對於 Java 2.x：s3://awsglue-custom-blueprints-preview-artifacts/awsglue-java-sdk-v2-preview/AwsJavaSdk-Glue-2.0.jar

1. 將用戶端新增至 Java classpath `jar` 的正面，以覆寫 AWS Java 開發套件提供的 AWS Glue 用戶端。

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

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

   使用您的憑證取代 `accessKey` 和 `secretKey`，並用您的區域取代 `us-east-1`。

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

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

下列步驟假設您的電腦上已安裝 Python 2.7 版或更新版本，或 3.9 版或更新版本。

1. 下載以下 boto3 wheel 檔案。如果提示開啟或儲存，請儲存檔案。s3://awsglue-custom-blueprints-preview-artifacts/aws-python-sdk-preview/boto3-1.17.31-py2.py3-none-any.whl

1. 下載以下 botocore wheel 檔案：s3://awsglue-custom-blueprints-preview-artifacts/aws-python-sdk-preview/botocore-1.20.31-py2.py3-none-any.whl

1. 檢查 Python 版本。

   ```
   python --version
   ```

1. 根據您的 Python 版本，輸入下列指令 (適用於 Linux)：
   + 適用於 Python 2.7 或更新版本。

     ```
     python3 -m pip install --user virtualenv
     source env/bin/activate
     ```
   + 對於 Python 3.9 或更新版本。

     ```
     python3 -m venv python-sdk-test
     source python-sdk-test/bin/activate
     ```

1. 安裝 botocore wheel 檔案。

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

1. 安裝 boto3 wheel 檔案。

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

1. 在 `~/.aws/credentials` 和 `~/.aws/config` 檔案中設定您的憑證和預設區域。如需詳細資訊，請參閱 *AWS Command Line Interface 使用者指南*中的[設定 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。

1. (選用) 測試您的設定。以下命令應會傳回空的清單。

   將 `us-east-1` 取代為您的區域。

   ```
   $ python
   >>> import boto3
   >>> glue = boto3.client('glue', 'us-east-1')
   >>> glue.list_blueprints()
   ```

## 設定預覽 AWS CLI
<a name="prereqs-setup-cli"></a>

1. 如果您尚未這麼做，請在電腦上安裝和/或更新 AWS Command Line Interface (AWS CLI)。執行此動作最簡單的方法是使用 `pip` (Python 安裝程式公用程式)：

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

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

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

1. 安裝 AWS CLI wheel 檔案。

   ```
   python3 -m pip install awscli-1.19.31-py2.py3-none-any.whl
   ```

1. 執行 `aws configure` 命令。設定您的 AWS 登入資料 （包括存取金鑰和私密金鑰） 和 AWS 區域。您可以在 AWS CLI 此處找到設定 的相關資訊：[設定 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。

1. 測試 AWS CLI。以下命令應會傳回空的清單。

   將 `us-east-1` 取代為您的區域。

   ```
   aws glue list-blueprints --region us-east-1
   ```

# 撰寫藍圖程式碼
<a name="developing-blueprints-code"></a>

您建立的每個藍圖專案至少必須包含下列檔案：
+ 定義工作流程的 Python 配置指令碼。指令碼包含一個函數，用於定義工作流程中的實體 (任務和爬蟲程式)，以及它們之間的相依性。
+ 組態檔案 `blueprint.cfg`，它定義了：
  + 工作流程配置定義函數的完整路徑。
  + 藍圖接受的參數。

**Topics**
+ [建立藍圖配置指令碼](developing-blueprints-code-layout.md)
+ [建立組態檔案](developing-blueprints-code-config.md)
+ [指定藍圖參數](developing-blueprints-code-parameters.md)

# 建立藍圖配置指令碼
<a name="developing-blueprints-code-layout"></a>

藍圖配置指令碼必須包含在工作流程中產生實體的函數。您可以根據喜好命名此功能。AWS Glue 會使用組態檔來判斷函數的完整名稱。

您的配置函數會執行下列操作：
+ (選用) 執行個體化 `Job` 類別以建立 `Job` 物件，並傳遞 `Command` 和 `Role` 等引數。這些是您使用 AWS Glue 主控台或 API 建立任務時需要指定的任務屬性。
+ (選用) 執行個體化 `Crawler` 類別以建立 `Crawler` 物件，並傳遞名稱、角色和目標引數。
+ 若要指出物件 (工作流程實體) 之間的相依性，請傳遞 `DependsOn` 和 `WaitForDependencies` 附加引數至 `Job()` 和 `Crawler()`。本節稍後會說明這些引數。
+ 執行個體化 `Workflow` 類別來建立傳回至 AWS Glue 的工作流程物件，傳遞 `Name` 引數、`Entities` 引數，以及選用的 `OnSchedule` 引數。`Entities` 引數會指定工作流程中要包含的所有任務和爬蟲程式。若要了解如何建構 `Entities` 物件的詳細資訊，請參閱本節稍後提供的範例專案。
+ 傳回 `Workflow` 物件。

如需 `Job`、`Crawler` 及 `Workflow` 類別的定義，請參閱[AWS Glue 藍圖類別參考](developing-blueprints-code-classes.md)。

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


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

以下是名為 `Layout.py` 的檔案中的範例配置產生器指令碼：

```
import argparse
import sys
import os
import json
from awsglue.blueprint.workflow import *
from awsglue.blueprint.job import *
from awsglue.blueprint.crawler import *


def generate_layout(user_params, system_params):

    etl_job = Job(Name="{}_etl_job".format(user_params['WorkflowName']),
                  Command={
                      "Name": "glueetl",
                      "ScriptLocation": user_params['ScriptLocation'],
                      "PythonVersion": "2"
                  },
                  Role=user_params['PassRole'])
    post_process_job = Job(Name="{}_post_process".format(user_params['WorkflowName']),
                            Command={
                                "Name": "pythonshell",
                                "ScriptLocation": user_params['ScriptLocation'],
                                "PythonVersion": "2"
                            },
                            Role=user_params['PassRole'],
                            DependsOn={
                                etl_job: "SUCCEEDED"
                            },
                            WaitForDependencies="AND")
    sample_workflow = Workflow(Name=user_params['WorkflowName'],
                            Entities=Entities(Jobs=[etl_job, post_process_job]))
    return sample_workflow
```

範例指令碼會匯入所需的藍圖程式庫，並包含會產生具有兩個任務之工作流程的 `generate_layout` 函數。這是一個非常簡單的指令碼。較複雜的指令碼可以使用額外的邏輯和參數來產生包含許多任務和爬蟲程式 (甚至包含可變數量的任務和爬蟲程式) 的工作流程。

## 使用 DependsOn 引數
<a name="developing-blueprints-code-layout-depends-on"></a>

`DependsOn` 引數是此實體對工作流程中其他實體之相依性的字典表示。其具有如下格式。

```
DependsOn = {dependency1 : state, dependency2 : state, ...}
```

此字典中的索引鍵代表實體的物件參考，而不是名稱，而值是對應於要監視之狀態的字串。AWS Glue 會推斷適當的觸發程序。如需有效狀態，請參閱[條件結構](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-trigger.html#aws-glue-api-jobs-trigger-Condition)。

例如，任務可能取決於爬蟲程式是否成功完成。如果您定義名為 `crawler2` 的爬蟲程式物件，如下所示：

```
crawler2 = Crawler(Name="my_crawler", ...)
```

那麼依賴 `crawler2` 的物件將包含一個建構函數引數，例如：

```
DependsOn = {crawler2 : "SUCCEEDED"}
```

例如：

```
job1 = Job(Name="Job1", ..., DependsOn = {crawler2 : "SUCCEEDED", ...})
```

如果實體省略 `DependsOn`，則該實體取決於工作流程啟動觸發。

## 使用 WaitForDependencies 引數
<a name="developing-blueprints-code-layout-wait-for-dependencies"></a>

`WaitForDependencies` 引數定義任務或爬蟲程式實體應該等到它依賴的*所有*實體都完成，還是等到*任何*實體完成。

允許的值是「`AND`」或「`ANY`」。

## 使用 OnSchedule 引數
<a name="developing-blueprints-code-layout-on-schedule"></a>

`Workflow` 類別建構函數的 `OnSchedule` 引數是 `cron` 表達式，定義工作流程的啟動觸發定義。

如果指定此引數，AWS Glue 會建立具有對應排程的排程觸發程序。若未指定，工作流程的啟動觸發是隨需觸發。

# 建立組態檔案
<a name="developing-blueprints-code-config"></a>

藍圖組態檔是必要檔案，定義用於產生工作流程的指令碼進入點，以及藍圖接受的參數。這個檔案必須命名為 `blueprint.cfg`。

以下是範例組態檔。

```
{
    "layoutGenerator": "DemoBlueprintProject.Layout.generate_layout",
    "parameterSpec" : {
           "WorkflowName" : {
                "type": "String",
                "collection": false
           },
           "WorkerType" : {
                "type": "String",
                "collection": false,
                "allowedValues": ["G1.X", "G2.X"],
                "defaultValue": "G1.X"
           },
           "Dpu" : {
                "type" : "Integer",
                "allowedValues" : [2, 4, 6],
                "defaultValue" : 2
           },
           "DynamoDBTableName": {
                "type": "String",
                "collection" : false
           },
           "ScriptLocation" : {
                "type": "String",
                "collection": false
    	}
    }
}
```

`layoutGenerator` 屬性會在產生配置的指令碼中指定函數的完整名稱。

`parameterSpec` 屬性指定此藍圖接受的參數。如需詳細資訊，請參閱[指定藍圖參數](developing-blueprints-code-parameters.md)。

**重要**  
您的組態檔案必須包含工作流程名稱做為藍圖參數，或者您必須在配置指令碼中產生唯一的工作流程名稱。

# 指定藍圖參數
<a name="developing-blueprints-code-parameters"></a>

組態檔案在 `parameterSpec` JSON 物件中包含藍圖參數規格。`parameterSpec` 包含一或多個參數物件。

```
"parameterSpec": {
    "<parameter_name>": {
      "type": "<parameter-type>",
      "collection": true|false, 
      "description": "<parameter-description>",
      "defaultValue": "<default value for the parameter if value not specified>"
      "allowedValues": "<list of allowed values>" 
    },
    "<parameter_name>": {    
       ...
    }
  }
```

以下是為每個參數物件編寫程式碼的規則：
+ 參數名稱和 `type` 是必要的。所有其他屬性是選用的。
+ 如果您指定 `defaultValue` 屬性，則參數是選用的。否則，參數是必要的，且從藍圖建立工作流程的資料分析師必須為其提供值。
+ 如果您將 `collection` 屬性設定為 `true`，則參數可以採取值集合。集合可以是任何資料類型。
+ 如果您指定 `allowedValues`，則 AWS Glue 主控台會顯示值的下拉式清單，供資料分析師從藍圖建立工作流程時選擇。

以下是 `type` 的允許值：


| 參數資料類型 | 備註 | 
| --- | --- | 
| String | - | 
| Integer | - | 
| Double | - | 
| Boolean | 可能值為 true 和 false。在 AWS Glue 主控台的 Create a workflow from <blueprint> (從 <藍圖> 建立工作流程) 頁面上產生核取方塊。 | 
| S3Uri | 完整的 Amazon S3 路徑，開頭為 s3://。在 Create a workflow from <blueprint> (從 <藍圖> 建立工作流程) 頁面上產生文字欄位和 Browse (瀏覽) 按鈕。 | 
| S3Bucket | 僅限 Amazon S3 儲存貯體名稱。在 Create a workflow from <blueprint> (從 <藍圖> 建立工作流程) 頁面上產生儲存貯體選擇器。 | 
| IAMRoleArn | (IAM) 角色的 Amazon Resource Name AWS Identity and Access Management (ARN)。在 Create a workflow from <blueprint> (從 <藍圖> 建立工作流程) 頁面上產生角色選擇器。 | 
| IAMRoleName | IAM 角色的名稱。在 Create a workflow from <blueprint> (從 <藍圖> 建立工作流程) 頁面上產生角色選擇器。 | 

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

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

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

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

以下是檔案 `Layout.py` 中的配置指令碼。

```
from awsglue.blueprint.workflow import *
from awsglue.blueprint.job import *
from awsglue.blueprint.crawler import *
import boto3

s3_client = boto3.client('s3')

# Ingesting all the S3 paths as Glue table in parquet format
def generate_layout(user_params, system_params):
    #Always give the full path for the file
    with open("ConversionBlueprint/Conversion.py", "rb") as f:
        s3_client.upload_fileobj(f, user_params['ScriptsBucket'], "Conversion.py")
    etlScriptLocation = "s3://{}/Conversion.py".format(user_params['ScriptsBucket'])    
    crawlers = []
    jobs = []
    workflowName = user_params['WorkflowName']
    for path in user_params['S3Paths']:
      tablePrefix = "source_" 
      crawler = Crawler(Name="{}_crawler".format(workflowName),
                        Role=user_params['PassRole'],
                        DatabaseName=user_params['TargetDatabase'],
                        TablePrefix=tablePrefix,
                        Targets= {"S3Targets": [{"Path": path}]})
      crawlers.append(crawler)
      transform_job = Job(Name="{}_transform_job".format(workflowName),
                         Command={"Name": "glueetl",
                                  "ScriptLocation": etlScriptLocation,
                                  "PythonVersion": "3"},
                         Role=user_params['PassRole'],
                         DefaultArguments={"--database_name": user_params['TargetDatabase'],
                                           "--table_prefix": tablePrefix,
                                           "--region_name": system_params['region'],
                                           "--output_path": user_params['TargetS3Location']},
                         DependsOn={crawler: "SUCCEEDED"},
                         WaitForDependencies="AND")
      jobs.append(transform_job)
    conversion_workflow = Workflow(Name=workflowName, Entities=Entities(Jobs=jobs, Crawlers=crawlers))
    return conversion_workflow
```

以下是對應的藍圖組態檔 `blueprint.cfg`。

```
{
    "layoutGenerator": "ConversionBlueprint.Layout.generate_layout",
    "parameterSpec" : {
        "WorkflowName" : {
            "type": "String",
            "collection": false,
            "description": "Name for the workflow."
        },
        "S3Paths" : {
            "type": "S3Uri",
            "collection": true,
            "description": "List of Amazon S3 paths for data ingestion."
        },
        "PassRole" : {
            "type": "IAMRoleName",
            "collection": false,
            "description": "Choose an IAM role to be used in running the job/crawler"
        },
        "TargetDatabase": {
            "type": "String",
            "collection" : false,
            "description": "Choose a database in the Data Catalog."
        },
        "TargetS3Location": {
            "type": "S3Uri",
            "collection" : false,
            "description": "Choose an Amazon S3 output path: ex:s3://<target_path>/."
        },
        "ScriptsBucket": {
            "type": "S3Bucket",
            "collection": false,
            "description": "Provide an S3 bucket name(in the same AWS Region) to store the scripts."
        }
    }
}
```

檔案 `Conversion.py` 中的以下指令碼是上傳的 ETL 指令碼。請注意，它在轉換過程中會保留分割結構。

```
import sys
from pyspark.sql.functions import *
from pyspark.context import SparkContext
from awsglue.transforms import *
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.utils import getResolvedOptions
import boto3

args = getResolvedOptions(sys.argv, [
    'JOB_NAME',
    'region_name',
    'database_name',
    'table_prefix',
    'output_path'])
databaseName = args['database_name']
tablePrefix = args['table_prefix']
outputPath = args['output_path']

glue = boto3.client('glue', region_name=args['region_name'])

glue_context = GlueContext(SparkContext.getOrCreate())
spark = glue_context.spark_session
job = Job(glue_context)
job.init(args['JOB_NAME'], args)

def get_tables(database_name, table_prefix):
    tables = []
    paginator = glue.get_paginator('get_tables')
    for page in paginator.paginate(DatabaseName=database_name, Expression=table_prefix+"*"):
        tables.extend(page['TableList'])
    return tables

for table in get_tables(databaseName, tablePrefix):
    tableName = table['Name']
    partitionList = table['PartitionKeys']
    partitionKeys = []
    for partition in partitionList:
        partitionKeys.append(partition['Name'])

    # Create DynamicFrame from Catalog
    dyf = glue_context.create_dynamic_frame.from_catalog(
        name_space=databaseName,
        table_name=tableName,
        additional_options={
            'useS3ListImplementation': True
        },
        transformation_ctx='dyf'
    )

    # Resolve choice type with make_struct
    dyf = ResolveChoice.apply(
        frame=dyf,
        choice='make_struct',
        transformation_ctx='resolvechoice_' + tableName
    )

    # Drop null fields
    dyf = DropNullFields.apply(
        frame=dyf,
        transformation_ctx="dropnullfields_" + tableName
    )

    # Write DynamicFrame to S3 in glueparquet
    sink = glue_context.getSink(
        connection_type="s3",
        path=outputPath,
        enableUpdateCatalog=True,
        partitionKeys=partitionKeys
    )
    sink.setFormat("glueparquet")

    sink.setCatalogInfo(
        catalogDatabase=databaseName,
        catalogTableName=tableName[len(tablePrefix):]
    )
    sink.writeFrame(dyf)

job.commit()
```

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

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

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

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

有兩種方式可以處理 AWS Glue 傳遞給您配置函數的 `user_params` 和 `system_params` 引數。您的測試工作台程式碼可以建立範例藍圖參數值的字典，並將其作為 `user_params` 引數傳遞給配置函數。或者，您也可以移除對 `user_params` 的參考並用硬式編碼字串替換它們。

如果您的程式碼在 `system_params` 引數中使用 `region` 和 `accountId` 屬性，您可以傳入自己的 `system_params` 字典。

**測試藍圖**

1. 在具有程式庫的目錄中啟動 Python 解釋器，或將藍圖檔案和提供的程式庫載入到您偏好的整合開發環境 (IDE)。

1. 確保您的程式碼匯入提供的程式庫。

1. 將程式碼新增到配置函數以在任何實體或 `Workflow` 物件上呼叫 `validate()` 或 `to_json()`。例如，如果您的程式碼建立名為 `mycrawler` 的 `Crawler` 物件，您可以如下所示呼叫 `validate()`。

   ```
   mycrawler.validate()
   ```

   您可以如下所示列印 `mycrawler`：

   ```
   print(mycrawler.to_json())
   ```

   如果您在物件上呼叫 `to_json`，則不需要同時呼叫 `validate()`，因為 ` to_json()` 會呼叫 `validate()`。

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

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

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

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

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

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

```
from pprint import pprint
from awsglue.blueprint.workflow import *
from awsglue.blueprint.job import *
from awsglue.blueprint.crawler import *
 
USER_PARAMS = {"WorkflowName": "compaction_workflow",
               "ScriptLocation": "s3://amzn-s3-demo-bucket/scripts/threaded-compaction.py",
               "PassRole": "arn:aws:iam::111122223333:role/GlueRole-ETL",
               "DatabaseName": "cloudtrial",
               "TableName": "ct_cloudtrail",
               "CoalesceFactor": 4,
               "MaxThreadWorkers": 200}
 
 
def generate_compaction_workflow(user_params: dict, system_params: dict) -> Workflow:
    compaction_job = Job(Name=f"{user_params['WorkflowName']}_etl_job",
                         Command={"Name": "glueetl",
                                  "ScriptLocation": user_params['ScriptLocation'],
                                  "PythonVersion": "3"},
                         Role="arn:aws:iam::111122223333:role/AWSGlueServiceRoleDefault",
                         DefaultArguments={"DatabaseName": user_params['DatabaseName'],
                                           "TableName": user_params['TableName'],
                                           "CoalesceFactor": user_params['CoalesceFactor'],
                                           "max_thread_workers": user_params['MaxThreadWorkers']})
 
    catalog_target = {"CatalogTargets": [{"DatabaseName": user_params['DatabaseName'], "Tables": [user_params['TableName']]}]}
 
    compacted_files_crawler = Crawler(Name=f"{user_params['WorkflowName']}_post_crawl",
                                      Targets = catalog_target,
                                      Role=user_params['PassRole'],
                                      DependsOn={compaction_job: "SUCCEEDED"},
                                      WaitForDependencies="AND",
                                      SchemaChangePolicy={"DeleteBehavior": "LOG"})
 
    compaction_workflow = Workflow(Name=user_params['WorkflowName'],
                                   Entities=Entities(Jobs=[compaction_job],
                                                     Crawlers=[compacted_files_crawler]))
    return compaction_workflow
 
generated = generate_compaction_workflow(user_params=USER_PARAMS, system_params={})
gen_dict = generated.to_json()
 
pprint(gen_dict)
```

# 發佈藍圖
<a name="developing-blueprints-publishing"></a>

開發藍圖後，您必須將它上傳至 Amazon S3。您必須擁有用於發佈藍圖的 Amazon S3 儲存貯體的寫入許可。您也必須確定負責註冊藍圖的 AWS Glue 管理員具有 Amazon S3 儲存貯體的讀取存取。如需AWS Glue藍圖角色和角色的建議 AWS Identity and Access Management (IAM) 許可政策，請參閱 [AWS Glue 藍圖的人物和角色許可](blueprints-personas-permissions.md)。

**發佈藍圖**

1. 建立必要的指令碼、資源和藍圖組態檔。

1. 將所有檔案新增到 ZIP 封存，然後將 ZIP 檔案上傳到 Amazon S3。使用與使用者註冊和執行藍圖之區域相同區域的 S3 儲存貯體。

   您可以使用以下命令，從命令列建立 ZIP 檔案。

   ```
   zip -r folder.zip folder
   ```

1. 新增儲存貯體政策，將讀取許可授予 AWS 所需的帳戶。以下是政策範例。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::111122223333:root"
         },
         "Action": "s3:GetObject",
         "Resource": "arn:aws:s3:::my-blueprints/*"
       }
     ]
   }
   ```

------

1. 授予 Amazon S3 儲存貯體上的 IAM `s3:GetObject` 許可給 AWS Glue 管理員或負責註冊藍圖的人員。如需授予管理員的範例政策，請參閱[藍圖的 AWS Glue 管理員許可](blueprints-personas-permissions.md#bp-persona-admin)。

完成藍圖的本機測試後，您可能也想要在 AWS Glue 上測試藍圖。若要在 AWS Glue 上測試藍圖，必須對其進行註冊。您可以使用 IAM 授權或使用個別測試帳戶來限制誰可以看到註冊的藍圖。

**另請參閱：**  
[在 AWS Glue 中註冊藍圖](registering-blueprints.md)

# AWS Glue 藍圖類別參考
<a name="developing-blueprints-code-classes"></a>

AWS Glue 藍圖的程式庫會定義您在工作流程配置指令碼中使用的三個類別：`Job`、`Crawler` 及 `Workflow`。

**Topics**
+ [Job 類別](#developing-blueprints-code-jobclass)
+ [Crawler 類別](#developing-blueprints-code-crawlerclass)
+ [Workflow 類別](#developing-blueprints-code-workflowclass)
+ [Class 方法](#developing-blueprints-code-methods)

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

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

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


| 引數名稱 | Type | 說明 | 
| --- | --- | --- | 
| Name | str | 要指派給任務的名稱。AWS Glue 會在名稱中新增隨機產生的尾碼，以區分任務與其他藍圖執行所建立的任務。 | 
| Role | str | 任務在執行時應擔任角色的 Amazon Resource Name (ARN)。 | 
| Command | dict | Job 命令，如 API 文件中的 [JobCommand 結構](aws-glue-api-jobs-job.md#aws-glue-api-jobs-job-JobCommand) 所指定。 | 

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


| 引數名稱 | Type | 說明 | 
| --- | --- | --- | 
| DependsOn | dict | 任務所依賴的工作流程實體清單。如需詳細資訊，請參閱[使用 DependsOn 引數](developing-blueprints-code-layout.md#developing-blueprints-code-layout-depends-on)。 | 
| WaitForDependencies | str | 指出任務應該等到它依賴的所有實體都完成，還是等到任何實體完成，然後再執行。如需詳細資訊，請參閱[使用 WaitForDependencies 引數](developing-blueprints-code-layout.md#developing-blueprints-code-layout-wait-for-dependencies)。如果任務僅依賴於一個實體，則省略。 | 
| (Job 屬性) | - | AWS Glue API 文件 [Job 結構](aws-glue-api-jobs-job.md#aws-glue-api-jobs-job-Job) 中列出的任何任務屬性 (CreatedOn 和 LastModifiedOn 除外)。 | 

## Crawler 類別
<a name="developing-blueprints-code-crawlerclass"></a>

`Crawler` 類別代表 AWS Glue 爬蟲程式。

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


| 引數名稱 | Type | 說明 | 
| --- | --- | --- | 
| Name | str | 要指派給任務的名稱。AWS Glue 會在名稱中新增隨機產生的尾碼，以區分爬蟲程式與其他藍圖執行所建立的爬蟲程式。 | 
| Role | str | 爬蟲程式執行時應擔任角色的 ARN。 | 
| Targets | dict | 待編目的目標集合。Targets 類別建構函數引數定義於 API 文件中的 [CrawlerTargets 結構](aws-glue-api-crawler-crawling.md#aws-glue-api-crawler-crawling-CrawlerTargets)。所有 Targets 建構函數引數都是選用的，但您必須至少傳遞一個。 | 

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


| 引數名稱 | Type | 說明 | 
| --- | --- | --- | 
| DependsOn | dict | 爬蟲程式所依賴的工作流程實體清單。如需詳細資訊，請參閱[使用 DependsOn 引數](developing-blueprints-code-layout.md#developing-blueprints-code-layout-depends-on)。 | 
| WaitForDependencies | str | 指出爬蟲程式應該等到它依賴的所有實體都完成，還是等到任何實體完成，然後再執行。如需詳細資訊，請參閱[使用 WaitForDependencies 引數](developing-blueprints-code-layout.md#developing-blueprints-code-layout-wait-for-dependencies)。如果爬蟲程式只依賴一個實體，則省略。 | 
| (Crawler 屬性) | - | AWS Glue API 文件 [Crawler 結構](aws-glue-api-crawler-crawling.md#aws-glue-api-crawler-crawling-Crawler) 中列出的任何爬蟲程式屬性，但以下項目除外：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/developing-blueprints-code-classes.html) | 

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

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

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


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

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


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

## Class 方法
<a name="developing-blueprints-code-methods"></a>

所有這三個類別包括以下方法。

**validate()**  
驗證物件的屬性，如果發現錯誤，則輸出訊息並結束。如果沒有錯誤，則不會產生輸出。對於 `Workflow` 類別，在工作流程中的每個實體上呼叫自己。

**to\$1json()**  
將物件序列化為 JSON。也會呼叫 `validate()`。對於 `Workflow` 類別，JSON 物件包含任務和爬蟲程式清單，以及任務和爬蟲程式相依性規格所產生的觸發清單。

# 藍圖範例
<a name="developing-blueprints-samples"></a>

[AWS Glue 藍圖 Github 儲存庫](https://github.com/awslabs/aws-glue-blueprint-libs/tree/master/samples)提供許多範例藍圖專案。這些範例僅供參考，並非作為生產用途。

範例專案的標題如下：
+ 壓縮：此藍圖會建立任務，根據所需的檔案大小，將輸入檔案壓縮成較大的區塊。
+ 轉換：此藍圖會將各種標準檔案格式的輸入檔案轉換為 Apache Prquet 格式，並針對分析工作負載進行最佳化。
+ 網路爬取 Amazon S3 位置：此藍圖會網路爬取多個 Amazon S3 位置，以將中繼資料表新增至 Data Catalog 。
+ 自訂連線至 Data Catalog：此藍圖會使用AWS Glue自訂連接器存取資料存放區、讀取記錄，並根據記錄結構描述填入 AWS Glue Data Catalog 中的資料表定義。
+ 編碼：此藍圖會將非 UTF 檔案轉換為 UTF 編碼檔案。
+ 分割：此藍圖會建立分割任務，根據特定分割索引鍵將輸出檔案放置到分割區。
+ 將 Amazon S3 資料匯入到 DynamoDB 資料表：此藍圖會將資料從 Amazon S3 匯入到 DynamoDB 資料表。
+ 要管理的標準資料表：此藍圖會將 AWS Glue Data Catalog 資料表匯入 Lake Formation 資料表。

# 在 AWS Glue 中註冊藍圖
<a name="registering-blueprints"></a>

AWS Glue 開發人員已編寫藍圖並將 ZIP 封存上傳到 Amazon Simple Storage Service (Amazon S3) 之後，AWS Glue 管理員必須註冊藍圖。註冊藍圖以讓其可供使用。

當您註冊藍圖時，AWS Glue 會將藍圖封存複製到保留的 Amazon S3 位置。然後，您可以從上傳位置刪除封存。

若要註冊藍圖，您需要具備包含上傳封存的 Amazon S3 位置的讀取許可。您也需要 AWS Identity and Access Management (IAM) 許可 `glue:CreateBlueprint`。如需必須註冊、檢視和維護藍圖的 AWS Glue 管理員的建議許可，請參閱 [藍圖的 AWS Glue 管理員許可](blueprints-personas-permissions.md#bp-persona-admin)。

您可以使用 AWS Glue 主控台、AWS Glue API，或 AWS Command Line Interface (AWS CLI) 註冊藍圖。

**註冊藍圖 (主控台)**

1. 確保您對 Amazon S3 中的藍圖 ZIP 封存具有讀取許可 (`s3:GetObject`)。

1. 前往 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

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

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

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

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

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

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

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

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

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

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

   [藍圖的資料分析師許可](blueprints-personas-permissions.md#bp-persona-analyst) 中顯示適用於資料分析師的建議 IAM 政策。此政策授予任何資源上的 `glue:GetBlueprint`。如果您的政策在資源層級更精細，請授與資料分析師對此新建立資源的許可。

**註冊藍圖 (AWS CLI)**

1. 輸入以下命令。

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

1. 如要檢查藍圖狀態，請輸入以下命令。重複此指令，直到狀態變為 `ACTIVE` 或 `FAILED`。

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

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

**另請參閱：**  
[AWS Glue 中的藍圖概觀](blueprints-overview.md)

# 檢視 AWS Glue 中的藍圖
<a name="viewing_blueprints"></a>

檢視藍圖可以檢閱藍圖描述、狀態和參數規格，以及下載藍圖 ZIP 封存。

您可以使用 AWS Glue 主控台、AWS Glue API 或 AWS Command Line Interface (AWS CLI) 來檢視藍圖。

**檢視藍圖 (主控台)**

1. 開啟位於 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 的 AWS Glue 主控台。

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

1. 在 **blueprints** (藍圖) 頁面上，選取藍圖。然後在 **Actions (動作)** 選單，選擇 **View (檢視)**。

**檢視藍圖 (AWS CLI)**
+ 輸入下列命令以僅檢視藍圖名稱、描述和狀態。將 *<blueprint-name>* 替換為要檢視的藍圖名稱。

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

  命令輸出類似如下所示。

  ```
  {
      "Blueprint": {
          "Name": "myDemoBP",
          "CreatedOn": 1587414516.92,
          "LastModifiedOn": 1587428838.671,
          "BlueprintLocation": "s3://amzn-s3-demo-bucket1/demo/DemoBlueprintProject.zip",
          "Status": "ACTIVE"
      }
  }
  ```

  輸入以下命令，也可以檢視參數規格。

  ```
  aws glue get-blueprint --name <blueprint-name>  --include-parameter-spec
  ```

  命令輸出類似如下所示。

  ```
  {
      "Blueprint": {
          "Name": "myDemoBP",
          "CreatedOn": 1587414516.92,
          "LastModifiedOn": 1587428838.671,
          "ParameterSpec": "{\"WorkflowName\":{\"type\":\"String\",\"collection\":false,\"description\":null,\"defaultValue\":null,\"allowedValues\":null},\"PassRole\":{\"type\":\"String\",\"collection\":false,\"description\":null,\"defaultValue\":null,\"allowedValues\":null},\"DynamoDBTableName\":{\"type\":\"String\",\"collection\":false,\"description\":null,\"defaultValue\":null,\"allowedValues\":null},\"ScriptLocation\":{\"type\":\"String\",\"collection\":false,\"description\":null,\"defaultValue\":null,\"allowedValues\":null}}",
          "BlueprintLocation": "s3://awsexamplebucket1/demo/DemoBlueprintProject.zip",
          "Status": "ACTIVE"
      }
  }
  ```

  新增 `--include-blueprint` 引數以在輸出中包含 URL，您可以貼到瀏覽器中，來下載 AWS Glue 儲存的藍圖 ZIP 封存。

**另請參閱：**  
[AWS Glue 中的藍圖概觀](blueprints-overview.md)

# 更新 AWS Glue 中的藍圖
<a name="updating_blueprints"></a>

如果您有修訂配置指令碼、已修訂的藍圖參數集或已修訂的支援檔案，則可以更新藍圖。更新藍圖會建立新的版本。

更新藍圖不會影響從藍圖建立的現有工作流程。

您可以使用 AWS Glue 主控台、AWS Glue API 或 AWS Command Line Interface (AWS CLI) 更新藍圖。

下列處理程序假設 AWS Glue 開發人員已建立並上傳更新的藍圖 ZIP 封存到 Amazon S3。

**更新藍圖 (主控台)**

1. 確保您對 Amazon S3 中的藍圖 ZIP 封存具有讀取許可 (`s3:GetObject`)。

1. 前往 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

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

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

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

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

1. 選擇**儲存**。

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

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

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

**更新藍圖 (AWS CLI)**

1. 輸入以下命令。

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

1. 如要檢查藍圖狀態，請輸入以下命令。重複此指令，直到狀態變為 `ACTIVE` 或 `FAILED`。

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

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

**另請參閱**  
[AWS Glue 中的藍圖概觀](blueprints-overview.md)

# 在 AWS Glue 中從藍圖建立工作流程
<a name="creating_workflow_blueprint"></a>

您可以手動建立 AWS Glue 工作流程，一次新增一個元件，或者您可以從 AWS Glue [藍圖](blueprints-overview.md)建立工作流程。AWS Glue 包含常見使用案例的藍圖。您的 AWS Glue 開發人員可以建立額外的藍圖。

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

使用藍圖時，您可以根據藍圖定義的一般使用案例，快速產生特定使用案例的工作流程。您可以透過為藍圖參數提供值來定義特定的使用案例。例如，對資料集進行分割的藍圖可以將 Amazon S3 來源和目標路徑做為參數。

AWS Glue 透過*執行*藍圖，從藍圖建立工作流程。藍圖執行會儲存您提供的參數值，並用於追蹤建立工作流程及其元件的進度和結果。疑難排解工作流程時，您可以檢視藍圖執行以決定用於建立工作流程的藍圖參數值。

若要建立和檢視工作流程，您需要特定 IAM 許可。如需建議的 IAM 政策，請參閱 [藍圖的資料分析師許可](blueprints-personas-permissions.md#bp-persona-analyst)。

您可以使用 AWS Glue 主控台、AWS Glue API 或 AWS Command Line Interface (AWS CLI) 來從藍圖建立工作流程。

**從藍圖建立工作流程 (主控台)**

1. 開啟位於 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 的 AWS Glue 主控台。

   以具有建立工作流程許可的使用者身分登入。

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

1. 選取藍圖，然後在 **Actions (動作)** 選單，選擇 **Create workflow (建立工作流程)**。

1. 在 **Create a workflow from <blueprint-name> (從 <藍圖名稱> 建立工作流程)** 頁面上，輸入下列資訊：  
**藍圖參數**  
這些因藍圖設計而異。如需這些參數的相關問題資訊，請聯絡開發人員。藍圖通常包含工作流程名稱的參數。  
**IAM 角色**  
AWS Glue 擔任之用來建立工作流程及其元件的角色。此角色必須擁有建立和刪除工作流程、任務、爬蟲程式和觸發的許可。如需角色的建議政策，請參閱[藍圖角色的許可](blueprints-personas-permissions.md#blueprints-role-permissions)。

1. 選擇**提交**。

   **Blueprint Details (藍圖詳細資訊)** 頁面出現，並在底部顯示藍圖執行清單。

1. 在藍圖執行清單中，檢查最上層的藍圖執行以取得工作流程建立狀態。

   起始狀態為 `RUNNING`。選擇重新整理按鈕，直到狀態變為 `SUCCEEDED` 或 `FAILED`。

1. 執行以下任意一項：
   + 如果完成狀態為 `SUCCEEDED`，您可以移至 **Workflows (工作流程)** 頁面，選取新建立的工作流程，然後執行它。在執行工作流程之前，您可以先檢閱設計圖形。
   + 如果狀態為 `FAILED`，請選取藍圖執行，然後在 **Actions (動作)** 功能表，選擇 **View (檢視)** 以查看錯誤訊息。

如需工作流程和藍圖的詳細資訊，請參閱下列主題。
+ [AWS Glue 中的工作流程概觀](workflows_overview.md)
+ [更新 AWS Glue 中的藍圖](updating_blueprints.md)
+ [在 AWS Glue 中手動建立和建構工作流程](creating_running_workflows.md)

# 檢視 AWS Glue 中的藍圖執行
<a name="viewing_blueprint_runs"></a>

檢視藍圖執行以查看下列資訊：
+ 已建立的工作流程名稱。
+ 用於建立工作流程的藍圖參數值。
+ 工作流程建立操作的狀態。

您可以使用 AWS Glue 主控台、AWS Glue API 或 AWS Command Line Interface (AWS CLI) 檢視藍圖執行。

**檢視藍圖執行 (主控台)**

1. 開啟位於 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 的 AWS Glue 主控台。

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

1. 在 **blueprints** (藍圖) 頁面上，選取藍圖。然後在 **Actions (動作)** 選單，選擇 **View (檢視)**。

1. 在 **Blueprint Details (藍圖詳細資訊)** 頁面底部，選取藍圖執行，然後在 **Actions (動作)** 選單，選擇 **View (檢視)**。

**檢視藍圖 (AWS CLI)**
+ 輸入以下命令。將 *<blueprint-name>* 替換為藍圖的名稱。將 *<blueprint-run-id>* 替換為藍圖執行 ID。

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

**另請參閱：**  
[AWS Glue 中的藍圖概觀](blueprints-overview.md)