Terraform: инфраструктура на уровне кода | страница 58



    from_port   = 0

    to_port     = 0

    protocol    = "-1"

    cidr_blocks = ["0.0.0.0/0"]

  }

}

Нужно сделать так, чтобы ресурс aws_lb использовал указанную группу безопасности. Для этого установите аргумент security_groups:

resource "aws_lb" "example" {

  name               = "terraform-asg-example"

  load_balancer_type = "application"

  subnets            = data.aws_subnet_ids.default.ids

  security_groups    = [aws_security_group.alb.id]

}

Затем необходимо создать целевую группу для ASG, используя ресурс aws_lb_target_group:

resource "aws_lb_target_group" "asg" {

  name     = "terraform-asg-example"

  port     = var.server_port

  protocol = "HTTP"

  vpc_id   = data.aws_vpc.default.id

  health_check {

    path                = "/"

    protocol            = "HTTP"

    matcher             = "200"

    interval            = 15

    timeout             = 3

    healthy_threshold   = 2

    unhealthy_threshold = 2

  }

}

Обратите внимание на то, что данная целевая группа будет проверять работоспособность ваших серверов, отправляя им периодически HTTP-запросы; сервер считается работоспособным, только если его ответ совпадает с заданным сопоставителем (например, вы можете сделать так, чтобы сопоставитель ожидал ответа 200OK). Если сервер не отвечает (возможно, из-за перебоев в работе или перегрузки), он будет помечен как неработоспособный и целевая группа автоматически прекратит отправлять ему трафик, чтобы минимизировать нарушение обслуживания ваших пользователей.

Но откуда целевая группа знает, каким серверам EC2 следует отправлять запросы? Вы могли бы прописать в ней статический список серверов ресурсом aws_lb_target_group_attachment, однако при работе с ASG серверы могут запускаться и удаляться в любой момент, поэтому такой подход не годится. Вместо этого можно воспользоваться первоклассной интеграцией между ASG и ALB. Вернитесь к ресурсу aws_autoscaling_group и сделайте так, чтобы его аргумент target_group_arns указывал на новую целевую группу:

resource "aws_autoscaling_group" "example" {

  launch_configuration = aws_launch_configuration.example.name

  vpc_zone_identifier  = data.aws_subnet_ids.default.ids

  target_group_arns = [aws_lb_target_group.asg.arn]

  health_check_type = "ELB"

  min_size = 2

  max_size = 10

  tag {

    key                 = "Name"

    value               = "terraform-asg-example"

    propagate_at_launch = true

  }

}

Вы также должны поменять значение health_check_type на "ELB". Значение по умолчанию, "EC2", подразумевает минимальную проверку работоспособности, которая считает сервер неисправным, только если гипервизор AWS утверждает, что ВМ совсем не работает или является недоступной. Значение "ELB" более надежно, поскольку вынуждает ASG проверять работоспособность целевой группы. К тому же серверы автоматически заменяются, если целевая группа объявляет их неисправными. Таким образом, серверы подлежат замене не только в случае полного отказа, но и когда они, к примеру, перестают обслуживать запросы из-за нехватки памяти или остановки критически важного процесса.