AWS Glue の Git 統合で最新以外のコミットを指定してジョブを更新出来るか確認してみた

2022.11.13

いわさです。

先月 AWS Glue のジョブを Git 管理するための機能が追加されました。

この機能では GitHub or CodeCommit の Git リポジトリとブランチを指定し、マネジメントコンソールからリモートリポジトリへのジョブ定義のプッシュ、あるいはリモートリポジトリからジョブへのプルを行うことが出来ます。

どうやらこの機能でリモートリポジトリからプルを行う際は、対象ブランチの最新のコミットが取得されるようです。
操作を行おうとする際に以下のメッセージが表示されていました。

Git 管理しているので過去コミットバージョンをジョブに反映させて実行させてたいシーンもあるかもしれません。

ドキュメントにも特に明記されておらず、一見するとリポジトリとブランチの最新コミットを取得するように見受けられますが、AWS CLI のリファレンスのupdate-job-from-source-controlには Commit ID のオプションが用意されています。

これはもしかして任意のコミット ID を CLI であれば指定出来るのではと思い、実際に試してみました。

試してみる

本日時点で Glue の Git 統合では、AWS CodeCommit と GitHub の 2 つを Git プロバイダーとして指定することが可能です。
念の為それぞれで挙動を確認してみます。

なお、この記事では Glue の API 仕様にあわせて「コミット ID」という呼称で統一します。

AWS CodeCommit

現在ジョブには最新コミット(0b2efdd5)が反映されている状態とします。
ここで一つ古いコミット(aa8aa32a)のジョブの設定内容を戻すために AWS CLI にてコミット ID を指定してみます。

ここでupdate-job-from-source-controlに用意されているオプションcommit-idを指定してみます。
短縮形で良いのかわからなかったので 2 通り指定してみました。

% aws glue update-job-from-source-control --job-name hoge1113git --provider AWS_CODE_COMMIT --repository-name hoge1113glue --branch-name main --folder hoge1113git --commit-id aa8aa32a901efb166e20f9f6119ae13dbdbdb825 
{
    "JobName": "hoge1113git"
}
% aws glue update-job-from-source-control --job-name hoge1113git --provider AWS_CODE_COMMIT --repository-name hoge1113glue --branch-name main --folder hoge1113git --commit-id aa8aa32a
{
    "JobName": "hoge1113git"
}

どちらも API の実行結果としてはエラーにはなりませんでした。
前バージョンに戻ればジョブの Description が hogehoge に変更されるはずです。

おや、変更されないですね。

CloudTrail を確認してみると UpdateJobFromSourceControl に成功しています。
また、どうやらこの Git 統合機能を使ってプルを行うと、UpdateJobFromSourceControl とあわせて UpdateJob が内部的に実行され、ジョブの内容が更新される仕組みのようです。

先程 2 回 UpdateJobFromSourceControl を実行したので UpdateJob も 2 回実行されていますね。
中身を確認してみましょう。

UpdateJobFromSourceControl

{
    "eventVersion": "1.08",
:
    "requestParameters": {
        "jobName": "hoge1113git",
        "provider": "AWS_CODE_COMMIT",
        "repositoryName": "hoge1113glue",
        "branchName": "main",
        "folder": "hoge1113git",
        "commitId": "aa8aa32a901efb166e20f9f6119ae13dbdbdb825"
    },
    "responseElements": {
        "jobName": "hoge1113git"
    },
:
}

UpdateJob

{
    "eventVersion": "1.08",
    "userIdentity": {
:
    },
    "eventTime": "2022-11-13T00:48:27Z",
    "eventSource": "glue.amazonaws.com",
    "eventName": "UpdateJob",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "glue.amazonaws.com",
    "userAgent": "glue.amazonaws.com",
    "requestParameters": {
        "jobName": "hoge1113git",
        "jobUpdate": {
            "description": "hogehoge2",
:
            "maxRetries": 3,
            "allocatedCapacity": 0,
            "timeout": 2880,
            "workerType": "G.1X",
            "numberOfWorkers": 10,
            "glueVersion": "3.0",
            "executionClass": "STANDARD",
:
        }
    },
    "responseElements": {
        "jobName": "hoge1113git"
    },
:
}

UpdateJobFromSourceControl に commitId が指定されていますが、UpdateJob では最新コミットの内容が取得されてしまっていますね。
うまく動かないようです...。

試しに適当なコミット ID を指定してみましょう。

% aws glue update-job-from-source-control --job-name hoge1113git --provider AWS_CODE_COMMIT --branch-name main --repository-name hoge1113glue --folder hoge1113git --commit-id hoge123456
{
    "JobName": "hoge1113git"
}
{
    "eventVersion": "1.08",
:
    "requestParameters": {
        "jobName": "hoge1113git",
        "provider": "AWS_CODE_COMMIT",
        "repositoryName": "hoge1113glue",
        "branchName": "main",
        "folder": "hoge1113git",
        "commitId": "hoge123456"
    },
    "responseElements": {
        "jobName": "hoge1113git"
    },
:
}

特にエラーにもならず、また最新のコミットが取得されました。
試す限りではこのオプションは無視して対象ブランチの最新コミットを取得するような動きをしています。

GitHub

CodeCommit では利用出来ないオプションという可能性もあります、GitHub でも試してみましょう。

先程と同じ流れでひとつ古いコミットを指定します。
既に無効化していますが auth-token に PAT を指定しています。

% aws glue update-job-from-source-control --job-name hoge1113git --provider GITHUB --branch-name main --repository-owner Tak1wa --repository-name hoge1113glue --folder hoge1113git --auth-strategy PERSONAL_ACCESS_TOKEN --auth-token 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 --commit-id 5aa2d40 
{
    "JobName": "hoge1113git"
}

% aws glue update-job-from-source-control --job-name hoge1113git --provider GITHUB --branch-name main --repository-owner Tak1wa --repository-name hoge1113glue --folder hoge1113git --auth-strategy PERSONAL_ACCESS_TOKEN --auth-token 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 --commit-id 5aa2d405b3e43275b4f10a723c9dd8aeed6dab5c
{
    "JobName": "hoge1113git"
}

GitHub をプロバイダーに指定した場合でも同じように UpdateJob によってジョブへ反映される動きですね。

ただし、先程と同様に指定したコミット ID は考慮されておらず最新コミットが取得されました。

コミット ID を指定してブランチを作成する

コミット ID オプションが用意されているのであれば将来的に指定したコミットバージョンを反映させることも出来そうな気もしますが、本日時点では利用できなさそうということがわかりました。
回避策としてはやはり指定したブランチが最新コミットとなるような方法を取る必要がありますね。

AWS CodeCommit

AWS CodeCommit の場合は CreateBranch API を使ってコミット ID を指定したブランチを作成することが出来ます。

% aws codecommit create-branch --repository-name hoge1113glue --branch-name hoge --commit-id aa8aa32a901efb166e20f9f6119ae13dbdbdb825 
% aws glue update-job-from-source-control --job-name hoge1113git --provider AWS_CODE_COMMIT --branch-name hoge --repository-name hoge1113glue --folder hoge1113git
{
    "JobName": "hoge1113git"
}

以下のように Description が古いバージョンに戻りましたね。

GitHub

Git コマンドでもコミット ID を指定してブランチが作成出来るので作成してプッシュします。

% git checkout 5aa2d405b3e43275b4f10a723c9dd8aeed6dab5c -b hoge
Switched to a new branch 'hoge'

% git push --set-upstream origin hoge        
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: 
remote: Create a pull request for 'hoge' on GitHub by visiting:
remote:      https://github.com/Tak1wa/hoge1113glue/pull/new/hoge
remote: 
To https://github.com/Tak1wa/hoge1113glue.git
 * [new branch]      hoge -> hoge
Branch 'hoge' set up to track remote branch 'hoge' from 'origin'.

% aws glue update-job-from-source-control --job-name hoge1113git --provider GITHUB --branch-name hoge --repository-owner Tak1wa --repository-name hoge1113glue --folder hoge1113git --auth-strategy PERSONAL_ACCESS_TOKEN --auth-token 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
{
    "JobName": "hoge1113git"
}

こちらも古いバージョンをジョブに反映することが出来ました。

さいごに

本日は AWS Glue の Git 統合で最新以外のコミットを指定してジョブを更新出来るか確認してみました。

残念ながら本日時点で Glue のコマンドを使って特定のコミットを指定することはできなさそうです。
回避策としてブランチを用意するなど Git リポジトリ側での対応が必要になります。

ただし、オプションは用意されているので将来的に出来るようになるかもしれないですね。