EventBridge能否向Glue工作流/触发器传递作业参数?
我的系统设计
- 我已创建4个Glue Job:testgluejob1、testgluejob2、testgluejob3以及common-glue-job。
- EventBridge规则用于检测testgluejob1、testgluejob2、testgluejob3等Glue Job的SUCCEEDED状态。
- 接收到Glue Job运行成功的通知后,Glue Trigger会启动common-glue-job。

问题描述
- 我希望在common-glue-job脚本中,将上游触发作业的名称作为参数使用。
- 请问是否可以从EventBridge向Glue Workflow或Glue Trigger传递参数?

已尝试的操作
- 已知Glue Trigger可向common-glue-job传递参数,相关CloudFormation静态参数配置示例如下:
Type: AWS::Glue::Trigger ... Actions: - JobName: prod-job2 Arguments: '--job-bookmark-option': job-bookmark-enable - 若为Glue Workflow设置Run Properties,可在common-glue-job中通过boto3调用
get_workflow_run_properties()函数获取对应属性,但不清楚如何通过CloudFormation配置,实现EventBridge触发工作流时传入Run Properties。 - 已配置EventBridge规则的Target InputTransformer,但不确定如何在common-glue-job中获取传入的转换值,相关配置如下:
DependsOn: - EventBridgeGlueExecutionRole - GlueWorkflowTest01 Type: AWS::Events::Rule Properties: Name: EventRuleTest01 EventPattern: source: - aws.glue detail-type: - Glue Job State Change detail: jobName: - !Ref GlueJobTest01 state: - SUCCEEDED Targets: - Arn: !Sub arn:aws:glue:${AWS::Region}:${AWS::AccountId}:workflow/${GlueWorkflowTest01} Id: GlueJobTriggersWorkflow RoleArn: !GetAtt 'EventBridgeGlueExecutionRole.Arn' InputTransformer: InputTemplate: >- { "--ORIGINAL_JOB": <jobName> } InputPathsMap: jobName : "$.detail.jobName"
解决方案
EventBridge向Glue资源传递动态参数完全可行,之前配置InputTransformer的思路是对的,只是参数格式和获取方式没有匹配对应资源的传参要求,以下是可直接落地的方案:
方案1:EventBridge直接触发common-glue-job(最简便,无需中转资源)
不需要依赖Glue Workflow或者Trigger做中转,直接将common-glue-job配置为EventBridge规则的目标即可:
- 给EventBridge绑定的执行角色添加
glue:StartJobRun权限。 - InputTransformer的输出格式和Glue Trigger静态Arguments格式完全一致,参数以
--开头即可,之前写的InputTemplate可以直接复用。 - 在common-glue-job脚本中,直接通过Glue内置的参数解析方法获取值,不需要额外调用boto3接口:
import sys from awsglue.utils import getResolvedOptions # 直接读取传入的作业参数 args = getResolvedOptions(sys.argv, ['ORIGINAL_JOB']) upstream_job_name = args['ORIGINAL_JOB']
方案2:保留Glue Workflow的场景
如果业务逻辑必须依赖Workflow编排,只需要调整InputTemplate的格式即可:
- EventBridge触发Workflow时,参数必须封装在
RunProperties字段下,不能直接传--参数名格式,修改后的InputTemplate如下:
{ "RunProperties": { "ORIGINAL_JOB": <jobName> } }
- 在common-glue-job中,先读取Glue自动注入的内置参数
WORKFLOW_RUN_ID,再调用get_workflow_run_properties()方法即可拿到传入的动态值:
import boto3 import sys from awsglue.utils import getResolvedOptions args = getResolvedOptions(sys.argv, ['WORKFLOW_RUN_ID']) glue_client = boto3.client('glue') run_properties = glue_client.get_workflow_run_properties( Name='替换为你的Glue Workflow名称', RunId=args['WORKFLOW_RUN_ID'] )['RunProperties'] upstream_job_name = run_properties['ORIGINAL_JOB']
注意事项
Glue Trigger本身不支持接收EventBridge传入的动态参数,Trigger中配置的Arguments是创建时就固定的静态值,无法动态替换为上游作业名,因此如果需要获取动态的上游作业信息,不要选择Trigger作为中转。
内容的提问来源于stack exchange,提问作者O.Takashi
相关产品推荐
相关产品推荐

