#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 могут графически использовать балансировщик нагрузки одного приложения:
Приведенный ниже сценарий описывает конфигурацию для одной из служб, он аналогичен для второй, единственное, что вам не нужно будет повторять, это объявление балансировщика нагрузки.
Вы можете определить следующее:
# 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.
Я надеюсь, что это может вам помочь.