AWS CodePipeline将错误的JobId传递给Lambda(nodejs)

时间:2018-11-28 06:48:54

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

我有一个包含4个阶段的管道,分别是源,构建,部署和Lambda阶段。在lambda阶段,我运行一个函数在s3中移动一些文件。

s3函数起作用,我可以看到s3文件已被移动,但是Lambda阶段永远不会成功,它总是超时。经过一番挖掘之后,我认为这是因为CodePipeline将错误的JobId传递给Lambda,因为如果我记录传入的事件,我可以看到id值不同于在管道历史记录选项卡中运行的id。

该函数设置为同时运行putJobSuccessResult()putJobFailureResult(),它们之所以起作用,是因为如果我随后从管道的“历史记录”选项卡中复制id并将其放入Lambda和运行测试,然后管道成功而不是超时。

我已经搜索了几个小时的答案,但似乎找不到任何解决方案,甚至找不到其他遇到相同问题的解决方案。我对整个AWS还是相当陌生,所以也许我错过了一些东西。

非常感谢您的帮助。

已更新:

我正在使用以下方法获取工作编号:

var jobId = event["CodePipeline.job"].id;

1 个答案:

答案 0 :(得分:3)

您可以发布lambda代码吗?

当对管道的成功/失败请求未完成时,可能会发生此类问题。例如,当lambda在调用完成之前退出时。

  1. 检查您的异步执行,例如,如果您的lambda处理程序是async函数,请使用await关键字调用管道API。

  2. 捕获错误并在发生异常时将管道设置为失败。

示例:

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()
  }
}