启动StepFunction并退出并不会触发执行

时间:2018-03-12 20:45:30

标签: amazon-web-services aws-lambda aws-step-functions

我有Lambda函数tranportKickoff,它接收输入,然后将输入的代理发送到步骤函数下面的代码运行,我没有错误,但同时步骤功能没有执行。

对于设计也很关键,我不希望transportKickoff函数等待步骤函数完成,因为它可能会运行很长时间。但是,我希望同步报告步骤函数的调用中的任何错误。也许这个想法是错误的,我不知道错过了某个地方抛出的错误。但是,如果是这种情况,我想找到一种能够在步骤函数开始执行后立即实现启动lambda函数退出的目标的方法。

  

注意:我可以独立执行步骤功能,我知道它可以正常工作

  const stepFn = new StepFunctions({ apiVersion: "2016-11-23" });
  const stage = process.env.AWS_STAGE;
  const name = `transport-steps ${message.command} for "${stage}" environment at ${Date.now()}`;
  const params: StepFunctions.StartExecutionInput = {
    stateMachineArn: `arn:aws:states:us-east-1:999999999:stateMachine:transportion-${stage}-steps`,
    input: JSON.stringify(message),
    name
  };
  const request = stepFn.startExecution(params);
  request.send();
  console.info(
    `startExecution request for step function was sent, context sent was:\n`,
    JSON.stringify(params, null, 2)
  );

  callback(null, {
    statusCode: 200
  });

我还从控制台检查过我认为是开始执行步进功能的正确权限:

enter image description here

我现在添加了更多权限(见下文),但仍然遇到同样的问题:

  • '规定:ListStateMachines'
  • '规定:CreateActivity'
  • '规定:StartExecution'
  • '规定:ListExecutions'
  • '规定:DescribeExecution'
  • '规定:DescribeStateMachineForExecution'
  • '规定:GetExecutionHistory'

2 个答案:

答案 0 :(得分:1)

好的,我自己已经想出了这个,希望这个答案对其他人有用:

首先,send()方法不是同步调用,但也不返回承诺。相反,您必须在发送之前在Request对象上设置侦听器,以便您可以适当地响应成功/失败状态。

我已使用以下代码完成此操作:

const stepFn = new StepFunctions({ apiVersion: "2016-11-23" });
const stage = process.env.AWS_STAGE;
const name = `${message.command}-${message.upc}-${message.accountName}-${stage}-${Date.now()}`;
const params: StepFunctions.StartExecutionInput = {
  stateMachineArn: `arn:aws:states:us-east-1:837955377040:stateMachine:transportation-${stage}-steps`,
  input: JSON.stringify(message),
  name
};
const request = stepFn.startExecution(params);
// listen for success
request.on("extractData", req => {
  console.info(
    `startExecution request for step function was sent and validated, context sent was:\n`,
    JSON.stringify(params, null, 2)
  );

  callback(null, {
    statusCode: 200
  });
});
// listen for error
request.on("error", (err, response) => {
  console.warn(
    `There was an error --  ${err.message} [${err.code}, ${
      err.statusCode
    }] -- that blocked the kickoff of the ${message.command} ITMS command for ${
      message.upc
    } UPC, ${message.accountName} account.`
  );
  callback(err.statusCode, {
    message: err.message,
    errors: [err]
  });
});
// send request
request.send();

现在请记住,有一个"成功"事件,但我使用" extractData"为了获得成功,我希望尽快得到答复。成功也可能同样有效,但是看看Typescript中的语言并不完全清楚,在我的测试中,我确定" extractData&#34 ;方法确实按预期工作。

至于为什么我没有对我的步骤功能执行任何操作......它必须按照我命名功能的方式...你只限于名字中的一部分字符,而我&#39 ; d跨过了这个限制,但直到我能够用上面的代码捕获错误才意识到。

答案 1 :(得分:0)

对于在执行Lambda的状态机时遇到问题的任何人,请确保将“ states:StartExecution”权限添加到Lambda权限中,并且区域匹配。

基于承诺的版本:

if Total_Errors != 0:

    ErrorWindow = tkinter.Toplevel(Window)
    ErrorWindow.title("Error")
    ErrorWindow.minsize(width=250, height=250)
    ErrorWindow.resizable(0,0)

    tkinter.Label(ErrorWindow, text="Error found at:").pack()
    tkinter.Label(ErrorWindow, text=root).pack()

    tkinter.Button(ErrorWindow,text="Continue", command=ErrorWindow.destroy).pack()

    os.startfile(root)
    Window.wait_window(ErrorWindow)

结果应包含执行ARN和开始日期(read more