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

use*_*394 7 lambda terraform aws-api-gateway terraform-provider-aws

我正在编写 Terraform 来部署具有 AWS Lambda 集成的 AWS API 网关。我想在我可以从 lambda 引用的 url 中指定一个可选的路径参数。我不知道如何在 AWS API Gateway terraform 中指定它。

我能找到的关于路径变量的唯一信息是这篇 SO 帖子:在 Terraform,你如何在请求路径中指定一个带有变量的 API 网关端点?

其中,answer 指定了 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"
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,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"
  }
}
Run Code Online (Sandbox Code Playgroud)

因为arn在uri字段的位置,不知道path参数的位置在哪里定义。

我已尝试将路径变量附加到 uri 字段 ( ${var.books_invoke_arn}/{bookId}),但它只会产生错误。当uri字段被lambda arn占用时,我在哪里可以指定路径变量?

其次,是否可以将该变量设为可选,或者我是否必须拥有第二组 terraform(一个有变量,一个没有)?

谢谢!

BMW*_*BMW -1

terraform文档已经给出了答案。

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"
}
Run Code Online (Sandbox Code Playgroud)

对于你的第二个问题,我需要详细信息,对于当前的描述,你可以考虑使用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"
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果 lambda 函数存在,您可以通过其数据源获取其详细信息

data "aws_lambda_function" "existing_lambda" {
  function_name = "${var.function_name}"
}
Run Code Online (Sandbox Code Playgroud)

您可以将其引用为data.aws_lambda_function.existing_lambda.arn