【问题标题】:Lambda can't execute putjobSuccess for CodePipeline inside a VPCLambda 无法在 VPC 内为 CodePipeline 执行 putjobSuccess
【发布时间】:2020-06-24 14:40:32
【问题描述】:

我正在尝试创建一个适用于 CodePipeline 的 Lambda 函数。问题是它无法将作业成功信息发送到 CodePipeline。 我正在使用 javascript aws-sdk 和来自 AWS.CodePipeline 对象的函数 putJobSuccessResult 在生产中无法正常执行。

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

const codepipeline = new AWS.CodePipeline();

exports.config = (event, context) => {
  // Retrieve the Job ID from the Lambda action
  const jobId = event['CodePipeline.job'].id;

  return codepipeline.putJobSuccessResult({ jobId }).promise();
};

当我放置管道的 jobId 时,此代码在本地运行良好,但当我将代码上传到 AWS 控制台并运行管道时,它不再运行。

这是特定于 CodePipeline 部分的 Lambda 的 IAM 配置:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "codepipeline:PutJobSuccessResult",
                "codepipeline:PutJobFailureResult"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

您对为什么它不能在云上运行有任何想法吗?

【问题讨论】:

  • 您的管道是否拥有lambda:InvokeFunctionlambda:ListFunctions 的权限?
  • @Marcin 是的。 lambda 执行良好,但在尝试执行 putJobSuccessResult 函数时超时。
  • 是否在 VPC 中?
  • @Marcin 是的

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


【解决方案1】:

VPC 中的 lambda 超时的一个很可能的原因是它无法访问互联网,因为它没有公共 IP。来自docs

将您的函数连接到私有子网以访问私有资源。如果您的函数需要访问 Internet,请使用 NAT。将函数连接到公共子网不会为其提供 Internet 访问权限或公共 IP 地址

要纠正该问题,应检查以下内容

  • 是私有子网中的 lambda
  • 公有子网中是否有 NAT 网关/实例
  • 是从私有子网到 NAT 设备的正确配置的路由表,以启用互联网访问

或者,可以考虑为 CodePiepline 使用(或检查是否存在)VPC interface endpoint。该接口如果正确设置,可以在没有互联网的情况下启用从 lambda 函数访问 CodePipeline。

【讨论】:

  • 非常感谢 @Marcin,通过在我的 VPC 上为 CodePipeline 创建一个 interface endpoint 可以正常工作
猜你喜欢
  • 1970-01-01
  • 2017-06-23
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
相关资源
最近更新 更多