首页 > 解决方案 > AWS CodePipeline 将错误的 JobId 传递给 Lambda(nodejs)

问题描述

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

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

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

我已经搜索了几个小时的答案,但我似乎找不到任何解决方案,甚至找不到任何有同样问题的人。作为一个整体,我对 AWS 相当陌生,所以也许我遗漏了一些东西。

任何帮助将不胜感激,谢谢。

更新:

我正在使用以下内容来获取jobid:

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

标签: node.jsamazon-web-servicesaws-lambdaaws-codepipeline

解决方案


你能发布lambda代码吗?

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

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

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

推荐阅读