通过 terraform 部署的 AWS API 网关和 Lambda 函数 -- 由于配置错误而导致执行失败:Lambda 函数的权限无效

tra*_*bal 6 amazon-web-services swagger aws-lambda terraform aws-api-gateway

我正在通过 Terraform 一起部署 API 网关和 Lambda 函数,并且 Lambda 函数旨在由 API 网关触发。资源成功部署后,我测试 API 网关并得到响应:

{“消息”:“内部服务器错误”}。

API网关的实际日志说:

由于配置错误,执行失败:Lambda 函数的权限无效

我可以通过转到 API 网关的集成请求部分,重新​​选择我现有的功能,并用小复选标记再次“保存”它来使实际的 api-lambda 功能工作,但这会破坏自动化,我希望它在没有每次都必须执行该手动步骤。不确定这是 Terraform/AWS 中的错误还是我做错了什么。(发现有人问了同样的问题,但使用 SAM 但没有响应:由于配置错误,执行失败:Lambda 函数的权限无效

我当前的设置是通过 swagger json 文件部署 API,并且 Lambda Invoke ARN 用作此文件集成部分中的 URI。我曾尝试在硬编码 ARN 和变量之间切换,但无济于事。我还尝试包含 aws_api_gateway_deployment 和 aws_api_gateway_integration 资源,但我认为如果我已经在使用 swagger 文件,那么使用这些会与 swagger 文件已经构建的内容发生冲突。

我的 api_gateway 模块的 main.tf 如下所示:

resource "aws_api_gateway_rest_api" "post_session" {
    name = "${var.api_gateway_name}"
    body = "${data.template_file.post-session.rendered}"

    endpoint_configuration {
        types = ["PRIVATE"]
    }
}

data "template_file" "post-session" {
    template = "${file("../source/aapt-ual-post-session-v1-swagger-apigateway.json")}"

    vars {
        session_init_arn = "${var.session_init_function_arn}"
    }
}
Run Code Online (Sandbox Code Playgroud)

我的 swagger 文件的相关部分如下所示:

"x-amazon-apigateway-integration": {
      "uri": "${session_init_arn}",
      "responses": {
        "default": {
          "statusCode": "200"
        }
      },
      "requestTemplates": {
        "application/json":  ....
Run Code Online (Sandbox Code Playgroud)

我的 Lambda 模块的 lambda_permission/api_gateway 触发器部分如下所示:

resource "aws_lambda_permission" "post_session_trigger" {
     statement_id  = "Allow_My_Post_Session_Invoke"
     action        = "lambda:InvokeFunction"
     function_name = "${aws_lambda_function.init_function.function_name}"
     principal     = "apigateway.amazonaws.com"
     source_arn = "arn:aws:execute-api:us-east-1:${var.account_id}:${var.post_session_id}/v1/POST/aa/ual/session"

}
Run Code Online (Sandbox Code Playgroud)

如果您有任何建议,请告诉我,谢谢!

tra*_*bal 6

根据Denis Weerasiri的建议,我在 API Gateway 的集成部分重新选择 Lambda 函数名称后检查了 Lambda 权限,并且它添加了另一个策略。我需要进行的更改是将 Lambda 函数资源的 source_arn 中的 v1 更改为 *。因此,我的 Lambda 模块中的新 API 网关触发器如下所示:

resource "aws_lambda_permission" "post_session_trigger" {
     statement_id  = "Allow_My_Post_Session_Invoke"
     action        = "lambda:InvokeFunction"
     function_name = "${aws_lambda_function.init_function.function_name}"
     principal     = "apigateway.amazonaws.com"
     source_arn = "arn:aws:execute-api:us-east-1:${var.account_id}:${var.post_session_id}/*/POST/aa/ual/session"}
Run Code Online (Sandbox Code Playgroud)