AWS Lambda 目标 Lambda 未触发
AWS Lambda destination Lambda not triggering
背景:
我正在通过 Terraform 开发自定义 AWS github-webhook。我正在使用 AWS API 网关触发 AWS Lambda 函数,该函数从请求 header 中验证 GitHub webhook 的 sha256 签名。如果 lambda 函数成功验证请求,我希望通过 Lambda 提供的异步调用目标功能调用 child lambda 函数。
问题:
尽管我已经使用目标 child Lambda 函数配置了异步调用,但当 parent Lambda 函数成功时,child 函数不会被触发。这反映在 child 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
}
}
}
如果需要模块中的更多代码,请随时在评论中提问。此模块的完整源代码在这里:https://github.com/marshall7m/terraform-aws-codebuild/tree/master/modules/dynamic-github-source
尝试次数:
- 确保两个 parent/child Lambda 函数都有权在其各自的 Cloudwatch 日志组中创建日志(将
arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
策略附加到两者)
- 确保 parent Lambda 函数具有调用 child 函数的正确权限:
"lambda:InvokeFunction", "lambda:InvokeAsync"
- 为成功和失败的 child lambda 函数设置异步调用 parent Lambda 运行(child 函数仍未触发)
- 添加 API 集成请求参数 `{'X-Amz-Invocation-Type': 'Event'} 中提到: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-integration-async.html
- 对于修复此问题的每一次尝试,我都确保从源(github webhook 页面)而不是通过 AWS Lambda 控制台重新发送请求。
根据您的描述,我认为您是在同步调用父函数。 Lambda destinations 仅适用于 异步 调用:
You can also configure Lambda to send an invocation record to another service. Lambda supports the following destinations for asynchronous invocation
因此您必须异步执行父函数才能调用子函数。
添加 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 日志流。
背景:
我正在通过 Terraform 开发自定义 AWS github-webhook。我正在使用 AWS API 网关触发 AWS Lambda 函数,该函数从请求 header 中验证 GitHub webhook 的 sha256 签名。如果 lambda 函数成功验证请求,我希望通过 Lambda 提供的异步调用目标功能调用 child lambda 函数。
问题:
尽管我已经使用目标 child Lambda 函数配置了异步调用,但当 parent Lambda 函数成功时,child 函数不会被触发。这反映在 child 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
}
}
}
如果需要模块中的更多代码,请随时在评论中提问。此模块的完整源代码在这里:https://github.com/marshall7m/terraform-aws-codebuild/tree/master/modules/dynamic-github-source
尝试次数:
- 确保两个 parent/child Lambda 函数都有权在其各自的 Cloudwatch 日志组中创建日志(将
arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
策略附加到两者) - 确保 parent Lambda 函数具有调用 child 函数的正确权限:
"lambda:InvokeFunction", "lambda:InvokeAsync"
- 为成功和失败的 child lambda 函数设置异步调用 parent Lambda 运行(child 函数仍未触发)
- 添加 API 集成请求参数 `{'X-Amz-Invocation-Type': 'Event'} 中提到: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-integration-async.html
- 对于修复此问题的每一次尝试,我都确保从源(github webhook 页面)而不是通过 AWS Lambda 控制台重新发送请求。
根据您的描述,我认为您是在同步调用父函数。 Lambda destinations 仅适用于 异步 调用:
You can also configure Lambda to send an invocation record to another service. Lambda supports the following destinations for asynchronous invocation
因此您必须异步执行父函数才能调用子函数。
添加 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 日志流。