如何根据另一个 AWS 账户中的 AWS Glue 任务的状态在一个 AWS 账户中触发 AWS Glue 任务?
我想创建一个管道,在该管道中,在一个 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。
相关信息
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前