Переменная Terraform for_each для создания нескольких правил прослушивания AWS и установки уникального target_group_arn - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь выполнить настройку контейнера aws с помощью terraform, которая направляет трафик c от моего ALB к целевым группам на основе указанных портов c с использованием параметра terraforms for_each. У меня есть настройка for_each, которая создает правила слушателя, которые я ожидаю, основываясь на моей переменной

variable "tenant_data" {
  type = "map"
  default = {
    tenant1 = {
      port              = 32768
      listener_priority = 986
      tenantName        = "tenant1"
    }
    tenant2 = {
      port              = 32769
      listener_priority = 987
      tenantName        = "tenant2"
    }
    tenant3 = {
      port              = 32770
      listener_priority = 988
      tenantName        = "tenant3"
    }
  }
}

Я не уверен, возможно ли заставить ресурс for_each использовать уникальный target_group_arn в слушателе Правило, которое будет создано аналогичной настройкой for_each целевой группы, которую я использую. Я также не уверен, является ли это лучшим способом для достижения этой цели. Я мог бы создать каждый ресурс, но в итоге я посмотрю около 30 отдельных слушателей и целевых групп, так что я вижу, могу ли я найти способ использовать одну переменную, которая обрабатывает создание ресурса.

resource "aws_alb_listener_rule" "java_dev" {
  for_each     = var.tenant_data
  listener_arn = data.terraform_remote_state.alb.outputs.alb_https_listener_arn
  priority     = each.value.listener_priority

  action {
    type             = "forward"
    target_group_arn = each.value.target_group_arn - what I'm trying to set
  }

  condition {
    field  = "host-header"
    values = ["${each.value.tenantName}.my-site.com"]
  }

  condition {
    field  = "path-pattern"
    values = ["/some-value/*"]
  }
}

Изначально я думал, что могу попробовать использовать выходные значения из целевой группы и добавить их в свои переменные, но это кажется невозможным. Кроме того, я все еще пытаюсь придумать, как это могло бы работать.

Я потратил полдня на поиски работы, но не нашел ничего полезного. Если у кого-то есть какие-либо ресурсы или идеи, они будут очень полезны.

Редактировать: без for_each каждый слушатель и цель будут выглядеть так:

resource "aws_alb_listener_rule" "alpha3" {
  listener_arn = listener_arn
  priority     = 987

  action {
    type             = "forward"
    target_group_arn = aws_alb_target_group.group.arn
  }

  condition {
    field  = "host-header"
    values = ["one.my-site.com"]
  }

  condition {
    field  = "path-pattern"
    values = ["/path/*"]
  }
}

# Target Group
resource "aws_alb_target_group" "group" {
  name        = "ct-tgt-grp"
  port        = 32769
  protocol    = "HTTP"
  vpc_id      = vpc_id
  target_type = "instance"

  health_check {
    interval            = 30
    port                = 5000
    protocol            = "HTTP"
    timeout             = 10
    healthy_threshold   = 3
    unhealthy_threshold = 5
    path                = "/health"
    matcher             = 200
  }
}

1 Ответ

1 голос
/ 09 января 2020

Что я понял из вопроса, так это то, что должна быть одна целевая группа и одно правило слушателя на элемент var.tenant_data, и что каждое правило слушателя должно ссылаться на соответствующую целевую группу.

Используя for_each с обоими этими ресурсами, они оба будут заканчиваться экземплярами, идентифицированными теми же ключами, и поэтому вы можете создавать перекрестные ссылки, используя each.key, например:

variable "tenant_data" {
  type = map(object({
    port              = number
    listener_priority = number
  }))
}

resource "aws_alb_target_group" "tenant" {
  for_each = var.tenant_data

  name        = "ct-${each.key}"
  port        = each.value.port
  protocol    = "HTTP"
  vpc_id      = var.vpc_id
  target_type = "instance"

  health_check {
    interval            = 30
    port                = 5000
    protocol            = "HTTP"
    timeout             = 10
    healthy_threshold   = 3
    unhealthy_threshold = 5
    path                = "/health"
    matcher             = 200
  }
}

resource "aws_alb_listener_rule" "tenant" {
  for_each = var.tenant_data

  listener_arn = var.listener_arn
  priority     = each.value.listener_priority

  action {
    type             = "forward"
    target_group_arn = aws_alb_target_group.tenant[each.key].arn
  }

  condition {
    field  = "host-header"
    values = ["one.my-site.com"]
  }

  condition {
    field  = "path-pattern"
    values = ["/path/*"]
  }
}

Ключевая часть выше здесь, для акцента:

    target_group_arn = aws_alb_target_group.tenant[each.key].arn

Поскольку оба этих блока ресурсов имеют одинаковый for_each, мы можем использовать each.key для перекрестных ссылок, ища одну целевую группу, соответствующую каждому правило слушателя.

...