AWS Glue で使えるようになった Git 統合機能を使ってみた

2022.10.16

いわさです。

先日のアップデートで AWS Glue に Git 統合機能が追加されました。

これによって何が出来るようになっているのかを確認したいと思います。

ジョブ作成画面でバージョン管理設定を行えるように

まず、ジョブ作成画面に Version Control タブが追加されておりここで Git 統合先の構成を行うことが出来ます。

本日時点では Git サービスプロバイダとして AWS Code Commit と GitHub の 2 つから選択出来ます。

今回は主に CodeCommit で試してみます。
使い方は概ね同じです。

最後に少し GitHub も使っているので違う点はそちらで紹介します。

Git 統合構成を行う

設定にあたってリポジトリとブランチが必須設定項目なので先に CodeCommit でリポジトリと適当なブランチを作成しておきます。
ここではルートに適当な ReadMe.md を作成しています。

Git 統合の構成設定自体はシンプルで、マネジメントコンソール上でリポジトリとブランチを選択するだけです。
指定出来るリポジトリ・ブランチはひとつまでですが任意のタイミングで変更は可能です。

なお、ここで構成した Git 統合構成は別のユーザーでマネジメントコンソールへアクセスした場合でも保存されています。

リポジトリへプッシュしてみる

さて、今回はビジュアルジョブを使って S3 から S3 へデータを移動させるだけの最低限のジョブを作成しました。
このジョブを構成済みの Git リポジトリで管理したいのでプッシュ操作を行います。
まず、この時点でわかるのは統合されたからといって変更したタイミングやジョブを実行したタイミングで自動でプッシュされるものではないという点です。

Action メニューから Push to repository を選択します。

統合済みのリポジトリやブランチの情報が確認されるので操作を確定します。

CodeCommit を確認してみましょう。
指定したブランチに更新が反映されています。

今回は場合だとジョブ名のフォルダ内にジョブの内容を示す JSON ファイルが作成されています。
1 つのリポジトリで複数のジョブに対応出来そうだということがわかりました。

なお今回はビジュアルジョブを作成しましたが、スクリプトジョブを作成する場合だと Git で管理する際のファイル構成が少し異なります。
詳細は以下をご確認ください。

リポジトリからプルしてみる

さて、次は CodeCommit に別の更新をプッシュし、ジョブからプルしてみます。
今回は以下のように CodeCommit のコンソール画面から直接 JSON ファイルを更新しました。これで対象のリモートブランチにコミットが作成された状態です。
送信先 S3 バケットを「バケット3」へ変更しています。

プルする前にジョブで設定されている送信先バケットを確認しておきます。
「バケット2」であることが確認出来ました。

では先程のプッシュと同じ要領でプルを行ってみます。

すぐに処理が完了するのでジョブ設定内容を確認してみます。

送信先が「バケット3」に変更されていることが確認出来ました。
Git リポジトリの内容がジョブに反映されていますね。

コンフリクトは解消せずに強制上書きされる

ここまでで基本的な使い方を確認しました。
次にプッシュする際にコンフリクトが発生した場合どうなるのかを確認してみたので紹介します。

複数人でチーム開発をしており、同じジョブを更新してしまった場合などを想定しています。
先程、送信先バケットが「バケット3」に更新されましたが、リモートリポジトリ上で「バケット2」に更新されており、その最新をプルせずにコンソール上で「バケット4」に更新してみます。

ではこの状態でプッシュしてみましょう。

上記のように「バケット4」で上書きされました。
コミット履歴は以下のようになっています、手動でリモートリポジトリを更新した内容は履歴としては残っていますが、上書きされてしまいました。
ちなみに CodeCommit 統合で Glue からプッシュした際の作成者は AWS Glue 固定のようです。

競合しているものしていないものを混在したコミットも試してみましたがいずれも Glue のジョブで上書きされていたのでマージはされるずに上書きされると考えて良いと思います。
ちなみにドキュメントにも以下のように記述があります。

If the job in the repository was modified by you or another user and is out of sync with the job in AWS Glue Studio, the job in the repository is overwritten with the job saved in AWS Glue Studio when you push the job from AWS Glue Studio.

チーム開発でコンフリクトが生じる可能性があるのであれば、チーム開発時はユーザーごとにジョブとブランチを分けて、マージやコンフリクトの解消はプルリクエストなどで行うのが良さそうです。

GitHub 使ってみる

少しだけ GitHub の統合についても見てみたいと思います。
プッシュやプルの挙動はほぼ同じなのですが認証部分だけ少し違います。

GitHub の場合は Personal Access Token が必要です。
発行方法は以下です。

Creating a personal access token - GitHub Docs

上記のように画面上 PAT が表示されてしまうのですが、どうやらこちらはサーバーサイドでは保管されないようです。
ユーザー間での共有もされないのですが、画面上に注意書きがあるようにログインのたびに入力が必要になります。

一度ログアウトすると、リポジトリやブランチは情報として残っているのですが、PAT については以下のように未設定の状態となります。

また、PAT を使う関係から、CodeCommit と異なりコミット履歴上はユーザーとして扱われます。

さいごに

本日は AWS Glue で使えるようになった Git 統合機能を使ってみました。

まずジョブのバージョン管理が出来ることが確認出来ました。
ジョブごとにフォルダ分けされるのでテンプレート置き場のような使い方は出来無さそうです。
上書きされるという点だけ気をつけたいところです。

また、自動デプロイや同期の機能は本日時点ではありませんのでプルとプッシュは手動で行う必要があります。
AWS CLI からもupdate-job-from-source-controlで操作が出来るので CodeCommit をトリガーに CodeDeploy を動かすだけで自動デプロイ機能は簡単に実現は出来そうですね。