GlueのGit Integrationを試してみた

# 背景・目的
GlueのGit統合が、[こちら](https://aws.amazon.com/jp/about-aws/whats-new/2022/10/aws-glue-git-integration/)の記事で発表されましたので試してみたいと思います。
なお、今回使用するリポジトリはCodeCommitを使います。

# まとめ
- Glue がGitまたはCodeCommitと統合された。
- 操作はGlue Studioまたは、AWS CLIから可能


# 概要
## Git統合とは？
GitHubと AWS CodeCommitを使用して、Glueジョブの変更履歴を維持し、デプロイできるとのこと。また、CodeDeployと組み合わせてジョブのデプロイまで簡単にできるようになりました。
(以前は、独自にコード管理システムと統合をセットアップしてデプロイしていました。)

具体的には、以下の事ができるようです。
- バージョン管理システムとの統合
    - AWS CodeCommit および GitHub
- AWS Glue Studio で AWS Glue ジョブを編集し、それらをリポジトリへ同期
    - ※ ビジュアル ジョブまたはスクリプト ジョブを使用するかどうかに関係なく可能。
- ジョブのソースとターゲットのパラメータ化
- リポジトリからジョブをPullし、Glue Studioで編集が可能
- Glue Studio のマルチブランチ ワークフローを利用して、以下を実行
    - ブランチからPull
    - ブランチにPushし、ジョブをテストする
- リポジトリからファイルをダウンロードし、ジョブをGlue Studio にアップロードしてクロスアカウント ジョブを作成
- 選択した自動化ツールを使用
    - 例）Jenkins、AWS CodeDeploy等

## 前提
ジョブに以下のいずれかの権限が必要とのこと。詳細は[こちら](https://docs.aws.amazon.com/ja_jp/glue/latest/ug/edit-job-add-source-control-integration.html#edit-job-push-source-repository-prerequisites)を参照してください。
- AWSGlueServiceRole
- AWSGlueConsoleFullAccess

最低限の権限は、以下の通り。
- glue:UpdateJobFromSourceControl
- glue:UpdateSourceControlFromJob
- s3:GetObject
- s3:PutObject

# 実践
## 事前準備
### CodeCommitを作成
CodeCommitで新規にリポジトリを作成します。
1. リポジトリ名を「glue-repo」とし、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/24ff1bb8-8b1d-69a5-acc7-b77d01f5f55a.png)

### S3バケットとデータの用意
Glueジョブを作成するにあたり、S3バケットとテストデータを準備します。
ここでは、インプットとアウトプットの2つのバケットを用意します。

1. インプット用のバケットにバケット名を入力し、作成をクリックします。（アウトプットも同様に作成します。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6127728a-47ed-8548-cc67-553ae13fe256.png)

1. テストデータを作成します。ここでは、JSONLineフォーマットのデータを準備しています。

```
{"id":"00001","value":"glue test1"}
{"id":"00002","value":"glue test2"}
```

3.インプット用のバケットにアップロードします。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/478a28ea-98ea-61ca-6d3b-9bcb988891e9.png">

### IAMロールとポリシーの作成
1. IAMロールを作成します。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/513a7696-92dc-2825-2628-f0792899f95f.png">

2.以下のポリシーをアタッチします。
- AWSGlueServiceRole
- AWSGlueConsoleFullAccess

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/908d3b5e-a822-24f9-55aa-00e60e727724.png">


## ジョブを作成し、CodeCommitにPushする
Glue Studioでジョブを作成し、CodeCommitにPushされるまで確認します。


1.Glue Studioのトップページで以下を選択し、「Create」をクリックします。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f64c294c-8d06-8ffe-5a04-8da849394642.png">

2.Data SourceとData Targetにバケット等を指定します。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b5a0378d-11d1-5561-bfa2-4b888aeaf0fd.png"><BR>
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8088394a-0b3b-d95a-1c00-55babb5d4ac5.png">


3.ジョブ名やその他諸々設定し「Save」をクリックします。 
- ジョブ名は、glue-repo-test
- IAM Roleには、上記で作成したジョブを指定しています。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6bd9a607-9d15-43f3-1531-ee6f8e20990d.png">


4.Version Controlタブをクリックし、以下を入力後、最後にSaveをクリックします。
- Git serviceは、「AWS Code Commit」を選択
- Repositoryには、上記で作成した「glue-repo」を選択
- Branchは「main」を選択
- Folderには、「glue_repo_test」を指定
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4917b17e-132c-e54e-4e53-89f20d49a467.png">

5.画面右上のActionをクリックし、「Push to repository」をクリックします。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/408da04b-6eef-020b-0989-d0e37f36d17e.png">


6.ポップアップが表示されるので、「Confirm」をクリックします。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1c633dc0-d874-cfb8-edd0-262ca206666a.png">


7.成功したようです。（Commit idが表示されました。）
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2058af7b-0db3-ab79-37c6-1b2bf921ca5e.png">


8.CodeCommitにフォルダがアップされていました。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/388bf3f1-79b5-b8b1-f868-944ae70ead0c.png">

作成されたフォルダには、JSONが作成されていました。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/03997921-0d3a-9166-4ac9-d654a163489c.png">


9.JSONを確認します。
設定や、スクリプトのパスなどが定義されています。

```
{
  "name" : "glue-repo-test",
  "description" : "",
  "role" : "arn:aws:iam::アカウントID:role/GlueRepoTestRole",
  "executionProperty" : {
    "maxConcurrentRuns" : 1
  },
  "command" : {
    "name" : "glueetl",
    "scriptLocation" : "s3://スクリプト格納用のバケット/scripts/glue-repo-test.py",
    "pythonVersion" : "3"
  },
  "defaultArguments" : {
    "--enable-metrics" : "true",
    "--enable-spark-ui" : "true",
    "--spark-event-logs-path" : "s3://ログバケット/sparkHistoryLogs/",
    "--enable-job-insights" : "true",
    "--enable-glue-datacatalog" : "true",
    "--enable-continuous-cloudwatch-log" : "true",
    "--job-bookmark-option" : "job-bookmark-enable",
    "--job-language" : "python",
    "--TempDir" : "s3://一時バケット/temporary/"
  },
  "maxRetries" : 3,
  "allocatedCapacity" : 2,
  "timeout" : 10,
  "maxCapacity" : 2.0,
  "glueVersion" : "3.0",
  "numberOfWorkers" : 2,
  "workerType" : "G.1X",
  "executionClass" : "STANDARD",
  "codeGenConfigurationNodes" : "{\"node-1\":{\"S3JsonSource\":{\"AdditionalOptions\":{\"EnableSamplePath\":false,\"SamplePath\":\"s3://インプットデータ格納用バケット/glue-testdata.json\"},\"Exclusions\":[],\"JsonPath\":\"\",\"Multiline\":false,\"Name\":\"S3 bucket\",\"OutputSchemas\":[{\"Columns\":[{\"Name\":\"id\",\"Type\":\"string\"},{\"Name\":\"value\",\"Type\":\"string\"}]}],\"Paths\":[\"s3://インプットデータ格納用バケット\"],\"Recurse\":true}},\"node-2\":{\"ApplyMapping\":{\"Inputs\":[\"node-1\"],\"Mapping\":[{\"Dropped\":false,\"FromPath\":[\"id\"],\"FromType\":\"string\",\"ToKey\":\"id\",\"ToType\":\"string\"},{\"Dropped\":false,\"FromPath\":[\"value\"],\"FromType\":\"string\",\"ToKey\":\"value\",\"ToType\":\"string\"}],\"Name\":\"ApplyMapping\"}},\"node-3\":{\"S3GlueParquetTarget\":{\"Compression\":\"snappy\",\"Inputs\":[\"node-2\"],\"Name\":\"S3 bucket\",\"PartitionKeys\":[],\"Path\":\"s3://アウトプットデータ格納用バケット\",\"SchemaChangePolicy\":{\"EnableUpdateCatalog\":false,\"UpdateBehavior\":\"UPDATE_IN_DATABASE\"}}}}",
  "sourceControlDetails" : {
    "provider" : "AWS_CODE_COMMIT",
    "repository" : "glue-repo",
    "branch" : "main",
    "folder" : "glue_repo_test"
  }
}
```

10.コードがアップロードされているかを確認します。

::: note info
こちらは、「Save」ボタンでS3にアップロードされます。**Push契機ではありません。**
:::
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3e0f9db3-dd25-4bcc-01b1-8f634a44fd9a.png">


## CodeCommitからPullする
CodeCommit上で修正したものが、GlueStudioに反映されるか確認します。

1.上記でPushしたglue-repo-test.json内の「maxRetries」を3から1に修正します。
■修正前
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e350139d-0b24-7ff0-415c-82cfca03d610.png">
■修正後
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e05f1301-032c-9041-918c-921ffe43631b.png">

2.コミットIDを確認します。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9e15c766-b3f0-dc3a-2d35-11009294cde2.png">

3.Pull前に「Number of retries」が「3」であることを確認しておきます。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1850e0e8-56f2-3115-509d-0ef78321bd40.png">

4.Actionから、「Pull from repository」をクリックします。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f72bd983-eae1-9b09-dfa9-34855fb0ba96.png">

5.ポップアップが上がるので、「Confirm」をクリックします。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6fa6639e-ebaf-5f06-1b24-c280752707ac.png">

6.Pullできました。Code Commitで修正したコミットIDと一致しています。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/58b10266-d1b2-2471-61d5-726be12a5e88.png">

7.Pull後に「Number of retries」が「1」に変更されたました。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/dbb43928-0e10-5bce-bfdc-67acc082a945.png">

# 考察
- 以前は、Glue Studio上でコーディングし、設定値は、CloudFormationなどであらためて定義しなおし、リポジトリに保存をしていました。
  本機能により、設定値をGlue Studioからリポジトリに保存できるようになったのでかなり便利になりました。
- 次回はCodeCommitへのPushから、CodeDeployとの連携までを確認してみようと思います。

# 参考
https://aws.amazon.com/jp/about-aws/whats-new/2022/10/aws-glue-git-integration/

https://docs.aws.amazon.com/ja_jp/glue/latest/ug/edit-job-add-source-control-integration.html

https://aws.amazon.com/jp/blogs/big-data/code-versioning-using-aws-glue-studio-and-github/