【问题标题】:AWS APIGateway Lambda proxy integration- Execution failed due to configuration error: Invalid permissions on Lambda functionAWS APIGateway Lambda 代理集成 - 由于配置错误,执行失败:Lambda 函数的权限无效
【发布时间】:2019-02-12 02:20:39
【问题描述】:

我对 AWS 和野兽比较陌生。在处理 API Gateway 到 Lambda 代理集成之后,我得到了 Execution failed due to configuration error: Invalid permissions on Lambda function

我遵循下面的设置,从真正有据可查的terraform documentation 引用,并且完全符合我的需要。但是在 API Gateway 控制台上测试时出现上述错误。

resource "aws_lambda_permission" "apigw" {
    statement_id  = "AllowAPIGatewayInvoke"
    action        = "lambda:InvokeFunction"
    function_name = "${aws_lambda_function.resource_name.arn}"
    principal     = "apigateway.amazonaws.com"

    # The /*/* portion grants access from any method on any resource
    # within the API Gateway "REST API".
    source_arn = "${aws_api_gateway_deployment.resource_name_of_deployment.execution_arn}/*/*"
  }

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway terraform


    【解决方案1】:

    API Gateway Lambda 代理集成的一些经验

    • API 网关部署在不同的阶段,API 网关的 ARN 阶段与测试控制台有些不同。 (至少这就是我在 terraform 输出中得到的)

    问题的许多文档和修复建议将详细路径显式配置为"arn:aws:execute-api:region_name:account_id:${aws_api_gateway_rest_api.api_resource.id}/*/*" 已配置的具有访问权限的源

     arn:aws:execute-api:region:accountid:fu349z93pa/*/*
    

    来自 terraform 文档 对于"${aws_api_gateway_deployment.deployment_rsc_name.execution_arn}"

    被授予访问权限的配置源是

    arn:aws:execute-api:region:accountid:fu349z93pa/stage/*/*
    

    如果您从 API Gateway 控制台进行测试,您最终会遇到同样的错误,并且必须手动添加对 lambda 的权限或在方法集成控制台上重新选择 lambda 函数名称(这会做同样的事情)。这配置了 2 个 API 网关来访问 Lambda。 (一个带有 /stage 部署的 ARN 和其他 /*/METHOD/* - used for test console

    但是,如果您在 postman 上从舞台环境的 ARN 测试 API 网关,则无需对使用 terraform 构建的基础设施进行任何手动更新,它就可以正常工作。在大多数情况下,这才是最重要的。

    • 即使在手动修复第一个错误之后/不是第二个挑战是Malformed response from lambda

    这是一个相当简单且有据可查的。 AWS Doc

    我们所要做的就是更新 lambda 以使用指定的格式进行响应。

    为了。例如在下面添加

    callback(null, { "statusCode": 200, "body" : JSON.stringify(sampleResponseJSON) }); on lambda `js`
    

    一旦端到端工作,我们总是可以添加错误处理场景。

    希望这能为像我这样的初学者节省一些时间。

    【讨论】:

    • 感谢您的详细回复。只需按照您的建议更改“aws_lambda_permission”上的source_arn即可。
    【解决方案2】:

    所以不要使用:

    resource "aws_lambda_permission" "apigw" {
        ... ...
        source_arn = "${aws_api_gateway_deployment.resource_name_of_deployment.execution_arn}/*/*"
    }
    

    我使用replace 方法从execution_arn 中删除stage_name

    resource "aws_lambda_permission" "apigw" {
        ... ...
        source_arn = "${replace(aws_api_gateway_deployment.resource_name_of_deployment.execution_arn, var.stage_name, "")}*/*"
    }
    

    现在一切都适合我

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 2019-07-17
      • 2019-09-16
      • 2018-07-12
      • 2023-03-05
      • 2020-04-19
      • 2016-11-21
      • 2017-07-10
      • 2017-04-03
      相关资源
      最近更新 更多