Terraform: создать параметр пути URL для шлюза API AWS, который вызывает Lambda? - PullRequest
0 голосов
/ 14 июня 2019

Я пишу Terraform для развертывания AWS API Gateway с интеграцией AWS Lambda. Я хотел бы указать необязательный параметр пути в URL, на который я могу ссылаться из лямбды. Я не могу понять, как это указать в терраформе AWS API Gateway.

Единственная информация, которую я могу найти для переменных пути, - это сообщение SO: Как в Terraform указать конечную точку шлюза API с переменной в пути запроса?

В нем в ответе указывается переменная пути в поле uri функции aws_api_gateway_integration:

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 используется для ARN лямбды. Вот как я ссылаюсь на лямбду в моей интеграции:

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 занято лямбда-арн?

Во-вторых, возможно ли сделать эту переменную необязательной, или мне нужно иметь второй набор терраформ (один с переменной, другой без)?

Спасибо!

1 Ответ

0 голосов
/ 14 июня 2019

Документ 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"
}

Для вашего второго вопроса мне нужны детали, для текущего описания вы можете использовать count для управления им.

Ссылка:

https://www.terraform.io/intro/examples/count.html

https://www.terraform.io/docs/configuration/resources.html#count-multiple-resource-instances

Обновление

Поскольку вы не вставляете код о том, какуправлять лямбда-функцией.Если вы управляете ею, вы можете ссылаться на нее как ${aws_lambda_function.lambda.arn}

resource "aws_lambda_function" "lambda" {
  filename      = "lambda_function_payload.zip"
  function_name = "lambda_function_name"
  ...
}

Если лямбда-функция существует, вы можете получить ее подробности через ее источник данных

data "aws_lambda_function" "existing_lambda" {
  function_name = "${var.function_name}"
}

Вы можетессылаться на него как data.aws_lambda_function.existing_lambda.arn

...