Поскольку вы не можете делать циклы на циклах так, как вам нужно, а модули в настоящее время не поддерживают 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]}"
}