在步骤函数中调用时如何进行 Python 粘合作业 return?
How to have a Python glue job return when called in step function?
我在 python 中有一个粘合作业,我从一个步骤函数中调用它。步骤函数成功启动作业。作业成功完成。但是 step 函数永远不会移动到下一步。步骤函数是否需要一些 configuration/permission 来响应作业成功?在 python 脚本中要做些什么?
这里是阶跃函数(状态机)的定义:
"MyGlueTask": {
"Type": "Task",
"Resource": "arn:aws:states:::glue:startJobRun.sync",
"Parameters": {
"JobName": "my_glue_job"
},
"ResultPath": "$.MyGlueTask",
"Next": "NextGlueJob"
}
你确定它永远不会进入下一步吗?也许可以,但是,例如,5 分钟后?
我问这个是因为 Step Functions 有限制:即使您的 Glue 作业在几秒钟内执行,Step Functions 实际上每 5 分钟轮询一次 Glue 作业的结果。
您可以实施的一种解决方法是将 arn:aws:states:::glue:startJobRun.sync
更改为 arn:aws:states:::glue:startJobRun
— 然后 Glue 作业任务将触发 Glue 作业并进入下一步。
很可能,您需要等待 Glue 作业完成并从那里获得一些结果。因此,你需要用更多的包裹之前的状态。
- 主要目的只是启动 Glue 作业。除此之外,我们还需要 Glue 作业
RunJobId
。
我不知道它是否可以从 Glue 作业本身检索,所以我使用 boto3 start_job_run
函数为 运行 Glue 作业创建了一个 Lambda,然后从响应中获取 RunJobId
.
- 创建一个 Lambda,它将通过
RunJobId
从上一步中获取 Glue 作业的状态(JobRunState
)(通过 boto3 get_job_run
函数)。
- 使用
Wait
Step Functions 状态类型,运行 您每 N 秒创建一次的 Lambda。
- 使用
Choice
状态类型过滤 Glue 作业状态。
- 如果
RUNNING
,返回Wait
步骤。
- 如果
SUCCEEDEED
,则进入下一个状态
- 如果
[FAILED | STOPPED]
,去别的地方。
最后,它看起来像 this。
我的实际问题的解决方案是权限。当 运行 a startJogRun.sync
:
时需要四个权限
- 胶水:StartJobRun
- 胶水:GetJobRun
- 胶水:GetJobRuns
- 胶水:BatchStopJobRun
这些实际上是 Terraform 值,但应该可以帮助任何为此苦苦挣扎的人。
我在 python 中有一个粘合作业,我从一个步骤函数中调用它。步骤函数成功启动作业。作业成功完成。但是 step 函数永远不会移动到下一步。步骤函数是否需要一些 configuration/permission 来响应作业成功?在 python 脚本中要做些什么?
这里是阶跃函数(状态机)的定义:
"MyGlueTask": {
"Type": "Task",
"Resource": "arn:aws:states:::glue:startJobRun.sync",
"Parameters": {
"JobName": "my_glue_job"
},
"ResultPath": "$.MyGlueTask",
"Next": "NextGlueJob"
}
你确定它永远不会进入下一步吗?也许可以,但是,例如,5 分钟后?
我问这个是因为 Step Functions 有限制:即使您的 Glue 作业在几秒钟内执行,Step Functions 实际上每 5 分钟轮询一次 Glue 作业的结果。
您可以实施的一种解决方法是将 arn:aws:states:::glue:startJobRun.sync
更改为 arn:aws:states:::glue:startJobRun
— 然后 Glue 作业任务将触发 Glue 作业并进入下一步。
很可能,您需要等待 Glue 作业完成并从那里获得一些结果。因此,你需要用更多的包裹之前的状态。
- 主要目的只是启动 Glue 作业。除此之外,我们还需要 Glue 作业
RunJobId
。 我不知道它是否可以从 Glue 作业本身检索,所以我使用 boto3start_job_run
函数为 运行 Glue 作业创建了一个 Lambda,然后从响应中获取RunJobId
. - 创建一个 Lambda,它将通过
RunJobId
从上一步中获取 Glue 作业的状态(JobRunState
)(通过 boto3get_job_run
函数)。 - 使用
Wait
Step Functions 状态类型,运行 您每 N 秒创建一次的 Lambda。 - 使用
Choice
状态类型过滤 Glue 作业状态。- 如果
RUNNING
,返回Wait
步骤。 - 如果
SUCCEEDEED
,则进入下一个状态 - 如果
[FAILED | STOPPED]
,去别的地方。
- 如果
最后,它看起来像 this。
我的实际问题的解决方案是权限。当 运行 a startJogRun.sync
:
- 胶水:StartJobRun
- 胶水:GetJobRun
- 胶水:GetJobRuns
- 胶水:BatchStopJobRun
这些实际上是 Terraform 值,但应该可以帮助任何为此苦苦挣扎的人。