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

时间:2018-09-06 18:53:56

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

我对AWS和野兽比较陌生。在完成API网关到Lambda代理集成的工作后,我得到了bb

我遵循以下记录,该记录是由确实有据可查的Execution failed due to configuration error: Invalid permissions on Lambda function引用的,完全满足了我的需要。但是在API Gateway控制台上进行测试时,出现了上述错误。

terraform documentation

2 个答案:

答案 0 :(得分:9)

从API Gateway Lambda代理集成中学到的东西很少

  • API网关部署在不同的阶段,API网关的ARN与测试控制台上的阶段相比有所不同。 (这就是我在terraform输出中得到的结果)

许多文档和针对此问题的修复程序建议将详细路径明确配置为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}/*/*" } 具有授予访问权限的已配置源

"arn:aws:execute-api:region_name:account_id:${aws_api_gateway_rest_api.api_resource.id}/*/*"

来自Terraform文档   对于 arn:aws:execute-api:region:accountid:fu349z93pa/*/*

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

"${aws_api_gateway_deployment.deployment_rsc_name.execution_arn}"

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

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

  • 即使手动解决了第一个错误,也没有used for test console是第二个挑战

这是一个相当容易并且有据可查的文件。 AWS Doc

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

。例如在下面添加

Malformed response from lambda

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

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

答案 1 :(得分:0)

所以不要使用:

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

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

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

现在一切对我有用