あるアカウントの AWS Glue ジョブを、別のアカウントの AWS Glue ジョブのステータスに基づいてトリガーする方法を教えてください。

所要時間4分
0

ある AWS アカウントで AWS Glue ジョブが完了すると、別のアカウントでクローラーが起動するパイプラインを作成したいと考えています。

簡単な説明

トリガーと呼ばれる AWS Glue データカタログオブジェクトを作成できます。トリガーは 1 つ以上のクローラーまたは ETL ジョブを手動または自動で開始できますが、この機能は 1 つの AWS アカウント内でのみ使用できます。トリガーを使用して、別の AWS アカウントにあるクローラーや ETL ジョブを開始することはできません。ある AWS アカウントの AWS Glue ジョブを、別のアカウントのジョブのステータスに基づいてトリガーするには、Amazon EventBridge と AWS Lambda を使用します。

解決方法

次の例では、EventBridge と Lambda 関数を使用してユースケースを実現する方法の概要を示しています。AWS Glue ジョブが 2 つあり、ジョブ 1 は AWS アカウント A で実行され、ジョブ 2 は AWS アカウント B で実行されるとします。ジョブ 2 はジョブ 1 に依存しています。

  1. AWS アカウント B にカスタムイベントバスを作成し、AWS アカウント A に EventBridge ルールを作成します。アカウント A の EventBridge ルールは、AWS Glue ジョブ 1 が SUCCEEDED 状態になるのを監視します。次に、ターゲットは AWS アカウント B で作成されたイベントバスです。
  2. AWS Glue ETL ジョブ 2 をトリガーする Lambda 関数を AWS アカウント B に作成します。
  3. ステップ 1 で作成したカスタムイベントバスを使用して、アカウント B に EventBridge ルールを作成します。SUCCEEDED 状態の AWS Glue ジョブ 1 と、先にターゲットとして作成した Lambda 関数を監視するルールを追加します。ターゲットは、AWS Glue API 呼び出しを使用してイベントが到着すると、AWS Glue ETL ジョブ 2 をトリガーします。

詳細については、AWS Glue によって生成された EventBridge ルールで使用できる Amazon CloudWatch Events のリストを参照してください。

アカウント B でカスタムイベントバスを作成する

1.    アカウント B で、EventBridge を開きます。[Event buses] (イベントバス) を選択してから、[Create event bus] (イベントバスを作成) をクリックします。このリソースベースのポリシーを追加する

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "allow_account_to_put_events",
      "Effect": "Allow",
      "Principal": {
        "AWS": "<Account-A ID>"
      },
      "Action": "events:PutEvents",
      "Resource": "arn:aws:events:<Account-B Region>:<Account-B ID>:event-bus/<Account-B CustomEventBus Name>"
    }
  ]
}

: <> のサンプル項目は必ず自分の情報に置き換えてください。例えば、<Account-B CustomEventBus Name> はアカウント B で作成したイベントバスの名前に置き換えます。

2.    イベントバスを作成したら、その ARN を書き留めます。

3.    作成したカスタムイベントバスを選択してから、[Actions] (アクション) をクリックします。

4.    [Start Discovery] (検出を開始する) を選択します。

アカウント A にジョブ 1 のイベントルールを作成する

1.    アカウント A から、EventBridge コンソールを開きます。

2.    [Rules] (ルール) を選択し、[Event bus] (イベントバス) で [detault] (デフォルト) を選択します。

3.    [Create rule] (ルールの作成) を選択します。[Name] (名前) を追加し、[Rule type] (ルールタイプ) で [Rule with an event pattern] (イベントパターンを持つルール) を選択します。

4.    [Build event pattern] (イベントパターンを構築) ページの [Creation method] (作成方法) で、[Rule with an event pattern] (イベントパターンを持つルール) を選択します。次の JSON を追加してください。

{
  "source": ["aws.glue"],
  "detail-type": ["Glue Job State Change"],
  "detail": {
    "jobName": ["<Job 1 name>"],
    "severity": ["INFO"],
    "state": ["SUCCEEDED"]
    }
}

: <Job 1 name> は必ず使用している AWS Glue ジョブの名前に置き換えてください。

5.    [Target types] (ターゲットタイプ) で [EventBridge event bus] (EventBridge イベントバス) を選択し、[Event bus in another AWS account or Region] (別の AWS アカウントまたはリージョンのイベントバス) を選択します。

6.    アカウント B で以前に作成したイベントバスの ARN を入力します。この ARN がターゲットとして使用されます。

7.    [Execution role] (実行ロール) で、[Create a new role for this specific resource] (この特定のリソースについて新しいロールを作成) を選択します。[Use existing role] (既存のロールを使用) を選択した場合は、AWS Identity and Access Management (IAM) ポリシーに次のアクセス許可があることを確認してください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "events:PutEvents"
      ],
      "Resource": [
        "arn:aws:events:<Account-B Region>:<Account-B ID>:event-bus/<Account-B CustomEventBus Name>"
      ]
    }
  ]
}

: この例の <Account-B CustomEventBus Name> は、必ずアカウント B で作成したイベントバスの名前に置き換えてください。

8.    [Next] (次へ) を選択し、設定を確認してから、[Create] (作成) をクリックします。

AWS Glue ジョブ 2 を開始するターゲットを使用して、アカウント B に Lambda 関数を作成します。

1.    Lambda コンソールを開きます。

2.    [Functions] (関数) を選択し、[Create function] (関数の作成) を選択します。

3.    関数名を入力し、[Runtime] (ランタイム) で Python 3.x バージョンを選択します。

4.    [Change default execution role] (デフォルトの実行ロールの変更) で、[Create a new role with basic Lambda permissions] (基本的な Lambda アクセス権限で新しいロールを作成) を選択します。

5.    既存のロールを使用している場合は、そのロールに必要なアクセス許可があることを確認してください。そうでない場合は、IAM コンソールを使用してこのようなアクセス許可を追加してください。まず、AWSGlueServiceRole (AWS 管理ポリシー) を追加します。次に、イベントに基づいて実行する IAM アクセス許可を Lambda に付与します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "logs:CreateLogGroup",
      "Resource": "arn:aws:logs:<Account-B Region>:<Account-B ID>:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": [
        "arn:aws:logs:<Account-B Region>:<Account-B ID>:log-group:/aws/lambda/<Lambda Function Name>:*"
      ]
    }
  ]
}

: <> のサンプル項目は必ず自分の情報に置き換えてください。例えば、<Account-B ID> を アカウント B のアカウント ID に置き換えます。

6.    [Create function] を選択します。

7.    作成した関数のコードセクションに、次のコードを追加します。

# Set up logging
import json
import os
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# Import Boto 3 for AWS Glue
import boto3
client = boto3.client('glue')

# Variables for the job: 
glueJobName = "<Job 2 Name>"

# Define Lambda function
def lambda_handler(event, context):
    logger.info('## INITIATED BY EVENT: ')
    response = client.start_job_run(JobName = glueJobName)
    logger.info('## STARTED GLUE JOB: ' + glueJobName)
    logger.info('## GLUE JOB RUN ID: ' + response['JobRunId'])
    return response.

: <Job 2 Name> は必ずアカウント A で使用している AWS Glue ジョブの名前に置き換えてください。

8.    [Deploy] (デプロイ) を選択します。これで、この関数をテストして、アカウント B のジョブ 2 がトリガーされることを確認できます。

アカウント B にジョブ 1 のイベントルールを作成する

1.    アカウント B から、EventBridge コンソールを開きます。

2.    [Rules] (ルール) を選択し、以前に作成したイベントバスを選択します。

3.    イベントバスの下に新しいルールを作成します。[Rule name] (ルール名) を入力し、[Rule type] (ルールタイプ) で [Rule with an event pattern] (イベントパターンを持つルール) を選択します。

4.    [Build event pattern] (イベントパターンを構築) ページの作成方法で、[Custom pattern] (カスタムパターン) を選択し、次の JSON を追加します。

{
  "source": ["aws.glue"],
  "detail-type": ["Glue Job State Change"],
  "detail": {
    "jobName": ["<Job 1 name>"],
    "severity": ["INFO"],
    "state": ["SUCCEEDED"]
  }
}

: <Job 1 name> は必ずアカウント B で使用している AWS Glue ジョブの名前に置き換えてください。

5.    [Select Targets] (ターゲットを選択) ページの [Target types] (ターゲットタイプ) で、[AWS service] (AWS のサービス) を選択します。

6.    [Select target] (ターゲットを選択) で、[Lambda function] (Lambda 関数) を選択または入力し、ドロップダウンリストから以前に作成した関数を選択します。

7.    [Next] (次へ) を選択し、設定を確認してから、[Create] (作成) をクリックします。

クロスアカウントの AWS Glue ジョブトリガーをテストする

1.    アカウント A でジョブ 1 を実行します。ジョブが完了すると、アカウント A のイベントバスに SUCCEEDED ステータスが送信されます。

2.    アカウント A は、アカウント B のイベントバスにイベント情報を送信します。

3.    アカウント B のイベントバスがイベントルールを実行します。このイベントルールは、アカウント B の Lambda 関数をトリガーします。Lambda ログを確認するには、Amazon CloudWatch コンソールを開いて [Log groups] (ロググループ) を選択してから、Lambda 関数グループを選択します。関数グループの形式は /aws/lambda/<LambdaFunctionName> です。

4.    Lambda 関数は、アカウント B のジョブ 2 をトリガーします。


関連情報

AWS アカウント間の Amazon EventBridge イベントの送受信

AWS公式
AWS公式更新しました 1年前