如何使Python粘合作业在步函数中调用时返回?

3

我有一个在Python中的粘合作业,我从步骤函数中调用。步骤函数成功启动作业。作业成功完成。但是步骤函数永远不会转移到下一步。是否需要某些必要的配置/权限才能让步骤函数响应作业成功?在Python脚本中做些什么?

这是步骤函数(状态机)定义:

Original Answer翻译成"最初的回答":

Sorry, I cannot provide a translation without the original answer to be translated.

"MyGlueTask": {
  "Type": "Task",
  "Resource": "arn:aws:states:::glue:startJobRun.sync",
  "Parameters": {
    "JobName": "my_glue_job"
  },
  "ResultPath": "$.MyGlueTask",
  "Next": "NextGlueJob"
}

你是如何调用Glue作业的?你能分享一下你的步骤函数定义(在AWS控制台中称为“状态机定义”)吗? - ya24
为工作添加了状态机。 - Greg McGuffey
2个回答

10

我实际问题的解决方案是权限。在运行 startJogRun.sync 时需要四个权限:

  • glue:StartJobRun
  • glue:GetJobRun
  • glue:GetJobRuns
  • glue:BatchStopJobRun

这些实际上是 Terraform 值,但应该对任何遇到此问题的人有所帮助。


谢谢,救了我的一天!只是好奇为什么我们需要最后一个 glue:BatchStopJobRun - wawawa
可以给我一个快速的资源链接吗?要在状态机执行事件历史中找到此粘合工作的资源链接。 - wawawa
谢谢。这对我来说也是一样的情况。我最初创建了一个只包含startJobRun和自动创建角色的状态机。该角色不包含startJobRun.sync所需的某些权限,因为它们并不需要。当我编辑了带有startJobRun.sync的状态机定义,但没有更改角色时,就会导致与此问题相同的情况。我可以通过重新创建带有startJobRun.sync的状态机来解决这个问题,然后自动创建的角色将包含所需的权限。也可以直接编辑现有角色。 - Kota Mori

0

你确定它从不会进入下一步吗?也许它会,但是比如说,需要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作业本身中检索出来,所以我创建了一个Lambda函数,使用boto3的start_job_run函数运行Glue作业,然后从响应中获取RunJobId
  2. 创建一个Lambda函数,通过上一步的RunJobId,使用boto3的get_job_run函数获取Glue作业的状态(JobRunState)。
  3. 使用Wait Step Functions状态类型,每隔N秒运行您创建的Lambda函数。
  4. 使用Choice状态类型来过滤掉Glue作业的状态。
    • 如果是RUNNING,返回到Wait步骤。
    • 如果是SUCCEEDEED,则继续下一个状态。
    • 如果是[FAILED | STOPPED],则去其他地方。
最后,它看起来像是this

感谢提供的信息。我的问题最终变得简单得多,与权限有关。 - Greg McGuffey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接