我有一个包含4个阶段的管道,分别是源,构建,部署和Lambda阶段。在lambda阶段,我运行一个函数在s3中移动一些文件。
s3函数起作用,我可以看到s3文件已被移动,但是Lambda阶段永远不会成功,它总是超时。经过一番挖掘之后,我认为这是因为CodePipeline将错误的JobId传递给Lambda,因为如果我记录传入的事件,我可以看到id值不同于在管道历史记录选项卡中运行的id。
该函数设置为同时运行putJobSuccessResult()
和putJobFailureResult()
,它们之所以起作用,是因为如果我随后从管道的“历史记录”选项卡中复制id并将其放入Lambda和运行测试,然后管道成功而不是超时。
我已经搜索了几个小时的答案,但似乎找不到任何解决方案,甚至找不到其他遇到相同问题的解决方案。我对整个AWS还是相当陌生,所以也许我错过了一些东西。
非常感谢您的帮助。
已更新:
我正在使用以下方法获取工作编号:
var jobId = event["CodePipeline.job"].id;
答案 0 :(得分:3)
您可以发布lambda代码吗?
当对管道的成功/失败请求未完成时,可能会发生此类问题。例如,当lambda在调用完成之前退出时。
检查您的异步执行,例如,如果您的lambda处理程序是async
函数,请使用await
关键字调用管道API。
捕获错误并在发生异常时将管道设置为失败。
示例:
const AWS = require('aws-sdk')
const codepipeline = new AWS.CodePipeline({apiVersion: '2015-07-09'})
exports.handler = async function(event, context) {
const jobId = event["CodePipeline.job"].id
try {
...
const params = {
jobId
}
await codepipeline.putJobSuccessResult(params).promise()
}
catch (err) {
const params = {
jobId,
failureDetails: {
message: err.toString(),
type: 'JobFailed',
externalExecutionId: context.invokeid
}
}
await codepipeline.putJobFailureResult(params).promise()
}
}