терраформ 12 для каждого - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь создать правила прослушивателя для alb с определенными IP-адресами в качестве разрешенных для достижения цели / app .

Однако согласно правилам прослушивателя alb только допустимые значения определить для правила 5. Формат моего правила таков:

  • Метод запроса Http: POST
  • Путь / app
  • Хост - my-app.domain. net
  • IP-адрес источника: 11.11.11.11 / 24 ИЛИ 12.12. 12.12 / 24

Значения выше BOLD шрифта уже являются значениями, однако мне все еще нужно добавить еще 4 IP-адреса для разрешения в правиле прослушивателя ALB. Таким образом, чтобы добавить другие 4 IP-адреса, мне нужно создать второе правило прослушивателя со следующим:

  • Http-запрос: POST
  • Путь / app
  • Хост - my-app.domain. net
  • Исходный IP-адрес 13.13.13.13 / 24 ИЛИ 14.14.14.14 / 24

и 3-е последнее правило

  • Метод запроса Http: POST
  • Путь is / app
  • Хост is my-app.domain. net
  • Исходный IP-адрес 16.16.16.16 / 24 ИЛИ 16.16.16.16 / 24

ВОПРОС: С этой переменной tfvar, которую я использую, как я могу выполнить для каждого logi c для определенного условия source_ip на моем aws_alb_listener_rule ? Я предпочитаю добавлять 2 IP-адреса для каждого правила

variable.tfvars

IP_ADDRESS = [
 "11.11.11.11/24", 
 "12.12.12.12/24", 
 "13.13.13.13/24",
 "14.14.14.14/24",
 "15.15.15.15/24",
 "16.16.16.16/24"
]

, как я могу добавить для каждого при условии source_ip aws_alb_listener_rule?

resource "aws_alb_listener_rule" "target" {
  listener_arn = data.aws_alb_listener.listener.arn


  action {
    target_group_arn = var.target_arn
    type             = "forward"
  }

  condition {
    path_pattern {
      values = ["/app"]
    }
  }

  condition {
    http_request_method {
      values = ["POST"]
    }
  }

  condition {
    host_header {
      values = ["my-app.domain.net"]
    }
  }
  condition {
    source_ip {
      values = var.IP_ADDRESS
    }
  }

}

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

Это звучит как редкий вариант использования функции Terraform chunklist, которая берет список и возвращает список списков с внутренними списками, содержащими не более заданного числа элементов.

variable "ip_addresses" {
  type = list(string)
}

locals {
  # ALB listener rules allow at most five values per rule.
  # We're going to specify two per rule, which is within that limit.
  ip_address_chunks = chunklist(var.ip_addresses, 2)
}

resource "aws_alb_listener_rule" "target" {
  count = local.ip_address_chunks

  listener_arn = data.aws_alb_listener.listener.arn

  action {
    target_group_arn = var.target_arn
    type             = "forward"
  }

  condition {
    path_pattern {
      values = ["/app"]
    }
  }
  condition {
    http_request_method {
      values = ["POST"]
    }
  }
  condition {
    host_header {
      values = ["my-app.domain.net"]
    }
  }
  condition {
    source_ip {
      values = local.ip_address_chunks[count.index]
    }
  }
}

Предостережение с указанным выше - это то, что произойдет, если значение var.ip_addresses изменится, когда правила прослушивателя уже существуют. Давайте начнем с исходного списка IP-адресов, которые вы задали в своем вопросе:

  • ["11.11.11.11/24", "12.12.12.12/24", "13.13.13.13/24", "14.14.14.14/24", "15.15.15.15/24", "16.16.16.16/24"]

При первоначальном создании Terraform создаст следующие экземпляры aws_alb_listener-rule.target :

  • aws_alb_listener-rule.target[0] с ["11.11.11.11/24", "12.12.12.12/24"]
  • aws_alb_listener-rule.target[1] с ["13.13.13.13/24", "14.14.14.14/24"]
  • aws_alb_listener-rule.target[2] с ["15.15.15.15/24", "16.16.16.16/24"]

Если вы удалите 13.13.13.13/24 из списка и перепланируете, вы увидите, что Terraform хочет изменить правила следующим образом:

  • aws_alb_listener-rule.target[0] с ["11.11.11.11/24", "12.12.12.12/24"]
  • aws_alb_listener-rule.target[1] с ["14.14.14.14/24", "15.15.15.15/24"]
  • aws_alb_listener-rule.target[2] с ["16.16.16.16/24"]

Это приведет к обновлению aws_alb_listener-rule.target[1] и aws_alb_listener-rule.target[2], чтобы перераспределить новый список IP-адресов по правилам.

Поскольку каждое из этих двух изменений является отдельным удаленным вызовом API, стоит подумать о том, что произойдет, если aws_alb_listener-rule.target[2] будет обновлено первым (15.15.15.15/24 временно будет вообще без правил), и если aws_alb_listener-rule.target[1] будет обновлено первым (15.15.15.15/24 будет временно указано в двух правилах).

0 голосов
/ 12 марта 2020

Это было решено, я просто решил иметь 1 IP на правило слушателя. Поскольку IP-адрес из списка равен 6, этот код terraform также будет развернут 6 раз с помощью счетчика (l oop). Я использовал код ниже

variable "ip_addresses" {
  type = list
}


locals {
  ip_address_chunks = chunklist(var.ip_addresses, 1)
}

resource "aws_alb_listener_rule" "target" {
  count = length(var.ip_addresses)

  listener_arn = data.aws_alb_listener.listener.arn

  action {
    target_group_arn = var.target_arn
    type             = "forward"
  }

  condition {
    path_pattern {
      values = ["/app"]
    }
  }
  condition {
    http_request_method {
      values = ["POST"]
    }
  }
  condition {
    host_header {
      values = ["my-app.domain.net"]
    }
  }
  condition {
    source_ip {
      values = local.ip_address_chunks[count.index]
    }
  }
}
0 голосов
/ 02 марта 2020

Вы можете использовать null__resource в качестве реализации для циклов в terraform. Это не интуитивно понятно, как для циклов / foreach в языках программирования.

Пример null_resource:

resource "null_resource" "principals" {
  count = "${length(var.trusted_role_arn)}"
  triggers {
    roles="${element((var.trusted_role_arn), count.index)}"
  }
}

Затем вы можете загрузить «роли»:

["${null_resource.principals.*.triggers.roles}"]

Полное объяснение здесь

...