【问题标题】:AWS Lambda destination Lambda not triggeringAWS Lambda 目标 Lambda 未触发
【发布时间】:2021-06-19 07:45:45
【问题描述】:

背景:

我正在通过 Terraform 开发自定义 AWS github-webhook。我正在使用 AWS API Gateway 触发 AWS Lambda 函数,该函数从请求标头验证 GitHub Webhook 的 sha256 签名。如果 lambda 函数成功验证请求,我希望通过 Lambda 提供的异步调用目标功能调用子 lambda 函数。

问题:

即使我已经使用目标子 Lambda 函数配置了异步调用,但在父 Lambda 函数成功时不会触发子函数。这反映在子 Lambda 函数的关联 CloudWatch 日志组为空这一事实。

相关代码:

这是 Lambda 函数目标的 Terraform 配置:

resource "aws_lambda_function_event_invoke_config" "lambda" {
  function_name = module.github_webhook.function_name
  destination_config {
    on_success {
      destination = module.lambda.function_arn
    }
  }
}

如果需要模块中的更多代码,请随时在 cmets 中询问。该模块的完整源代码在这里:https://github.com/marshall7m/terraform-aws-codebuild/tree/master/modules/dynamic-github-source

尝试:

  • 确保父/子 Lambda 函数都有权在各自的 Cloudwatch 日志组中创建日志(均附有 arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole 政策)
  • 确保父 Lambda 函数具有调用子函数的正确权限:"lambda:InvokeFunction", "lambda:InvokeAsync"
  • 为成功和失败的父 Lambda 运行设置子 lambda 函数的异步调用(子函数仍未触发)
  • 添加 API 集成请求参数 `{'X-Amz-Invocation-Type': 'Event'},如:https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-integration-async.html
  • 对于解决此问题的每一次尝试,我都确保从源(github webhook 页面)重新发送请求,而不是通过 AWS Lambda 控制台。

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-cloudwatch


    【解决方案1】:

    根据您的描述,在我看来,您正在同步调用父函数。 Lambda destinations 仅用于异步调用:

    您还可以配置 Lambda 以将调用记录发送到另一个服务。 Lambda 支持以下异步调用目标

    因此,您必须异步执行父函数才能调用子函数。

    【讨论】:

    • 感谢@Marcin 的提示。为了异步调用父函数,我在与父 lambda 函数关联的 API 集成中添加了一个带有静态“事件”值的请求参数,如:docs.aws.amazon.com/apigateway/latest/developerguide/… 中所述。子函数仍未触发。
    • @Marshallm 您是否尝试过在没有 github 的情况下使用 AWS CLI 来确认它是否有效?
    • 我尝试通过aws lambda invoke --function-name payload-validator-anlcAA0MBMI --invocation-type Event response.json使用AWS CLI,子函数成功触发。
    • @Marshallm 是的,所以一切都是正确的。如果我的回答有帮助,我们将不胜感激。
    【解决方案2】:

    添加 API 集成请求参数 `{'X-Amz-Invocation-Type': 'Event'} 如在:https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-integration-async.html 中提到的那样成功了。我最初得出的结论是,这个解决方案不起作用,因为我重新交付 github 有效负载时没有创建新的 Cloudwatch 日志组流。事实证明,当我仔细查看之前的 Cloudwatch 日志流时,我发现 Cloudwatch 将用于重新触发的 Lambda 函数调用的日志附加到之前关联的 Cloudwatch 日志流中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-27
      • 2019-01-11
      • 2020-03-17
      • 2020-10-15
      • 2020-05-17
      • 2018-02-26
      • 2018-06-18
      • 1970-01-01
      相关资源
      最近更新 更多