背景・目的
別アカウントで作成したデータを元に、Glueジョブで処理するケースがあります。
このような場合に、Glue Trigger等のスケジューラーで特定の時間になったら起動し動き出すこともできますが、入力データの作成が遅れた場合などに空振りするケースがあります。
そこで、別アカウントで準備ができたら、Glueジョブを起動してもらう方法が考えられます。
本ページでは、この仕組みを試してみたいと思います。
まとめ
- クロスアカウント間でシームレスにGlueジョブを動かしたい場合に使用できます。
- ソース側のGlueのステータスを検知するEventBridgeのバスは、Defaultでしか拾えないので注意が必要です。
- EventBridgeからGlueを起動する場合、GlueジョブではなくGlueWorkflowを指定する必要があります。
概要
- アカウントAとアカウントBを用意する。
- アカウントAとアカウントB間でEventBridgeを介してメッセージを送受信する
- アカウントAではS3出力後に、EventBridgeにメッセージ送信します。
- アカウントBではEventBrdigeからGlueジョブを起動します。
実践
事前準備
S3バケットの用意(アカウントA、アカウントB)
それぞれのアカウントでS3バケット(Send BucketとTarget Bucket)を用意します。
送信側のアカウントAのS3バケットポリシーを設定
- アカウントBのGlueロールからアクセス可能なようにバケットポリシーを設定します。
{ "Version": "2012-10-17", "Id": "Policy1679145460562", "Statement": [ { "Sid": "Stmt1679145458128", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::XXXXXXX:role/XXXXXXXX" }, "Action": [ "s3:GetObject", "s3:GetObjectAcl", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::XXXXXXX", "arn:aws:s3:::XXXXXXX/*" ] } ] }
Glueの作成
送信側のアカウントA
Glueジョブを作成
受信側のアカウントB
Glueジョブを作成
Glueワークフローを作成
EventBridgeから起動できるように、Glueワークフローを作成します。
-
下記を入力し、「ワークフローの追加」をクリックします。
Event Brdigeの設定
受信側のアカウントB
カスタムイベントバスを作成
- カスタムイベントバスを「eventbridge-bus-glue-notice」という名前で作成します。リソースポリシーは下記のとおりです。
{ "Version": "2012-10-17", "Statement": [{ "Sid": "eventbridge-bus-glue-notice", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{Account-A}:root" }, "Action": "events:PutEvents", "Resource": "arn:aws:events:ap-northeast-1:{Account-B}:event-bus/eventbridge-bus-glue-notice" }] }
Eventルールを作成
次にEventルールを作成します。
-
下記を選択し「次へ」をクリックします。
-
下記を入力し、「次へ」をクリックします。
-
タグの選択、確認後ルールを作成します。
送信側のアカウントA
Eventルールを作成
次にEventルールを作成します。
-
イベントルールの画面で、Defaultを選択した状態で「ルールを作成」をクリックします。
-
下記を選択し「次へ」をクリックします。
-
下記を入力し「次へ」をクリックします。
-
「ターゲットを選択」画面で、下記を入力し「次へ」をクリックします。
-
タグの選択、確認後ルールを作成します。
検証
実行前の確認
実行
実行後の確認
考察
- S3のPutObject等のイベントをトリガーにジョブを実行することも可能ですが、ある程度、まとめてバッチ処理を行いたい場合に、シームレスにジョブを動かしたい際に有効と感じました。
参照