当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda目的地Lambda未触发

梁丘远航
2023-03-14

背景:

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

问题:

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

相关代码:

以下是Lambda函数目标的地形配置:

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

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

尝试:

  • 确保两个父/子Lambda函数都有权在各自的Cloudwatch日志组中创建日志(附加到两者的arn:aws:iam::aws:policy/service role/AWSLambdabasiceExecutionRole
  • 确保父Lambda函数具有调用子函数的正确权限:“Lambda:InvokeFunction”、“Lambda:InvokeAsync”
  • 为成功和失败的父lambda运行的子lambda函数设置异步调用(子函数仍未触发)
  • 添加API集成请求参数`{X-Amz-Invocation-Type':'事件'},如中所述:https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-integration-async.html
  • 对于每次修复此问题的尝试,我都确保从源代码(github webhook页面)而不是通过AWS Lambda控制台重新传递请求

共有2个答案

姚实
2023-03-14

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

慕容念
2023-03-14

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

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

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

 类似资料:
  • 我正在试验Dynamo db和lambda,并且在以下流程中遇到问题: Lambda A由put to S3事件触发。它获取对象(一个音频文件),计算其持续时间,并在dynamoDB中为每30秒的段写入一条记录。 Lambda B由DynamoDB触发,从S3下载文件并对Dynamo行中定义的30秒记录进行操作。 我的问题是,当我运行这个流时,函数A通过函数B写入Dynamo所需的所有行 似乎没有

  • 我实现了AWS Eventbridge规则和Lambda函数的基本组合作为其目标。假设该规则基于所有AWS自动缩放事件创建一个事件,并调用Lambda。当触发现有ASG的缩放操作时,此操作效果良好,但当创建具有相同前缀的新ASG时,规则不会做出反应。旧ASG名称:test-ASG-lc-123新ASG名称:test-ASG-lc-124 甚至可以使用通配符吗?

  • 我正在使用AWS Dynamo Streams触发AWS Lambda函数。如果lambda函数成功调用,我希望通过Lambda提供的异步调用目标功能调用子lambda函数。 尽管我已使用目标子Lambda函数配置了异步调用,但当父Lambda函数成功时,不会触发子函数,子Lambda函数的关联CloudWatch日志组为空。 我的父lambda有这样的策略:(提供对DynamoDB Stream

  • 假设: 让我们假设数据插入DynamoDB的速率是巨大的。 上下文: 在DynamoDB表上启用流,这将触发lambda。lambda读取流记录,并在弹性搜索中对记录进行索引。 问题陈述: 在将记录插入DynamoDB的时间和通过流式记录触发lambda的时间之间存在延迟。这种延迟或滞后不断增加,并且与插入DynamoDB的数据量成正比。 如何找到滞后的位置?是流没有立即触发lambda吗?还是因

  • 我有一个非常大的文件(估计50MB)。我把这个文件上传到一个S3目录,然后触发一个Lambda函数。我正在使用TransferManager进行S3上传。 我阅读了AWS关于Lambda和S3的文档,它说在S3中创建文件时会触发Lambda函数,但我仍然想知道创建的文件是否意味着文件已完全上载。 我的问题是:由于文件太大,上传会有一点延迟,所以Lambda函数是在文件完全上传之前还是之后触发的?例

  • 我有一个AWS Lambda函数,它订阅一个DynamoDB流,并配置了一个SQS死信队列(DLQ)。我可以看到在管理控制台中配置了正确的队列。此外,我还注意为DLQ上的赋予函数权限。 订阅可以工作,但仍然会在调用错误时“挂起”,就像没有配置DLQ一样。例如,如果有一条消息导致未处理的异常,函数将继续重试该消息,直到将其从流中删除。我可以看到调用错误的数量增加了,函数的Cloudwatch仪表板中