amazon-web-services - codepipeline.putJobSuccessResult() 从 VPC 调用 Lambda 时挂起

标签 amazon-web-services aws-lambda aws-codepipeline

更新: 经过多次试验和磨难,我确定下面的代码 [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/

相关文章:

ssh - Amazon EC2 Root 登录

node.js - 在 AWS Lambda 函数中通过 AWS SES 发送电子邮件

python - Build/CodeBuild 不能有超过 5 个输入工件

amazon-web-services - CloudFormation CodePipeline 模板无权执行 AssumeRole,为什么?

python - AWS EC2 Django runserver 端口 8000 出现问题

amazon-web-services - signtool 无法使用来自 AWS CloudHSM 的 key 对二进制文件进行签名

reactjs - 为什么我无法显示上传到 S3 的图像(.svg)

aws-cloudformation - 如何在创建 CodePipeline 之前在 CloudFormation 中创建 ECS 任务

amazon-web-services - (google-chrome:23461):Gtk警告**:12:34:29.640:无法打开显示:

amazon-web-services - 如何在cloudformation上配置 `TracingConfig`?