【问题标题】:Starting a StepFunction and exiting doesn't trigger execution启动 StepFunction 并退出不会触发执行
【发布时间】:2020-01-28 21:18:40
【问题描述】:

我有 Lambda 函数 tranportKickoff,它接收输入,然后将输入转发/代理发送到 Step Function确实下面的代码运行并且我没有收到任何错误,但同时 step 函数没有执行。

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

注意:我可以独立执行step函数,我知道它工作正常

  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
  });

我还从控制台检查了我是否拥有我认为正确的权限来开始执行步进函数:

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

  • 'states:ListStateMachines'
  • 'states:CreateActivity'
  • 'states:StartExecution'
  • 'states:ListExecutions'
  • 'states:DescribeExecution'
  • 'states:DescribeStateMachineForExecution'
  • 'states:GetExecutionHistory'

【问题讨论】:

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


    【解决方案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”方法确实按预期工作。

    至于为什么我的步进函数没有得到任何执行...它必须按照我命名函数的方式...您仅限于名称中的一部分字符,而我已经跳过这个限制,但直到我能够使用上面的代码捕获错误时才意识到。

    【讨论】:

      【解决方案2】:

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

      基于承诺的版本:

      import { StepFunctions } from 'aws-sdk';
      
      const clients = {
        stepFunctions: new StepFunctions();
      }
      
      const createExecutor = ({ clients }) => async (event) => {
        console.log('Executing media pipeline job');
      
        const params = {
          stateMachineArn: '<state-machine-arn>',
          input: JSON.stringify({}),
          name: 'new-job',
        };
      
        const result = await stepFunctions.startExecution(params).promise();
        // { executionArn: "string", startDate: number }
      
        return result;
      };
      
      const startExecution = createExecutor({ clients });
      
      // Pass in the event from the Lambda e.g S3 Put, SQS Message
      await startExecution(event);
      

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

      【讨论】:

        猜你喜欢
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 2020-07-03
        • 2021-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-17
        相关资源
        最近更新 更多