如何根據另一個帳戶中 AWS Glue 任務的狀態,觸發一個 AWS 帳戶中的 AWS Glue 任務?

4 分的閱讀內容
0

我想建立一個管道,其中一個 AWS 帳戶中的 AWS Glue 任務完成後,即會在另一個帳戶中啟動爬蟲程式。

簡短描述

您可以建立稱為觸發的 AWS Glue Data Catalog 物件。觸發可以手動或自動啟動一或多個爬蟲程式或 ETL 任務,但此功能只能在一個 AWS 帳戶中使用。您無法使用這些觸發來啟動駐留在另一個 AWS 帳戶中的爬蟲程式或 ETL 任務。若要根據另一個帳戶中的任務狀態,觸發一個 AWS 帳戶中的 AWS Glue 任務,請使用 Amazon EventBridge 和 AWS Lambda。

解決方案

以下範例提供了如何使用 EventBridge 和 Lambda 函數來實現您的使用案例的概觀。假設您有兩個 AWS Glue 任務,其中任務 1 在 AWS 帳戶 A 中執行,任務 2 在 AWS 帳戶 B 中執行。任務 2 依賴於任務 1。

  1. 在 AWS 帳戶 B 中建立自訂事件匯流排,並在 AWS 帳戶 A 中建立 EventBridge 規則。帳戶 A 中的 EventBridge 規則會監看處於 SUCCEEDED (成功) 狀態的 AWS Glue 任務 1。然後,目標是在 AWS 帳戶 B 中建立的事件匯流排。
  2. 在 AWS 帳戶 B 中建立可觸發 AWS Glue ETL 任務 2 的 Lambda 函數。
  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 (事件匯流排) 選擇 default (預設)。

3.    選擇 Create rule (建立規則)。新增名稱,然後對於 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 (建立)。

在帳戶 B 中建立 Lambda 函數,其中具有可啟動 AWS Glue 任務 2 的目標

1.    開啟 Lambda 主控台

2.    選擇 Functions (函數),然後選擇 Create function (建立函數)。

3.    輸入函數名稱,對於 Runtime (執行時間),選擇 Python 3.x version (Python 3.x 版)。

4.    在 Change default execution role (變更預設執行角色) 下,選擇 Create a new role with basic Lambda permissions (建立具有基本 Lambda 許可的新角色)。

5.    如果您使用現有角色,請確定該角色具有所需的許可。如果沒有,請使用 IAM 主控台新增這些許可。首先,新增 AWSGlueServiceRole (AWS 管理政策)。然後,為 Lambda 提供 IAM 許可以根據事件執行:

{
  "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 type (規則類型),選擇 Rule with an event pattern (包含事件模式的規則)。

4.    在 Build event pattern (建立事件模式) 頁面的 Creation method (建立方法) 下,選擇 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。當任務完成時,會將 SUCCEEDED (成功) 狀態傳送至帳戶 A 中的事件匯流排。

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 年前