如何根据另一个 AWS 账户中的 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 任务,其中 Job 1 在 AWS 账户 A 中运行,Job 2 在 AWS 账户 B 中运行。Job 2 依赖于 Job 1。

  1. 在 AWS 账户 B 中创建自定义事件总线,在 AWS 账户 A 中创建一个 EventBridge 规则。账户 A 中的 EventBridge 规则监视处于 SUCCEEDED(成功)状态的 AWS Glue Job 1。然后,目标是在 AWS 账户 B 中创建的事件总线。
  2. 在 AWS 账户 B 中创建一个触发 AWS Glue ETL Job 2 的 Lambda 函数。
  3. 使用您在步骤 1 中创建的自定义事件总线在账户 B 中创建 EventBridge 规则。添加一条规则,监视处于 SUCCEEDED(成功)状态的 AWS Glue Job 1,并将之前创建的 Lambda 函数作为目标。当使用 AWS Glue API 调用的事件到达时,目标触发 AWS Glue ETL Job 2。

有关更多信息,请参阅由 AWS Glue 生成的 Amazon CloudWatch Events 可用于 EventBridge 规则列表。

在账户 B 中创建自定义事件总线

1.    在账户 B 中,打开 EventBridge。选择事件总线,然后选择创建事件总线。添加此基于资源的策略:

{
  "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 中为 Job 1 创建事件规则

1.    在账户 A 中,打开 EventBridge 控制台。

2.    选择 Rules(规则),然后为 Event bus(事件总线)选择 default(默认)。

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 事件总线),然后选择另一个 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 Job 2

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 管理策略)。然后,授予 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.    选择创建函数

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 中的 Job 2。

在账户 B 中为 Job 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.    在选择目标页面上,对于目标类型,选择 AWS 服务

6.    对于选择目标,选择或键入 Lambda 函数,然后从下拉列表中选择您之前创建的函数。

7.    选择 Next(下一个),查看您的设置,然后选择 Create(创建)。

测试您的跨账户 AWS Glue 任务触发器

1.    在账户 A 中运行 Job 1 当任务完成时,会向账户 A 中的事件总线发送 SUCCEEDED(成功)状态。

2.    账户 A 将事件信息发送到账户 B 中的事件总线。

3.    账户 B 中的事件总线运行事件规则。此事件规则触发账户 B 中的 Lambda 函数。要查看 Lambda 日志,请打开 Amazon CloudWatch 控制台,选择 Log groups(日志组),然后选择您的 Lambda 函数组。函数组的格式为 /aws/lambda/<LambdaFunctionName>

4.    Lambda 函数触发账户 B 中的 Job 2。


相关信息

在 AWS 账户之间发送和接收 Amazon EventBridge 事件

AWS 官方
AWS 官方已更新 1 年前