我有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
});
我还从控制台检查过我认为是开始执行步进功能的正确权限:
我现在添加了更多权限(见下文),但仍然遇到同样的问题:
答案 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)