我正在编写Terraform来部署具有AWS Lambda集成的AWS API Gateway。我想在可以从lambda引用的url中指定一个可选的path参数。我不知道如何在AWS API Gateway terraform中指定它。
我可以找到的有关路径变量的唯一信息是该帖子:In Terraform, how do you specify an API Gateway endpoint with a variable in the request path?
在其中,答案在aws_api_gateway_integration函数的uri字段中指定路径变量:
resource "aws_api_gateway_integration" "get-account-integration" {
rest_api_id = "${var.gateway_id}"
resource_id = "${var.resource_id}"
http_method = "${aws_api_gateway_method.get-account.http_method}"
type = "HTTP"
integration_http_method = "GET"
uri = "/integration/accounts/{id}" # <--
passthrough_behavior = "WHEN_NO_MATCH"
request_parameters {
"integration.request.path.id" = "method.request.path.accountId"
}
}
不幸的是,与AWS Lambda集成使用了uri字段作为lambda的ARN。这是我在集成中引用lambda的方式:
resource "aws_api_gateway_integration" "books_lambda" {
rest_api_id = "${var.gateway.id}"
resource_id = "${var.resource_id}"
http_method = "${aws_api_gateway_method.books.http_method}"
type = "AWS_PROXY"
integration_http_method = "POST"
uri = "${var.books_invoke_arn}" # <--
credentials = "${aws_iam_role.books_gateway.arn}"
request_parameters {
"integration.request.path.id" = "method.request.path.bookId"
}
}
因为arn位于uri字段的位置,所以我不知道在哪里定义path参数的位置。
我尝试将path变量附加到uri字段(${var.books_invoke_arn}/{bookId}
),但这只会产生错误。当uri字段被lambda arn占用时,在哪里可以指定路径变量?
第二,是否有可能使该变量成为可选变量,或者我是否必须拥有第二套terraform(一个带有变量,另一个不带变量)?
谢谢!
答案 0 :(得分:0)
terraform document已经给出了答案。
resource "aws_api_gateway_integration" "integration" {
rest_api_id = "${aws_api_gateway_rest_api.api.id}"
resource_id = "${aws_api_gateway_resource.resource.id}"
http_method = "${aws_api_gateway_method.method.http_method}"
integration_http_method = "POST"
type = "AWS_PROXY"
uri = "arn:aws:apigateway:${var.myregion}:lambda:path/2015-03-31/functions/${aws_lambda_function.lambda.arn}/invocations"
}
对于第二个问题,我需要详细信息,对于当前的描述,您可以考虑使用count
进行管理。
参考:
https://www.terraform.io/intro/examples/count.html
https://www.terraform.io/docs/configuration/resources.html#count-multiple-resource-instances
由于您没有粘贴有关如何管理lambda函数的代码。如果您要进行管理,则可以将其引用为${aws_lambda_function.lambda.arn}
resource "aws_lambda_function" "lambda" {
filename = "lambda_function_payload.zip"
function_name = "lambda_function_name"
...
}
如果存在lambda函数,则可以通过其数据源获取其详细信息
data "aws_lambda_function" "existing_lambda" {
function_name = "${var.function_name}"
}
您可以将其引用为data.aws_lambda_function.existing_lambda.arn
答案 1 :(得分:0)
这是一个老问题,但它出现在我的一次搜索中。我认为在此期间情况可能发生了变化,但目前的一种方法是在 L'*'
中的花括号中指定您的变量,如我们代码中的示例所示:
route_key