Terraform — как использовать один и тот же балансировщик нагрузки между несколькими ресурсами AWS ecs_service?

#amazon-web-services #terraform #amazon-ecs

#amazon-web-services #terraform #amazon-ecs

Вопрос:

У меня возник вопрос о создании сервиса на AWS ECS с использованием Terraform, и я был бы признателен за любые отзывы, тем более что я новичок в AWS.

У меня есть несколько сервисов в одном кластере (каждый сервис представляет собой модель машинного обучения). Трафик не такой высокий, поэтому я хотел бы, чтобы один и тот же балансировщик нагрузки перенаправлял запросы в разные службы (на основе заголовка запроса, в котором указывается используемая модель).

Я пытался создать сервисы с помощью Terraform (https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service ) но мне трудно понять конфигурацию load_balancer. Нет возможности выбрать ARN или ID конкретного балансировщика нагрузки, что заставляет меня думать, что для каждой службы создается отдельный балансировщик нагрузки — и это звучит дорого 🙂

У кого-нибудь был опыт работы с этим, кто может сказать мне, что не так с моими рассуждениями?

Большое спасибо за чтение!

Ответ №1:

Фред, в ссылке на документацию, которую вы опубликовали, есть ответ, позвольте мне рассказать вам об этом.

Вот как две службы ECS могут графически использовать балансировщик нагрузки одного приложения:

Службы ECS с одним балансировщиком нагрузки

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

Вы можете определить следующее:

 # First let's define the Application LB
resource "aws_lb" "unique" {
  name               = "unique-lb"
  internal           = false
  load_balancer_type = "application"
  ... #the rest of the config goes here
}

#Now let's create the target group for the service one
resource "aws_lb_target_group" "serviceonetg" {
  name     = "tg-for-service-one"
  port     = 8080 #example value
  protocol = "HTTP"
  ...  #the rest of the config goes here
}

#Now create the link between the LB and the Target Group
# also will add a rule when to forward the traffic using HTTP path /serviceone
resource "aws_alb_listener" "alb_serviceone_listener" {  
  load_balancer_arn = aws_alb.unique.arn # Here is the LB ARN 
  port              = 80
  protocol          = "HTTP"
  
  default_action {    
    target_group_arn = "${aws_alb_target_group.serviceonetg.arn}" #Here is the TG ARN
    type             = "forward"  
  }

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

#As a last step, you need to link your service with the target group.
resource "aws_ecs_service" "service_one" {
  ...  # prior configuration goes here
  load_balancer {
    target_group_arn = aws_lb_target_group.serviceonetg.arn # Here you will link the service with the TG
    container_name   = "myservice1"
    container_port   = 8080
  }
  ...  #the rest of the config goes here
}
  

В качестве дополнительного примечания я бы шаблонизировал повторяющуюся часть для сервисов, используя структуры данных таким образом, чтобы вы могли использовать count или for_each для описания целевой группы, слушателей и сервисов только один раз, а остальное сделал механизм шаблонов. В основном, следуйте принципу DRY.

Я надеюсь, что это может вам помочь.