あるアカウントの AWS Glue ジョブを、別のアカウントの AWS Glue ジョブのステータスに基づいてトリガーする方法を教えてください。
ある 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 に依存しています。
- AWS アカウント B にカスタムイベントバスを作成し、AWS アカウント A に EventBridge ルールを作成します。アカウント A の EventBridge ルールは、AWS Glue ジョブ 1 が SUCCEEDED 状態になるのを監視します。次に、ターゲットは AWS アカウント B で作成されたイベントバスです。
- AWS Glue ETL ジョブ 2 をトリガーする Lambda 関数を AWS アカウント B に作成します。
- ステップ 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 をトリガーします。
関連情報
関連するコンテンツ
- 質問済み 6ヶ月前lg...
- 質問済み 1年前lg...
- 質問済み 8ヶ月前lg...
- AWS公式更新しました 3年前
- AWS公式更新しました 3年前
- AWS公式更新しました 2年前