在步骤函数中调用时如何进行 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 作业完成并从那里获得一些结果。因此,你需要用更多的包裹之前的状态。

  1. 主要目的只是启动 Glue 作业。除此之外,我们还需要 Glue 作业 RunJobId。 我不知道它是否可以从 Glue 作业本身检索,所以我使用 boto3 start_job_run 函数为 运行 Glue 作业创建了一个 Lambda,然后从响应中获取 RunJobId .
  2. 创建一个 Lambda,它将通过 RunJobId 从上一步中获取 Glue 作业的状态(JobRunState)(通过 boto3 get_job_run 函数)。
  3. 使用 Wait Step Functions 状态类型,运行 您每 N 秒创建一次的 Lambda。
  4. 使用 Choice 状态类型过滤 Glue 作业状态。
    • 如果RUNNING,返回Wait步骤。
    • 如果SUCCEEDEED,则进入下一个状态
    • 如果[FAILED | STOPPED],去别的地方。

最后,它看起来像 this。

我的实际问题的解决方案是权限。当 运行 a startJogRun.sync:

时需要四个权限
  • 胶水:StartJobRun
  • 胶水:GetJobRun
  • 胶水:GetJobRuns
  • 胶水:BatchStopJobRun

这些实际上是 Terraform 值,但应该可以帮助任何为此苦苦挣扎的人。