如何获得与step函数一起运行的AWS lambda函数的结果

时间:2018-07-09 07:58:17

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

我正在使用AWS step函数调用这样的lambda函数。

 return stepfunctions.startExecution(params).promise().then((result) => {
      console.log(result);
      console.log(result.output);
      return result;
    })

结果是

{ executionArn: 'arn:aws:states:eu-west-2:695510026694:...........:7c197be6-9dca-4bef-966a-ae9ad327bf23',
  startDate: 2018-07-09T07:35:14.930Z }

但是我想要将结果作为最终lambda函数的输出

我正在经历https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/StepFunctions.html#sendTaskSuccess-property

我对那里有多重函数感到困惑,哪个函数可以用来获取最终lambda函数的结果。

stackoverflow Api gateway get output results from step function?上存在相同的问题,我不想定期调用任何函数并保持检查状态。即使我定期使用DescribeExecution函数,我也只会得到执行状态,而不会得到想要的结果。是否有任何方法或任何函数返回promise并且在所有lambda执行完毕并返回结果后得到解决

3 个答案:

答案 0 :(得分:2)

您无法以同步方式从步进函数执行中获取结果。

不是在完成时轮询step函数的结果,而是将结果发送到SNS主题或SQS队列,以在最终的lambda函数中进行进一步处理,或者在step函数状态机中对整个过程进行建模。

答案 1 :(得分:2)

经过研究并查看了各种教程之后,我意识到此stackoverflow答案Api gateway get output results from step function?提供了一种更简单的方法来解决问题并从逐步函数中获得最终结果,是的,我不确定另一种方法以及如何实施任何新答案总是值得赞赏

这是我的代码,用于实现可能对某人有用的相同方法。

 // in function first start step function execution using startExecution()
var params = {
        stateMachineArn: 'some correct ARN',
        input: JSON.stringify(body)
      };
return stepfunctions.startExecution(params).promise().then((result) => {

        var paramsStatus = {
          executionArn: result.executionArn
        };

        var finalResponse =  new Promise(function(resolve,reject){
      var checkStatusOfStepFunction =  setInterval(function(){
//on regular interval keep checking status of step function
            stepfunctions.describeExecution(paramsStatus, function(err, data) {
              console.log('called describeExecution:', data.status);
              if (err){
                clearInterval(checkStatusOfStepFunction);
                 reject(err); 

              }
              else {
                if(data.status !== 'RUNNING'){
// once we get status is not running means step function execution is now finished and we get result as data.output
                  clearInterval(checkStatusOfStepFunction);

                   resolve(data.output);
                }  

              }
            }); 
          },200);
        });


        return finalResponse



      })

答案 2 :(得分:0)

能够获得步进功能的结果(例如:网关和步进功能组合)。您需要:

1。 startExecution
2。等待状态机完成(确保等待等同于状态机的超时=> wait =状态机的秒数)
3。调用describeExecution ,并接收来自startExecution的executionArn。

请注意,startExecution是一个异步函数,它不等待结果。

就我而言,我使用名为init的Lambda执行3个讨论的步骤:

代码lambda初始化:

export const searchApcaLocation = async (dataArr,setDeals) => {
    const promises = await dataArr.map(async item => {
        apca.request(item.destination);
        apca.onSuccess = (data) => {
            return fetch('http://localhost:3050/googlePlaceSearch',{
                        method:"post",
                        headers:{'Content-Type':'application/json'},
                        body:JSON.stringify({
                            cityName:data.airports[0].city
                            })
            })
            .then(res => res.json())
            .then(imagelinkData => {
                const locationObject = {
                    data: item,
                    imagelink: imagelinkData.link
                }
                return locationObject
            })
            .catch(err => console.log('error on image search',err))
        };
        apca.onError = (data) => {
            console.log('error',data)
        };
    })
    const results = await Promise.all(promises)
    return results
}

代码状态机 确保在状态机中返回“ ResultPath”。

const AWS = require('aws-sdk')

exports.handler = async (event) => {

    const stepFunctions = new AWS.StepFunctions();
    const reqBody = event.body || {};

    const params = {
        stateMachineArn: process.en.stateMachineArn,
        input: JSON.stringify(reqBody)
    }

    return stepFunctions.startExecution(params).promise()
        .then(async data => {
            console.log('==> data: ', data)
            await new Promise(r => setTimeout(r, 6000));
            return stepFunctions.describeExecution({ executionArn: data.executionArn }).promise();
        })
        .then(result => {
           return {
                statusCode: 200,
                message: JSON.stringify(result)
            }
        })
        .catch(err => {
            console.error('err: ', err)
            return {
                statusCode: 500,
                message: JSON.stringify({ message: 'facing error' })
            }
        })
}