Назад | Перейти на главную страницу

terraform: изменить lb listener

У меня есть сценарий terraform, в котором я использую модуль dcos-terraform/dcos/aws чтобы настроить свою инфраструктуру, я затем вношу определенные изменения, такие как правила route52 и сертификаты балансировщика нагрузки и т. д. Я пытаюсь изменить протокол NLB 443 на TLS с TCP с помощью сертификата, но terraform пытается создать новый вместо этого и терпит неудачу.

...
# i get the load balancer, target group and listeners
data "aws_lb" "ext-lb" {
  name = "ext-${var.cluster_name}"
}
data "aws_lb_target_group" "ext-tg-443" {
  name     = "ext-${var.cluster_name}-tg-443"
}
data "aws_lb_listener" "public-front_end" {
  load_balancer_arn = "${data.aws_lb.ext-lb.arn}"
  port = "443"
}

# i then need to modify the listener but throws Duplicate port error as it tries to make a new one instead of modifying it.
resource "aws_lb_listener" "public-front_end" {
  load_balancer_arn = "${data.aws_lb.ext-lb.arn}"
  port              = "443"
  protocol          = "TLS"
  ssl_policy        = "ELBSecurityPolicy-2016-08"
  certificate_arn   = "${aws_acm_certificate.cert.arn}"

  default_action {
    type             = "forward"
    target_group_arn = "${data.aws_lb_target_group.ext-tg-443.arn}"
  }
}

# i also tried this, but it requires the port to already be TLS and not TCP
resource "aws_lb_listener_certificate" "public-certificate" {
  listener_arn    = "${data.aws_lb_listener.public-front_end.arn}"
  certificate_arn = "${aws_acm_certificate.cert.arn}"
}

...

мой текущий обходной путь запускает скрипт cli null_resource - local-exec.

#! /bin/bash

current_protocol="NA"
current_protocol="$(aws elbv2 describe-listeners --listener-arn $1 --output text --query 'Listeners[0].Protocol')"
if [ $current_protocol == "TCP" ]
then
    aws elbv2 delete-listener --listener-arn $1
    echo "listener deleted"
else
    echo "listener ok"
fi

модифицированный tf файл

resource "null_resource" "update-nlb" {
  provisioner "local-exec" {
    command = "sh update-nlb-script.sh ${data.aws_lb_listener.public-front_end.arn}"
  }
}

resource "aws_lb_listener" "public-front_end" {
  load_balancer_arn = "${data.aws_lb.ext-lb.arn}"
  port              = "443"
  protocol          = "TLS"
  ssl_policy        = "ELBSecurityPolicy-2016-08"
  certificate_arn   = "${aws_acm_certificate.cert.arn}"

  default_action {
    type             = "forward"
    target_group_arn = "${data.aws_lb_target_group.ext-tg-443.arn}"
  }

  depends_on = [
    "null_resource.update-nlb"
  ]
}

это работает нормально, если вы запускаете один раз, но если я повторно запускаю terrraform plan команда, тогда tf хочет повторно добавить слушателя, который я удалил, но теперь он не может добавить, потому что у меня есть другой слушатель на его месте. Это возвращает ошибку.

образец tf файла https://gist.github.com/Rohithzr/c846de2fa7e5fd133dfd1549c0e104b5

Похоже, вы используете новый файл terraform и пытаетесь создать новый «ресурс terraform» «aws_lb_listener». Поскольку terraform не имеет этого ресурса в своем состоянии, он рассматривает его как новый.

Два возможных пути выхода из ситуации:

  • Используйте terraform import, чтобы импортировать слушателя в состояние. Затем измените его с помощью terraform.
  • Измените прослушиватель с помощью aws cli.

Похоже на ошибку в Terraform; он должен пометить ресурс для уничтожения, а затем заменить его.

Если у вас его нет в другом месте, сможете ли вы испортить текущий ресурс?

Это позволит вам чисто поменять его.