如何根据另一个 AWS 账户中的 AWS Glue 任务的状态在一个 AWS 账户中触发 AWS Glue 任务?
上次更新时间:2023 年 2 月 28 日
我想创建一个管道,在该管道中,在一个 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。
- 在 AWS 账户 B 中创建自定义事件总线,在 AWS 账户 A 中创建一个 EventBridge 规则。账户 A 中的 EventBridge 规则监视处于 SUCCEEDED(成功)状态的 AWS Glue Job 1。然后,目标是在 AWS 账户 B 中创建的事件总线。
- 在 AWS 账户 B 中创建一个触发 AWS Glue ETL Job 2 的 Lambda 函数。
- 使用您在步骤 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。