Каков наилучший способ отладки ошибки проверки Terraform AWS Application Load Balancer? - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь предоставить демонстрационную веб-службу на AWS с Terraform, и у меня возникает следующая ошибка.

Error: Error applying plan:

2 error(s) occurred:

* module.prod.module.web.module.web.aws_alb_listener.frontend: 1 error(s) occurred:

* aws_alb_listener.frontend: Error creating LB Listener: ValidationError: 'arn:aws:elasticloadbalancing:us-west-2:114416042199:loadbalancer/app/demo-svc-prod-alb/2a5f486a7b9d265a' is not a valid target group ARN
  status code: 400, request id: e3819755-799c-11e8-ac82-43dfdd4e44d1
* module.prod.module.web.module.web.aws_autoscaling_group.backend: 1 error(s) occurred:

* aws_autoscaling_group.backend: Error creating AutoScaling Group: ValidationError: Provided Load Balancers may not be valid. Please ensure they exist and try again.
  status code: 400, request id: e37efee9-799c-11e8-955a-c50a9e447dfa

Чего я не понимаю, так это того, почему ARN является недействительным, поскольку он принадлежит ресурсу, созданному Terraform. Возможно, подозрительно, что ARN относится к elasticloadbalancing. Есть ли какие-либо ошибки, о которых нужно знать при работе с балансировщиком нагрузки приложений AWS и ASG? При использовании классического ELB я не видел этой проблемы. Есть ли способ получить более полезную информацию из Terraform?

Соответствующие ресурсы, которые выбрасывают ошибки:

resource "aws_alb_listener" "frontend" {
  load_balancer_arn       = "${aws_alb.frontend.arn}"
  port                    = "${local.https_port}"
  protocol                = "HTTPS"
  ssl_policy              = "ELBSecurityPolicy-TLS-1-2-2017-01"

  default_action {
    target_group_arn      = "${aws_alb.frontend.arn}"
    type                  = "forward"
  }
}

и

resource "aws_autoscaling_group" "backend" {
  name                    = "${local.cluster_name}-asg"
  launch_configuration    = "${aws_launch_configuration.backend.id}"
  availability_zones      = ["${data.aws_availability_zones.all.names}"]
  load_balancers          = ["${aws_alb.frontend.name}"]
  health_check_type       = "ELB"
  min_size                = "${var.min_size}"
  max_size                = "${var.max_size}"
  // This resource type uses different tags specification format.
  // A list comp over the locals tags map would sure come in handy to keep
  // things DRY.
  tags                    = [
    {
      key                 = "System"
      value               = "${var.tags["System"]}"
      propagate_at_launch = true
    },
    {
      key                 = "Environment"
      value               = "${local.tags["Environment"]}"
      propagate_at_launch = true
    },
    {
      key                 = "Owner"
      value               = "${local.tags["Owner"]}"
      propagate_at_launch = true
    },
    {
      key                 = "Description"
      value               = "${local.tags["Description"]}"
      propagate_at_launch = true
    }
  ]
}

Полный код доступен на https://github.com/mojochao/terraform-aws-web-stack/commit/a4bfe5d6362fddfb2934dc9a89344c304e59cef7.

1 Ответ

0 голосов
/ 27 июня 2018

Вы ссылаетесь на неправильные ресурсы в обоих случаях.

С первой ошибкой ваш слушатель определяется как:

resource "aws_alb_listener" "frontend" {
  load_balancer_arn       = "${aws_alb.frontend.arn}"
  port                    = "${local.https_port}"
  protocol                = "HTTPS"
  ssl_policy              = "ELBSecurityPolicy-TLS-1-2-2017-01"

  default_action {
    target_group_arn      = "${aws_alb.frontend.arn}"
    type                  = "forward"
  }
}

Обратите внимание, что default_action занимает target_group_arn, поэтому вам нужно указать его на целевую группу, а не на сам балансировщик нагрузки.

Так что вместо этого вы должны использовать:

resource "aws_alb_listener" "frontend" {
  load_balancer_arn       = "${aws_alb.frontend.arn}"
  port                    = "${local.https_port}"
  protocol                = "HTTPS"
  ssl_policy              = "ELBSecurityPolicy-TLS-1-2-2017-01"

  default_action {
    target_group_arn      = "${aws_alb_target_group.frontend.arn}"
    type                  = "forward"
  }
}

Поскольку у вас определено только одно правило прослушивателя, вы также можете удалить ресурс aws_alb_listener_rule , поскольку он в любом случае выполняет то же действие, что и действие по умолчанию для прослушивателя. Вы определяете правила отдельно, только если вы хотите, чтобы разный трафик (по хосту или по пути) направлялся в разные целевые группы.

Ваша вторая ошибка связана с попыткой присоединить группу автоматического масштабирования к классу ELB с помощью с использованием параметра load_balancers . В качестве aws_autoscaling_group документации по ресурсам упоминайте, что вы должны использовать target_group_arns вместо:

resource "aws_autoscaling_group" "backend" {
  name                    = "${local.cluster_name}-asg"
  launch_configuration    = "${aws_launch_configuration.backend.id}"
  availability_zones      = ["${data.aws_availability_zones.all.names}"]
  target_group_arns       = ["${aws_alb_target_group.frontend.arn}"]
  health_check_type       = "ELB"
  min_size                = "${var.min_size}"
  max_size                = "${var.max_size}"
  // This resource type uses different tags specification format.
  // A list comp over the locals tags map would sure come in handy to keep
  // things DRY.
  tags                    = [
    {
      key                 = "System"
      value               = "${var.tags["System"]}"
      propagate_at_launch = true
    },
    {
      key                 = "Environment"
      value               = "${local.tags["Environment"]}"
      propagate_at_launch = true
    },
    {
      key                 = "Owner"
      value               = "${local.tags["Owner"]}"
      propagate_at_launch = true
    },
    {
      key                 = "Description"
      value               = "${local.tags["Description"]}"
      propagate_at_launch = true
    }
  ]
}

Это автоматически присоединит группу автоматического масштабирования к целевой группе ALB, так что вы также можете избавиться от aws_autoscaling_attachment ресурса , который делает то же самое. Обычно вы используете ресурс aws_autoscaling_attachment только в том случае, если вы определили целевую группу ALB и свою группу автоматического масштабирования по отдельности и вам необходимо связать их между собой.

...