1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

EventBridgeを使用してクロスアカウント間でGlueジョブを連携してみた

Posted at

背景・目的

別アカウントで作成したデータを元に、Glueジョブで処理するケースがあります。
このような場合に、Glue Trigger等のスケジューラーで特定の時間になったら起動し動き出すこともできますが、入力データの作成が遅れた場合などに空振りするケースがあります。
そこで、別アカウントで準備ができたら、Glueジョブを起動してもらう方法が考えられます。
本ページでは、この仕組みを試してみたいと思います。

まとめ

  • クロスアカウント間でシームレスにGlueジョブを動かしたい場合に使用できます。
  • ソース側のGlueのステータスを検知するEventBridgeのバスは、Defaultでしか拾えないので注意が必要です。
  • EventBridgeからGlueを起動する場合、GlueジョブではなくGlueWorkflowを指定する必要があります。

概要

今回は、下記のような構成を試してみたいと思います。
image.png

  • アカウントAとアカウントBを用意する。
  • アカウントAとアカウントB間でEventBridgeを介してメッセージを送受信する
  • アカウントAではS3出力後に、EventBridgeにメッセージ送信します。
  • アカウントBではEventBrdigeからGlueジョブを起動します。

実践

事前準備

S3バケットの用意(アカウントA、アカウントB)

それぞれのアカウントでS3バケット(Send BucketとTarget Bucket)を用意します。

送信側のアカウントAのS3バケットポリシーを設定

  1. アカウント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ジョブを作成

  1. 下記のようにシンプルにインプットとアウトプットのS3バケットをつなぐジョブを作成します。
    image.png

受信側のアカウントB

Glueジョブを作成

  1. 下記のようにシンプルにインプットとアウトプットのS3バケットをつなぐジョブを作成します。
    image.png

Glueワークフローを作成

EventBridgeから起動できるように、Glueワークフローを作成します。

  1. Glueのナビゲーションペインでワークフローをクリックし、「ワークフローの追加」をクリックします。
    image.png

  2. 下記を入力し、「ワークフローの追加」をクリックします。

    • ワークフロー名
    • 最大同時実行数
      image.png
  3. ワークフローにトリガーとジョブを追加します。
    image.png

Event Brdigeの設定

受信側のアカウントB

カスタムイベントバスを作成

  1. カスタムイベントバスを「eventbridge-bus-glue-notice」という名前で作成します。リソースポリシーは下記のとおりです。
    image.png
    {
      "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ルールを作成します。

  1. イベントルールの画面で、作成したカスタムイベントバスを選択した状態で「ルールを作成」をクリックします。
    image.png

  2. 下記を選択し「次へ」をクリックします。

    • ルール名:任意
    • イベントバス:作成したイベントバスを指定
    • ルールタイプ:イベントパターンを持つルール
      image.png
  3. 下記を入力し、「次へ」をクリックします。

    • イベントソース:AWSイベントまたはEventBridgeパートナーイベント
      image.png

    • イベントパターン

      {
        "source": ["aws.glue"],
        "detail-type": ["Glue Job State Change"],
        "detail": {
          "jobName":["eventbus-test-source-job"]
          ,"state": ["SUCCEEDED"]
        }
      }
      
  4. 作成したGlueWorkflowを指定してターゲットを選択します。
    image.png

  5. タグの選択、確認後ルールを作成します。

送信側のアカウントA

Eventルールを作成

次にEventルールを作成します。

  1. イベントルールの画面で、Defaultを選択した状態で「ルールを作成」をクリックします。

  2. 下記を選択し「次へ」をクリックします。

    • ルール名:任意
    • イベントバス:作成したイベントバスを指定
    • ルールタイプ:イベントパターンを持つルール
      image.png
  3. 下記を入力し「次へ」をクリックします。

    • イベントソース:イベントソース:AWSイベントまたはEventBridgeパートナーイベント
      image.png
    • イベントパターン
      {
        "source": ["aws.glue"],
        "detail-type": ["Glue Job State Change"],
        "detail": {
          "jobName":["eventbus-test-source-job"]
          ,"state": ["SUCCEEDED"]
        }
      }
      
  4. 「ターゲットを選択」画面で、下記を入力し「次へ」をクリックします。

    • ターゲットタイプ:
      • EventBridge イベントバス
      • 別のアカウントまたはリージョンのイベントバス
    • ターゲットとしてのイベントバスに送信先のイベントバスARN
    • 実行ロール:この特定のリソースについて新しいロールを作成
      image.png
  5. タグの選択、確認後ルールを作成します。

検証

実行前の確認

  1. 送信側(アカウントA)のSourceバケットを確認します。JSONファイルがあります。
    image.png

  2. 送信側(アカウントA)のSendバケットを確認します。データはありません。
    image.png

  3. 受信側(アカウントB)のTargetバケットを確認します。データはありません。
    image.png

実行

  1. 送信側(アカウントA)のGlueジョブを実行します。(すぐに終わりました。)
    image.png
    image.png

実行後の確認

  1. 送信側(アカウントA)のSendバケットを確認します。データが作成されています。
    image.png

  2. 受信側(アカウントB)のワークフロー履歴を確認します。完了しました。
    image.png

  3. 受信側(アカウントB)のジョブを確認します。問題なく終了しています。
    image.png

  4. 受信側(アカウントB)のTargetバケットを確認します。データが作成されています。
    image.png

考察

  • S3のPutObject等のイベントをトリガーにジョブを実行することも可能ですが、ある程度、まとめてバッチ処理を行いたい場合に、シームレスにジョブを動かしたい際に有効と感じました。

参照

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?