所以基本上我已经创建了一个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 ......任何想法?
答案 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 \“}”