

# 在 AWS Glue 中使用 Git 版本控制系统
<a name="edit-job-add-source-control-integration"></a>

**注意**  
 AWS Glue Studio 中目前不支持笔记本电脑进行版本控制。但是，支持 AWS Glue 作业脚本和可视化 ETL 作业的版本控制。

 如果您有远程存储库，并且想要使用存储库管理 AWS Glue 作业，则可以使用 AWS Glue Studio 或 AWS CLI，将更改同步到您的存储库和 AWS Glue 中的作业。以这种方式同步更改时，就是在将作业从 AWS Glue Studio 推送到存储库，或者从存储库中提取到 AWS Glue Studio。

 通过在 AWS Glue Studio 中集成 Git，您可以：
+  与 AWS CodeCommit、GitHub、GitLab 和 Bitbucket 等 Git 版本控制系统集成 
+  编辑 AWS Glue Studio 中的 AWS Glue 作业（无论是使用可视化作业还是脚本作业）并将它们同步到存储库 
+  参数化作业中的源和目标 
+  从存储库中提取作业并在 AWS Glue Studio 中进行编辑 
+  使用 AWS Glue Studio 中的多分支工作流从分支提取和/或推送到分支，以此测试作业 
+  从存储库下载文件并将任务上传到 AWS Glue Studio 以创建跨账户作业 
+  使用选择的自动化工具（例如 Jenkins、AWS CodeDeploy 等） 

这段视频演示了如何将 AWS Glue 与 Git 集成并构建持续的协作代码管道。

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


## IAM 权限
<a name="git-integration-permissions"></a>

 确保作业具有下列 IAM 权限之一。有关如何设置 IAM 权限的更多信息，请参阅[为 AWS Glue Studio 设置 IAM 权限](https://docs.aws.amazon.com/glue/latest/ug/setting-up.html?icmpid=docs_glue_studio_helppanel#getting-started-iam-permissions)。
+ `AWSGlueServiceRole`
+ `AWSGlueConsoleFullAccess`

 Git 集成至少需要以下操作：
+  `glue:UpdateJobFromSourceControl` — 能够使用版本控制系统中存在的作业更新 AWS Glue 
+  `glue:UpdateSourceControlFromJob` — 能够使用存储在 AWS Glue 中的作业更新版本控制系统 
+  `s3:GetObject` — 能够在推送到版本控制系统的同时检索作业脚本 
+  `s3:PutObject` — 能够在从源代码控制系统提取作业时更新脚本 

## 先决条件
<a name="edit-job-push-source-repository-prerequisites"></a>

 要将作业推送到源代码控制存储库，您需要：
+  您的管理员已经创建的存储库 
+  存储库中的一个分支 
+  个人访问令牌（对于 Bitbucket，这是存储库访问令牌） 
+  存储库所有者的用户名 
+  在存储库中设置权限以允许 AWS Glue Studio 读取和写入存储库 
  +  **GitLab** – 将令牌范围设置为 api、read\_repository 和 write\_repository 
  +  **Bitbucket** – 将权限设置为：
    + **工作区成员资格** – 读取、写入
    + **项目** – 写入，管理员读取
    + **存储库** – 读取、写入、管理、删除

**注意**  
 使用 AWS CodeCommit 时，不需要个人访问令牌和存储库所有者。请参阅 [Git 和 AWS CodeCommit 入门](https://docs.aws.amazon.com/codecommit/latest/userguide/getting-started.html)。

 **在 AWS Glue Studio 中使用源代码控制存储库中的作业** 

 要从源代码控制存储库提取不在 AWS Glue Studio 中的作业，然后在 AWS Glue Studio 中使用该作业，先决条件将取决于作业的类型。

 **对于可视化作业：**
+  您需要与作业名称相匹配的文件夹和作业定义 JSON 文件 

   例如，请参阅下面的作业定义。存储库中的分支应包含路径 `my-visual-job/my-visual-job.json`，其中文件夹和 JSON 文件与作业名称匹配 

  ```
  {
    "name" : "my-visual-job",
    "description" : "",
    "role" : "arn:aws:iam::aws_account_id:role/Rolename",
    "command" : {
      "name" : "glueetl",
      "scriptLocation" : "s3://foldername/scripts/my-visual-job.py",
      "pythonVersion" : "3"
    },
    "codeGenConfigurationNodes" : "{\"node-nodeID\":{\"S3CsvSource\":{\"AdditionalOptions\":{\"EnableSamplePath\":false,\"SamplePath\":\"s3://notebook-test-input/netflix_titles.csv\"},\"Escaper\":\"\",\"Exclusions\":[],\"Name\":\"Amazon S3\",\"OptimizePerformance\":false,\"OutputSchemas\":[{\"Columns\":[{\"Name\":\"show_id\",\"Type\":\"string\"},{\"Name\":\"type\",\"Type\":\"string\"},{\"Name\":\"title\",\"Type\":\"choice\"},{\"Name\":\"director\",\"Type\":\"string\"},{\"Name\":\"cast\",\"Type\":\"string\"},{\"Name\":\"country\",\"Type\":\"string\"},{\"Name\":\"date_added\",\"Type\":\"string\"},{\"Name\":\"release_year\",\"Type\":\"bigint\"},{\"Name\":\"rating\",\"Type\":\"string\"},{\"Name\":\"duration\",\"Type\":\"string\"},{\"Name\":\"listed_in\",\"Type\":\"string\"},{\"Name\":\"description\",\"Type\":\"string\"}]}],\"Paths\":[\"s3://dalamgir-notebook-test-input/netflix_titles.csv\"],\"QuoteChar\":\"quote\",\"Recurse\":true,\"Separator\":\"comma\",\"WithHeader\":true}}}"
  }
  ```

 **对于脚本作业：**
+  您需要文件夹、作业定义的 JSON 文件和脚本 
+  该文件夹和 JSON 文件应与作业名称相匹配。脚本名称需要匹配作业定义中 `scriptLocation` 以及文件扩展名 

   例如，在下面的作业定义中，存储库中的分支应包含路径 `my-script-job/my-script-job.json` 和 `my-script-job/my-script-job.py`。脚本名称应与包括脚本的扩展名的 `scriptLocation` 中的名称相匹配 

  ```
  {
    "name" : "my-script-job",
    "description" : "",
    "role" : "arn:aws:iam::aws_account_id:role/Rolename",
    "command" : {
      "name" : "glueetl",
      "scriptLocation" : "s3://foldername/scripts/my-script-job.py",
      "pythonVersion" : "3"
    }
  }
  ```

## 限制
<a name="edit-job-repository-limitations"></a>
+  AWS Glue 目前不支持从 [GitLab-Groups](https://docs.gitlab.com/ee/user/group) 推送/拉取。

## 将版本控制存储库连接到 AWS Glue
<a name="edit-job-connecting-repositories"></a>

 您可以输入版本控制存储库的详细信息并在 AWS Glue Studio 作业编辑器的 **Version Control**（版本控制）选项卡中管理它们。要与 Git 存储库集成，您必须在每次登录 AWS Glue Studio 时连接到存储库。

 要连接 Git 版本控制系统，请执行以下操作：

1.  在 AWS Glue Studio 中，开始新作业，然后选择 **Version Control**（版本控制）选项卡。  
![屏幕截图显示了选中 Version Control（版本控制）选项卡的作业。](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/editing-nodes-version-control-tab.png)

1.  在**版本控制系统**中，通过单击下拉菜单从可用选项中选择 Git 服务。
   +  AWS CodeCommit 
   +  GitHub 
   + GitLab
   + Bitbucket

1.  根据您选择的 Git 版本控制系统，需要填写的字段有所不同。

   

    **对于 AWS CodeCommit**：

    通过为作业选择存储库和分支来完成存储库配置：
   +  **存储库** — 如果您在 AWS CodeCommit 中设置了存储库，则从下拉菜单中选择存储库。您的存储库将自动填充到列表中 
   +  **分支** — 从下拉菜单中选择分支 
   +  **文件夹** — *可选* - 输入保存作业的文件夹的名称。如果留空，则会自动创建文件夹。文件夹名称默认为作业名称 

   

    **对于 GitHub**：

    填写以下字段以完成 GitHub 配置：
   +  **个人访问令牌** — 这是 GitHub 存储库提供的令牌。有关个人访问令牌的更多信息，请参阅 [GitHub 文档](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) 
   +  **存储库所有者** — 这是 GitHub 存储库的所有者。

    从 GitHub 中选择储存库和分支以完成存储库配置。
   +  **存储库** — 如果您已在 GitHub 中设置存储库，请从下拉菜单中选择存储库。您的存储库将自动填充到列表中 
   +  **分支** — 从下拉菜单中选择分支 
   +  **文件夹** — *可选* - 输入保存作业的文件夹的名称。如果留空，则会自动创建文件夹。文件夹名称默认为作业名称 

   

    **对于 GitLab**：
**注意**  
 AWS Glue 目前不支持从 [GitLab-Groups](https://docs.gitlab.com/ee/user/group) 推送/拉取。
   +  **个人访问令牌** – 这是 GitHub 存储库提供的令牌。有关个人访问令牌的更多信息，请参阅 [GitLab 个人访问令牌](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html) 
   +  **存储库所有者** – 这是 GitHub 存储库的所有者。

    从 GitHub 中选择储存库和分支以完成存储库配置。
   +  **存储库** – 如果您已在 GitHub 中设置存储库，请从下拉菜单中选择存储库。您的存储库将自动填充到列表中 
   +  **分支** — 从下拉菜单中选择分支 
   +  **文件夹** — *可选* - 输入保存作业的文件夹的名称。如果留空，则会自动创建文件夹。文件夹名称默认为作业名称 

    **对于 Bitbucket**：
   +  **应用程序密码** – Bitbucket 使用应用程序密码而不是存储库访问令牌。有关应用程序密码的更多信息，请参阅[应用程序密码](https://support.atlassian.com/bitbucket-cloud/docs/app-passwords/)。
   +  **存储库所有者** – 这是 Bitbucket 存储库的所有者。在 Bitbucket 中，所有者是存储库的创建者。

    从 Bitbucket 中选择工作区、储存库、分支和文件夹以完成存储库配置。
   +  **工作区** – 如果您已在 Bitbucket 中设置工作区，请从下拉菜单中选择工作区。您的工作区会自动填充 
   +  **存储库** – 如果您在 Bitbucket 中设置了存储库，则从下拉菜单中选择存储库。您的存储库会自动填充 
   +  **分支** – 从下拉菜单中选择分支。您的分支会自动填充 
   +  **文件夹** — *可选* - 输入保存作业的文件夹的名称。如果留空，则会使用作业名称自动创建文件夹。

1.  在 AWS Glue Studio 作业的顶部，选择 **Save**（保存） 

## 推送 AWS Glue 作业到源存储库
<a name="edit-job-push-source-repository"></a>

 输入版本控制系统的详细信息后，可以在 AWS Glue Studio 中编辑作业并将作业推送到您的源存储库。如果您不熟悉 Git 概念，如推送和提取，请参阅 [Git 和 AWS CodeCommit 入门](https://docs.aws.amazon.com/codecommit/latest/userguide/getting-started.html)上的此教程。

 要将作业推送到存储库，您需要输入版本控制系统的详细信息并保存作业。

1.  在 AWS Glue Studio 作业中，选择 **Actions**（操作）。这将打开其他菜单选项。  
![屏幕截图显示了已打开 Actions（操作）菜单的作业。Push to repository（推送到存储库）选项可见。](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/editing-nodes-actions-push-to-repository.png)

1.  选择 **Push to repository**（推送到存储库）。

    此操作将保存作业。推送到存储库时，AWS Glue Studio 推送上次保存的更改。如果存储库中的作业被您或其他用户修改，并且与 AWS Glue Studio 中的作业不同步，则在您从 AWS Glue Studio 推送作业时，存储库中的作业会被保存在 AWS Glue Studio 中的作业覆盖。

1.  选择 **Confirm**（确认）以完成操作。这会在存储库中创建新的提交。如果您使用 AWS CodeCommit，一条确认消息将显示指向 AWS CodeCommit 上最新提交的链接。

## 从源存储库提取 AWS Glue 作业
<a name="edit-job-pull-source-repository"></a>

 将 Git 存储库的详细信息输入到 **Version control**（版本控制）选项卡之后，您也可以从存储库中提取作业并在 AWS Glue Studio 中进行编辑。

1.  在 AWS Glue Studio 作业中，选择 **Actions**（操作）。这将打开其他菜单选项。  
![屏幕截图显示了已打开 Actions（操作）菜单的作业。Push to repository（推送到存储库）选项可见。](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/editing-nodes-actions-push-to-repository.png)

1.  选择 **Pull from repository**（从存储库中提取）。

1.  选择**确认**。这会从存储库中获取最新的提交，并在 AWS Glue Studio 中更新您的作业。

1.  在 AWS Glue Studio 中编辑您的作业。如果您进行了更改，则可以通过选择 **Actions**（操作）下拉菜单中的 **Push to repository**（推送到存储库）来将作业同步到存储库。