Glueのジョブどこから実行しよう..トリガー?ワークフロー?Step Functions?

Glueのジョブをどうやって実行/管理すべきか悩ましかったのでちょっと整理です
2020.08.24

ETLのワークロードが単一のGlueジョブ(以下、ジョブ)で済むのであれば、Glueのトリガー(以下、トリガー)や、EventBridgeと連携させたLambda Functionなどで実行すればいいと思いますが、ジョブ同士が依存関係を持ったり、Glue以外での処理が見込まれる場合、どう設計しておくべきか...

今回はジョブの実行/管理で検討できそうな、トリガー、ワークフローがどういったものか簡単に整理しつつ、どうやって実行/管理した方がよさそうか考えてみました。

トリガー

Glueにはトリガーと呼ばれるオブジェクトがあり、手動または自動で1つ以上のクローラーや、ジョブを実行することができます。

01

トリガーには起動方法が設定でき、以下を指定することが可能です。

  • スケジュール…固定のサイクルを指定(毎日24時など)
  • オンデマンド…コンソールやAPIから実行
  • ジョブイベント…他のジョブイベント

ジョブ間に依存関係がない場合、上記、例1、2のような構成となり、スケジュールまたはオンデマンドにて、トリガーを開始しジョブを実行することが可能です。

一方、ジョブ1の結果によりジョブ2の実行を行うなど、ジョブに依存関係がある場合、起動タイプはジョブイベントになります。他のジョブ(ここでは下図ジョブ1)の完了結果をもって、実行されるジョブ(ここでは下図ジョブ2)は、依存関係にあるジョブ(ここでは下図ジョブ1)もトリガーによって開始する必要がある点についてご留意ください。

02

ドキュメントの記載を抜粋しておきます。

他のジョブまたはクローラの完了の結果として実行されるジョブまたはクローラは、依存関係にあると言われます。依存関係にあるジョブまたはクローラは、完了したジョブまたはクローラがトリガーによって開始された場合にのみ開始されます。 依存関係チェーンのすべてのジョブまたはクローラは、1 つのスケジュールまたはオンデマンドトリガーの子であることが必要です。

なお、現時点でGlueのコンソールから作成できるトリガーはジョブ(クローラー不可)のみとなっております。

トリガーが1つ2つ程度であれば、ワークロードをトリガーで管理してもよさそうですが、トリガーが5個以上など規模が大きいワークロードでは、メンテナンスの負荷が高くなってくると思います。

規模の大きなワークロードが見込まれる場合(見込まれなくても)、次に紹介するワークフローを利用する方がよさそうです。

ワークフロー

Glueにはワークフローと呼ばれる機能があり、作成済みのジョブ、クローラーを用いて、ワークロードの作成、実行、管理が行えます。ワークフローを用いることで、ジョブの依存関係や、処理の進捗状況、問題のトラブルシューティングが容易になります。ワークフローは、Glueコンソール上から定義化可能です。

03

ワークフローには以下の制限がありますので、ご注意ください。

トリガーは 1 つのワークフローにのみ関連付けることができます。 1 つの開始トリガー (オンデマンドまたはスケジュール) のみが許可されます。 ワークフロー内のジョブまたはクローラがワークフロー外のトリガーによって開始された場合、ジョブまたはクローラの完了 (成功またはその他) に依存するワークフロー内のトリガーは起動されません。 同様に、ワークフロー内のジョブまたはクローラに、ワークフロー内とワークフロー外の両方でジョブまたはクローラの完了 (成功またはその他) に依存するトリガーがある場合、ジョブまたはクローラがワークフロー内から開始されると、ジョブまたはクローラの完了時、ワークフロー内のトリガーのみが起動されます。

制限に問題がなければ、積極的にワークフローを利用していきたいところです。ワークフローの作成方法など、詳細については以下を参考にしてください。

Step Functions

Step FunctionsのAWS統合(Taskステートから直接の呼び出し)では、 ジョブの実行がサポートされていますので、Lambda Functionを介さず、直接ジョブを実行することが可能です。(同期、非同期呼び出し可)

大規模なワークロード、Glueだけで処理が完結しないような場合は、Step Functionsを使用してジョブの実行/管理を検討したいところです。

01

出典:Step FunctionでAWS Glueのジョブやクローラーを呼び出すワークフローをつくってみた!

なお、現時点でクローラーはStep FunctionsのAWS統合には対応していないので、Lambda Functionを介した実行が必要になります。

Step FunctionsはEventBridgeからも呼び出し可能なので、処理の起点をAWSイベントから開始することも可能になります。

まとめ

ETLワークロードの規模に応じてジョブ実行/管理について検討する必要があります。ワークロードが単一のジョブであればシンプルにトリガー、依存関係をもつような処理が見込まれたらワークロード。Glueだけで処理が完結しないような場合は、Step Functions。こんな感じで考えてもよさそうですね。ETLワークロード設計の参考になれば幸いです。