Glue Studio Visual JobをAPIで管理出来るようになりました
いわさです。
Glue Studioを使うと、ビジュアルエディターを使ってGlueジョブを作成することが出来ます。
これまでは、ビジュアルエディターで表示されるジョブをCLIやAPIで作成したり更新したりすることが出来なかったのですが、本日のアップデートでAPIで管理出来るようになりました。
今までもプレビューとして利用出来ていたのですが、今回GAとなりました。
やってみる
ビジュアルから
まずはGlue Studioのビジュアルエディターを使ってジョブを作成し挙動を確認してみましょう。
2つのS3バケットを作成し、バケットAにCSVをアップロードしておきます。
ETLジョブを使って、フィールドを削除したCSVをバケットBに格納してみます。
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-job
やget-job
にCodeGenConfigurationNodes
というオプションが追加されています。
$ 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-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を利用するユースケースなども想定されていました。