可以从lambda执行step函数但是当我尝试传递一个值时,它无法输入{}

时间:2017-12-12 09:48:48

标签: node.js amazon-web-services amazon-s3 aws-lambda aws-sdk

所以基本上我已经创建了一个S3存储桶,我将文件放入其中。这会触发一个lambda_function(a),它调用一个step函数然后触发另一个lambda_function(b)....

我正在尝试将文件名从存储桶传递给lambda_function(b)......

到目前为止,我有...... 将文件名从S3存储桶传递给lambda_function(a), 从这里我面临的问题是我无法将其传递给阶梯函数。

我读过很多文章(例如https://medium.com/@tturnbull/passing-data-between-lambdas-with-aws-step-functions-6f8d45f717c3),但我似乎无法让它发挥作用......

所以我的lambda_function(a)看起来像这样......

const AWS = require('aws-sdk');

const stepFunctions = new AWS.StepFunctions({
region: 'us-west-2'
});

let index = function index(event, context, callback) {

const fileName = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
const params = {
    stateMachineArn: 'MY-STATE-MACHINE-NO',
    name: fileName
};

stepFunctions.startExecution(params, (err, data) => {
    if (err) {
    console.log(err);
    const response = {
        statusCode: 500,
        body: JSON.stringify({
        message: 'There was an error'
        })
    };
    callback(null, response);
    } else {
    console.log(data);
    const response = {
        statusCode: 200,
        body: JSON.stringify({
        message: 'Step function worked'
        }),
    };
    callback(null, response);
    }
});
};

module.exports.init = (event, context, callback) => {
};
exports.handler = index;

这一切都很好......我的步骤功能如下:

  {
  "Comment": "A Hello World example of the Amazon States Language using a Pass state",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Task",
      "Resource": "MY-ARN-NUMBER",
      "InputPath": "$.title",
      "ResultPath": "$.title",
      "OutputPath": "$.title",
      "End": true
    }
  }
}

我知道这是有效的,因为如果我使用

开始执行步骤函数
{
    "title":"131231231.xml"
}

存储在'title'中的文件名作为'event'传递给lambda_function(b)

所以我留下的问题是试图从lambda_function(a)到step函数。

我知道它必须作为JSON发送,所以如果你回顾我的功能,我已经编辑它包括:

 const response = {
    statusCode: 200,
    body: JSON.stringify({
    message: 'Step function worked',
    title :"131231231.xml"
    }),
    title :"131231231.xml"
};
callback(null, response);
}

但是在使用

的步骤功能时失败了
    {
  "error": "States.Runtime",
  "cause": "An error occurred while executing the state 'HelloWorld' (entered at the event id #2). Invalid path '$.title' : No results for path: $['title']"
}

有谁知道如何解决这个问题? ThanksYou

更新 感谢@rajesh的回复我能够确定

console.log('RESPONSE:'+ response);

打印RESPONSE:[object Object]

所以我把响应更改为

{
  var response = JSON.stringify({"title":"131231231.xml"});
};
console.log('RESPONSE: ' + response);
callback(null, response);

在日志中返回...

RESPONSE: {"title":"131231231.xml"}

所以从技术上来说这应该是对的?错误的...如果我检查步骤功能它失败并输出错误信息

    {
  "error": "States.Runtime",
  "cause": "An error occurred while executing the state 'HelloWorld' (entered at the event id #2). Invalid path '$.title' : No results for path: $['title']"
}

如果我在步骤函数中检查执行细节中的输入选项卡,则输入显示为空... {}

那么为什么输入没有捕获'标题'JSON ......任何想法?

1 个答案:

答案 0 :(得分:0)

您正在name params字段中传递您的输入。但是,您需要通过params的input字段传递您的输入(在您的情况下为空,因此错误)。尝试:

const params = {
    stateMachineArn: 'MY-STATE-MACHINE-NO',
    input: "{\"title\" : \"" + fileName + "\"}"
};

有关详细信息,请参阅sdk's documentation

var params = {
  stateMachineArn: 'STRING_VALUE', /* required */
  input: 'STRING_VALUE',
  name: 'STRING_VALUE'
};
stepfunctions.startExecution(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});
  

输入 - (字符串)   包含执行的JSON输入数据的字符串,例如:   “input”:“{\”first_name \“:\”test \“}”