Terraform:为调用Lambda的AWS API Gateway创建URL路径参数吗?

时间:2019-06-13 21:01:21

标签: lambda aws-api-gateway terraform terraform-provider-aws

我正在编写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(一个带有变量,另一个不带变量)?

谢谢!

2 个答案:

答案 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