Codepipeline lambda 操作永远不会完成

Ger*_*uña 3 aws-lambda aws-codepipeline

好吧,根据日志,我的 lambda 函数工作得很好,但它从未在 codepipeline 阶段完成,我已经为允许通知管道设置了角色权限(“codepipeline:PutJobSuccessResult”,“codepipeline:PutJobFailureResult”),甚至设置了 maximun时间到 20 秒但仍然不起作用(实际上在 800 毫秒时结束)。

const axios = require('axios')
const AWS = require('aws-sdk');

const url = 'www.exampleurl.com'

exports.handler = async (event, context) => {
  const codepipeline = new AWS.CodePipeline();

  const jobId = event["CodePipeline.job"].id;
  const stage = event["CodePipeline.job"].data.actionConfiguration.configuration.UserParameters; 

  const putJobSuccess = function(message) {
    var params = {
        jobId: jobId
    };

    codepipeline.putJobSuccessResult(params, function(err, data) {
        if (err) {context.fail(err); }
        else     {context.succeed(message);}
    });
};

  const putJobFailure = function(message) {
    var params = {
        jobId: jobId,
        failureDetails: {
            message: JSON.stringify(message),
            type: 'JobFailed',
            externalExecutionId: context.invokeid
        }
    };
    codepipeline.putJobFailureResult(params, function(err, data) {
        if (err) console.log(err)
        context.fail(message);      
    });
};

try {
    await axios.post(url, { content: stage})

    putJobSuccess('all fine')

} catch (e) {
    putJobFailure(e)
}
Run Code Online (Sandbox Code Playgroud)

};

小智 5

根本问题

因为nodeJS 默认情况下异步运行所有内容,codepipeline.putJobSuccessResult所以正在异步运行。问题似乎是 Lambda 函数在codepipeline.putJobSuccessResult有机会完成之前就完成了执行。

解决方案

同步运行codepipeline.putJobSuccessResult,以便在将响应返回到 lambdaHandler 的 Lambda 之前强制完成。

const putJobSuccess = function(id) {
    //await sleep(60);
    console.log("Telling Codepipeline test passed for job: " + id)
    var params = {
        jobId: id
    };
    return codepipeline.putJobSuccessResult(params, function(err, data) {
        if(err) {
            console.error(err)
        } else {
            console.log(data) 
        }

    }).promise()
};

exports.lambdaHandler = async (event, context) => {

    ...   
    await putJobSuccess( jobId )
    return response

};



Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!!现在已经调试了大约 4 个小时,您帮助我意识到这是因为 Lambda 在发送作业成功结果之前退出。值得注意的是,您也可以通过“await codepipeline.putJobSuccessResult(...).promise()”来实现这一点。 (2认同)