AWS APIGateway Lambda代理集成-由于配置错误,执行失败:Lambda函数的权限无效

Pat*_*Pat 7 amazon-web-services aws-lambda terraform aws-api-gateway

我对AWS和野兽比较陌生。在进行API网关到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}/*/*"
  }
Run Code Online (Sandbox Code Playgroud)

Pat*_*Pat 11

从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/*/*
Run Code Online (Sandbox Code Playgroud)

从terraform文档中 "${aws_api_gateway_deployment.deployment_rsc_name.execution_arn}"

具有授予访问权限的已配置源是

arn:aws:execute-api:region:accountid:fu349z93pa/stage/*/*
Run Code Online (Sandbox Code Playgroud)

如果从API Gateway控制台进行测试,最终将出现相同的错误,并且必须手动向lambda添加权限或在方法集成控制台上重新选择lambda函数名称(功能相同)。该配置将2个API网关配置为访问Lambda。(一个/stage部署了ARN,另一个部署了/*/METHOD/*- used for test consoleLambda控制台

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

  • 即使手动修复了第一个错误,也没有第二个挑战 Malformed response from lambda

这是相当容易的,并且有据可查。AWS文档

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

对于。例如在下面添加

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

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

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

  • 感谢您在这里的详细回复。根据您的建议,只需在“ aws_lambda_permission”上更改`source_arn`。 (2认同)

Ste*_*Yue 5

所以不要使用:

resource "aws_lambda_permission" "apigw" {
    ... ...
    source_arn = "${aws_api_gateway_deployment.resource_name_of_deployment.execution_arn}/*/*"
}
Run Code Online (Sandbox Code Playgroud)

我使用该方法从以下位置replace删除:stage_nameexecution_arn

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

现在一切都适合我