Glue Studio Visual JobをAPIで管理出来るようになりました

2022.05.20

いわさです。

Glue Studioを使うと、ビジュアルエディターを使ってGlueジョブを作成することが出来ます。

これまでは、ビジュアルエディターで表示されるジョブをCLIやAPIで作成したり更新したりすることが出来なかったのですが、本日のアップデートでAPIで管理出来るようになりました。
今までもプレビューとして利用出来ていたのですが、今回GAとなりました。

やってみる

ビジュアルから

まずはGlue Studioのビジュアルエディターを使ってジョブを作成し挙動を確認してみましょう。
2つのS3バケットを作成し、バケットAにCSVをアップロードしておきます。
ETLジョブを使って、フィールドを削除したCSVをバケットBに格納してみます。

before.csv

aaa,bbb,ccc
111,222,333
100,200,300

ビジュアルエディターでは「ノード」を使ってデータフローを作成します。
ここではソース定義、データの編集、ターゲット定義と3つのノードを定義しています。データ編集ではbbbというフィールドの削除だけをしています。非常に単純なETL処理です。

作成したジョブをRunしてみると、バケットBに加工されたCSVファイルが格納されていることが確認出来るかと思います。

APIから

では、今回はAWS CLIを使って、ビジュアルジョブを作成してみます。
ここでは理解しやすそうなシナリオとして、先程手動でビジュアルエディターから作成したジョブを少し編集してコピーしてみたいと思います。

AWS CLIのv1.24.2/v2.7.1からこれらの操作が可能になっています。
具体的には、既存のcreate-jobget-jobCodeGenConfigurationNodesというオプションが追加されています。

$ aws glue get-job --job-name "hoge drop field"
{
    "Job": {
        "Name": "hoge drop field",
        "Description": "",
        "Role": "arn:aws:iam::123456789012:role/hoge0520glueadmin",
:
        "GlueVersion": "3.0",
        "CodeGenConfigurationNodes": {
            "node-1652998518357": {
                "DropFields": {
                    "Name": "Drop Fields",
                    "Inputs": [
                        "node-1652998005655"
                    ],
                    "Paths": [
                        [
                            "bbb"
                        ]
                    ]
                }
            },
            "node-1652998530102": {
                "S3DirectTarget": {
                    "Name": "Amazon S3",
                    "Inputs": [
                        "node-1652998518357"
                    ],
                    "PartitionKeys": [],
                    "Path": "s3://hoge0520iwasatarget",
                    "Compression": "none",
                    "Format": "csv",
                    "SchemaChangePolicy": {
                        "EnableUpdateCatalog": false
                    }
                }
            },
            "node-1652998005655": {
                "S3CsvSource": {
                    "Name": "Amazon S3",
                    "Paths": [
                        "s3://hoge0520iwasasource/before.csv"
                    ],
                    "Exclusions": [],
                    "Recurse": true,
                    "AdditionalOptions": {
                        "EnableSamplePath": false,
                        "SamplePath": "s3://hoge0520iwasasource/before.csv"
                    },
                    "Separator": "comma",
                    "Escaper": "",
                    "QuoteChar": "quote",
                    "WithHeader": true,
                    "OptimizePerformance": false,
                    "OutputSchemas": [
                        {
                            "Columns": [
                                {
                                    "Name": "aaa",
                                    "Type": "bigint"
                                },
                                {
                                    "Name": "bbb",
                                    "Type": "bigint"
                                },
                                {
                                    "Name": "ccc",
                                    "Type": "bigint"
                                }
                            ]
                        }
                    ]
                }
            }
        }
    }
}

このオプションを少し加工して以下のような形式でコピー用のCodeGenConfigurationNodesを作成しておきます。
手動で作成したものから名前や削除するフィールドを変更しています。

hoge-config.json

{
    "hoge-node-1": {
        "S3CsvSource": {
            "Name": "hoge-node-1",
            "Paths": [
                "s3://hoge0520iwasasource/before.csv"
            ],
            "Exclusions": [],
            "Recurse": true,
            "AdditionalOptions": {
                "EnableSamplePath": false,
                "SamplePath": "s3://hoge0520iwasasource/before.csv"
            },
            "Separator": "comma",
            "Escaper": "",
            "QuoteChar": "quote",
            "WithHeader": true,
            "OptimizePerformance": false,
            "OutputSchemas": [
                {
                    "Columns": [
                        {
                            "Name": "aaa",
                            "Type": "bigint"
                        },
                        {
                            "Name": "bbb",
                            "Type": "bigint"
                        },
                        {
                            "Name": "ccc",
                            "Type": "bigint"
                        }
                    ]
                }
            ]
        }
    },
    "hoge-node-2": {
        "DropFields": {
            "Name": "hoge name 2",
            "Inputs": [
                "hoge-node-1"
            ],
            "Paths": [
                [
                    "ccc"
                ]
            ]
        }
    },
    "hoge-node-3": {
        "S3DirectTarget": {
            "Name": "hoge name 3",
            "Inputs": [
                "hoge-node-2"
            ],
            "PartitionKeys": [],
            "Path": "s3://hoge0520iwasatarget",
            "Compression": "none",
            "Format": "csv",
            "SchemaChangePolicy": {
                "EnableUpdateCatalog": false
            }
        }
    }
}

あとは、CreateJobコマンドでパラメータとして渡すだけです。
IAMロールは先程手動で作成した時に利用したものを使っています。

$ aws glue create-job --name hoge-job-from-cli --role "arn:aws:iam::123456789012:role/hoge0520glueadmin" --command '{"Name":"glueetl","ScriptLocation":"s3://aws-glue-assets-123456789012-ap-northeast-1/scripts/hoge-fuga.py","PythonVersion":"3"}' --code-gen-configuration-nodes file://hoge-config.json --glue-version 3.0
{
    "Name": "hoge-job-from-cli"
}

Glue Studioのジョブ一覧でジョブが作成されたことが確認出来ます。
あとは通常どおり実行してみます。

$ aws glue start-job-run --job-name hoge-job-from-cli
{
    "JobRunId": "jr_56ccbd2910b42cc925e9b159571bf1169ecfb2fe734e1927f5cfe7100c31e21d"
}
$ aws glue get-job-run --job-name hoge-job-from-cli --run-id jr_56ccbd2910b42cc925e9b159571bf1169ecfb2fe734e1927f5cfe7100c31e21d
{
    "JobRun": {
        "Id": "jr_56ccbd2910b42cc925e9b159571bf1169ecfb2fe734e1927f5cfe7100c31e21d",
        "Attempt": 0,
        "JobName": "hoge-job-from-cli",
        "StartedOn": "2022-05-20T09:37:15.728000+09:00",
        "LastModifiedOn": "2022-05-20T09:37:19.041000+09:00",
        "JobRunState": "RUNNING",
        "PredecessorRuns": [],
        "AllocatedCapacity": 10,
        "ExecutionTime": 13,
        "Timeout": 2880,
        "MaxCapacity": 10.0,
        "WorkerType": "G.1X",
        "NumberOfWorkers": 10,
        "LogGroupName": "/aws-glue/jobs",
        "GlueVersion": "3.0"
    }
}
$ aws glue get-job-run --job-name hoge-job-from-cli --run-id jr_56ccbd2910b42cc925e9b159571bf1169ecfb2fe734e1927f5cfe7100c31e21d
{
    "JobRun": {
        "Id": "jr_56ccbd2910b42cc925e9b159571bf1169ecfb2fe734e1927f5cfe7100c31e21d",
        "Attempt": 0,
        "JobName": "hoge-job-from-cli",
        "StartedOn": "2022-05-20T09:37:15.728000+09:00",
        "LastModifiedOn": "2022-05-20T09:38:23.006000+09:00",
        "CompletedOn": "2022-05-20T09:38:23.006000+09:00",
        "JobRunState": "SUCCEEDED",
        "PredecessorRuns": [],
        "AllocatedCapacity": 10,
        "ExecutionTime": 60,
        "Timeout": 2880,
        "MaxCapacity": 10.0,
        "WorkerType": "G.1X",
        "NumberOfWorkers": 10,
        "LogGroupName": "/aws-glue/jobs",
        "GlueVersion": "3.0"
    }
}

ジョブが成功しました。
出力されたCSVファイルを確認してみましょう。

aaa,bbb
111,222
100,200

期待どおりccc列が削除されたCSVファイルがターゲットとして定義されていたバケットBへ格納されていますね。

さいごに

本日はAWS CLIを使ってGlue Studioのビジュアルジョブを作成してみました。
このアップデートによってAWSアカウント間でジョブのコピーや定義の共有が出来るようになりました。アップデートドキュメントでは他のETLツールとAWS Glueの間での変換などの際にAPIを利用するユースケースなども想定されていました。