我正在通过 Terraform 一起部署 API 网关和 Lambda 函数,而 Lambda 函数应该由 API 网关触发。资源成功部署后,我测试 API 网关并得到响应:
{
"message": "内部服务器错误"
}
。
API网关的实际日志显示:
由于配置错误而执行失败:Lambda 函数的权限无效
我可以通过转到 API 网关的集成请求部分、重新选择现有函数并使用小复选标记再次“保存”它来使实际的 api-lambda 功能正常工作,但这会破坏自动化,我希望它无需每次都必须执行该手动步骤。不确定这是否是 Terraform/AWS 中的错误,或者我是否做错了什么。 (发现有人问同样的问题但使用 SAM 但没有回复:由于配置错误而执行失败:Lambda 函数的权限无效 https://stackoverflow.com/questions/54067224/execution-failed-due-to-configuration-error-invalid-permissions-on-lambda-funct/54835261#54835261)
我当前的设置是通过 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}"
}
}
我的 swagger 文件的相关部分如下所示:
"x-amazon-apigateway-integration": {
"uri": "${session_init_arn}",
"responses": {
"default": {
"statusCode": "200"
}
},
"requestTemplates": {
"application/json": ....
我的 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"
}
如果您有任何建议请告诉我,谢谢!