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

AWS CodePipeline passing wrong JobId to Lambda (nodejs)

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

s3 功能有效,我可以看到 s3 文件已被移动,但 Lambda 阶段永远不会成功,它总是超时。经过一番研究后,我认为这是因为 CodePipeline 将错误的 JobId 传递给 Lambda,因为如果我记录传入事件,我可以看到 id 值与管道历史选项卡中 运行ning 的 id 不同。

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

我已经搜索了几个小时的答案,但我似乎找不到任何解决方案,甚至找不到其他有同样问题的人。总的来说,我对 AWS 还很陌生,所以我可能遗漏了一些东西。

非常感谢任何帮助,谢谢。

已更新:

我正在使用以下方法获取 jobid:

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

你能post lambda 代码吗?

当对管道的 success/failure 请求未完成时,可能会发生此类问题。例如,当 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()
  }
}