Создание переменного количества методов и ресурсов в ресурсе API Gateway - PullRequest
0 голосов
/ 13 февраля 2019

В настоящее время я использую функцию Lambda, которая использует API-шлюз в качестве своего триггера, а методы и конечные точки в API-шлюзе создаются вручную.Я пытаюсь переместить это, чтобы создать это автоматически с Terraform.Хотя я довольно новичок в Terraform, и мне сложно понять, как создать циклическую структуру, поскольку число методов и конечных точек может быть разным для каждой лямбда-функции.

Я прочитал шаблоныи интерполяция, но поскольку то, что мне нужно, имеет 2 слоя, я не могу собрать воедино то, что будет лучшим решением

. Это пример того, что я могу использовать при создании ресурсов шлюза вручную.Предположим, что число конечных точек может варьироваться, и число методов в каждой конечной точке также может варьироваться.

{
  "api_name" : "branches",
  "api_description" : "Branches API",
  "endpoints" : [
    {
      "name" : "branch1",
      "path" : "branch1/Retail/GetData",
     "methods" : [
        {
          "type" : "get",
          "folder" : "branches",
          "handler" : "index.handler",
          "authenticator": false
        }
      ]
    },
    {
      "name" : "branch2",
      "path" : "branch2/Retail/GetData",
      "methods" : [
        {
          "type" : "get",
          "folder" : "branches",
          "handler" : "index.get_handler",
          "authenticator": false
        },
        {
          "type" : "post",
          "folder" : "branches",
          "handler" : "index.post_handler",
          "authenticator": false
        }
      ]
    }
  ]
} 

Я бы хотел, чтобы конечный результат выглядел примерно так:

resource "aws_api_gateway_rest_api" "LambdaTrigger" {
  name        = "${var.API_NAME}"
  description = "${var.API_DESCRIPTION}"
}

resource "aws_api_gateway_resource" "Resource1" {
  rest_api_id = "${aws_api_gateway_rest_api.LambdaTrigger.id}"
  parent_id   = "${aws_api_gateway_rest_api.LambdaTrigger.root_resource_id}"
  path_part   = "GetData"
}

resource "aws_api_gateway_method" "Method1" {
  rest_api_id   = "${aws_api_gateway_rest_api.LambdaTrigger.id}"
  resource_id   = "${aws_api_gateway_resource.Resource1.id}"
  http_method   = "GET"
  authorization = "NONE"
}

resource "aws_api_gateway_resource" "Resource2" {
  rest_api_id = "${aws_api_gateway_rest_api.LambdaTrigger.id}"
  parent_id   = "${aws_api_gateway_rest_api.LambdaTrigger.root_resource_id}"
  path_part   = "GetData"
}

resource "aws_api_gateway_method" "Method2" {
  rest_api_id   = "${aws_api_gateway_rest_api.LambdaTrigger.id}"
  resource_id   = "${aws_api_gateway_resource.Resource2.id}"
  http_method   = "GET"
  authorization = "NONE"
}
resource "aws_api_gateway_method" "Method2" {
  rest_api_id   = "${aws_api_gateway_rest_api.LambdaTrigger.id}"
  resource_id   = "${aws_api_gateway_resource.Resource2.id}"
  http_method   = "POST"
  authorization = "NONE"
}

1 Ответ

0 голосов
/ 14 февраля 2019

Поскольку вы не можете делать циклы на циклах так, как вам нужно, а модули в настоящее время не поддерживают count, вы можете создать свои группы ресурсов / методов через модуль , а затем вызывать модуль каждый раз дляГруппа ресурсов / модулей.

Я настроил ваш объект метаданных с полем path_part.

{
  "api_name" : "branches",
  "api_description" : "Branches API",
  "endpoints" : [
    {
      "name" : "branch1",
      "path" : "branch1/Retail/GetData",
      "path_part": "GetData",  // added for simplicity
     "methods" : [
        {
          "type" : "get",
          "folder" : "branches",
          "handler" : "index.handler",
          "authenticator": false
        }
      ]
    },
    {
      "name" : "branch2",
      "path" : "branch2/Retail/GetData",
      "path_part": "GetData",  //added for simplicity
      "methods" : [
        {
          "type" : "get",
          "folder" : "branches",
          "handler" : "index.get_handler",
          "authenticator": false
        },
        {
          "type" : "post",
          "folder" : "branches",
          "handler" : "index.post_handler",
          "authenticator": false
        }
      ]
    }
  ]
} 

Это модуль для создания ресурса и его методов.Он будет помещен в отдельную папку, на которую будет ссылаться ваш основной файл.Для любого проекта terraform у меня, как правило, есть папка modules для всех моих модулей, что-то вроде ./modules/api_resources

# variables.tf
variable "rest_api_id" {
  type = "string"
}
variable "rest_api_root_resource_id" {
  type = "string"
}
variable "endpoints" {
  type = "list"
}
# main.tf
resource "aws_api_gateway_resource" "resource" {
  rest_api_id = "${var.rest_api_id}"
  parent_id   = "${var.rest_api_root_resource_id}"

  path_part   = "${var.endpoints[count.index].path_part}"
}

resource "aws_api_gateway_method" "method" {
  count = "${length(var.endpoint.methods)}"

  rest_api_id = "${var.rest_api_id}"
  resource_id   = "${aws_api_gateway_resource.resource.id}"
  http_method   = "${var.endpoint.methods[count.index].type}"
  authorization = "${var.endpoint.methods[count.index].authenticator ? "WHATEVER_AUTH_TYPE_YOU_ARE_USING" : "NONE"}"
}
#outputs.tf
output "resource_id" {
  value = "${aws_api_gateway_resource.resource.id}"
}
output "resource_path" {
  value = "${aws_api_gateway_resource.resource.path}"
}

Теперь вы можете использовать этот модуль в своем главном.tf один раз для каждой части endpoints.

resource "aws_api_gateway_rest_api" "lambda_trigger" {
  name        = "${var.api_name}"
  description = "${var.api_description}"
}

module "resource1" {
  source = "./modules/api_resources"
  rest_api_id = "${aws_api_gateway_rest_api.lambda_trigger.id}"
  rest_api_root_resource_id = "${aws_api_gateway_rest_api.lambda_trigger.root_resource_id}"
  endpoints = "${var.endpoints[0]}"
}


module "resource2" {
  source = "./modules/api_resources"
  rest_api_id = "${aws_api_gateway_rest_api.lambda_trigger.id}"
  rest_api_root_resource_id = "${aws_api_gateway_rest_api.lambda_trigger.root_resource_id}"
  endpoints = "${var.endpoints[1]}"
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...