更新:
经过多次试验和磨难,我确定下面的代码 [nodejs8.1 运行时](这是一个基本的 CodePipeline 设置,没有任何额外的代码)在正常调用 Lambda 时工作正常,但如果尝试从内部调用 Lambda在 VPC 中,codepipeline.putJobSuccessResult()
挂起并且 Lambda 超时。调用之前出现的任何代码都可以正常运行,但它只是无法运行 codepipeline.putJobSuccessResult()
并向 CodePipeline 提供正确的返回值,尽管 codepipeline 和 Lambda 都具有包含所有内容的角色各种策略和信任关系,VPC 有很多端点以及 NAT 网关和 Internet 网关。这会导致 CodePipeline 不断重试,直到超时(约 15 分钟)。
另请注意,在将 Lambda 添加到 CodePipeline 并添加端点之前,我手动运行 Lambda 并通过 NAT => Internet 网关 ( https://medium.com/@matthewleak/aws-lambda-functions-with-a-static-ip-89a3ada0b471 ) 成功利用静态 IP,甚至在 CodePipeline 内也是如此, Lambda 运行良好,直到使用 AWS 开发工具包 aws.CodePipeline.putJobSuccessResult()
/aws.CodePipeline.putJobFailureResult()
函数;所有其他代码均已成功执行。
理论上,要重现,只需使用下面的代码并创建 Lambda,按照上面的文章所述设置 VPC,设置基本的 CodePipeline 并调用 Lambda 作为管道的一部分。第一次运行应该可以正常工作。然后将 Lambda 分配给 VPC 和子网,然后再次运行管道,看看它在尝试 putJobSuccessResult 时是否没有挂起。
挂起行为意味着这是一个网络问题,但如果 CodePipeline 具有 VPC 的终端节点并且能够成功调用 Lambda,那么为什么 Lambda 无法与 CodePipeline 对话以 putJobSuccessResult/putJobFailureResult?我的猜测是,要么是我遗漏了 VPC 方面的某些内容,要么是 CodePipeline 无法正常工作和/或无法正确利用其端点 - 但我想弄清楚这一点。
// Working Base response code for CodePipeline
'use strict';
const aws = require('aws-sdk');
const codepipeline = new aws.CodePipeline();
let environment = 'dev';
let callback;
let context = {
invokeid: ''
}
exports.handler = async (event, context, callback) => {
context = context;
callback = callback;
console.log('Inside deploy-website Lambda');
if (!('CodePipeline.job' in event)) {
return Promise.resolve();
}
// Retrieve the Job ID from the Lambda action
let jobId;
if (event["CodePipeline.job"]) {
jobId = event["CodePipeline.job"].id;
// Retrieve the value of UserParameters from the Lambda action configuration in AWS CodePipeline, in this case the environment
// to deploy to from this function
environment = event["CodePipeline.job"].data.actionConfiguration.configuration.UserParameters || environment;
}
console.log(`Envrionment: ${environment}`);
console.log('Copy Successful');
console.log('Entering Results');
return await putJobSuccess('Copy Successful', jobId);
}
// Notify AWS CodePipeline of a successful job
async function putJobSuccess(message, jobId) {
console.log(`Post Job Success For JobID: ${jobId}`);
const params = {
jobId: jobId
};
console.log(`Job Success Params: ${JSON.stringify(params)}`);
await codepipeline.putJobSuccessResult(params).promise();
console.log('Job Success: Successfully reported hook results');
return callback(null, 'Job Success: Successfully reported hook results');
}
最佳答案
事实证明这确实是网络问题。看来 VPC 路由表才是吸引我的地方。创建路由表时,您需要选择一个名称和一个与其关联的 VPC。我忘记做的是转到子网并将它们关联到“路由表”选项卡下的正确路由表和/或我没有在其中一个上选择正确的路由表,因为当您选择路由表来关联它时到,它不显示逻辑名称,只显示路由表ID,这使得它更容易出错。因此,虽然这绝对是一个“新手”错误[如此愚蠢的错误带来了如此多的痛苦],但我认为在关联路由表的用户体验方面还有一些不足之处。
关于amazon-web-services - codepipeline.putJobSuccessResult() 从 VPC 调用 Lambda 时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54191023/