terraform:修改 lb 监听器

terraform:修改 lb 监听器

我有一个 terraform 脚本,其中我使用模块dcos-terraform/dcos/aws来设置我的基础设施,然后我进行某些修改,例如 route52 规则和负载均衡器证书等。我正在尝试使用证书将 NLB 443 协议从 TCP 修改为 TLS,但 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}"
}

...

我当前的解决方法是运行 null_resource - local-exec cli 脚本。

#! /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

答案1

这听起来像是 Terraform 中的一个错误;它应该将资源标记为要销毁,然后替换它。

如果您没有在其他地方定义它,您是否能够污染当前资源?

这样您就可以干净地将其更换掉。

答案2

这看起来好像您正在使用新的 terraform 文件,并尝试创建新的“terraform 资源”“aws_lb_listener”。由于 terraform 在其状态下没有此资源,因此它将其视为新资源。

解决该情况的两种可能方法:

  • 使用 terraform import 将监听器导入到状态中。然后使用 terraform 进行修改。
  • 使用 aws cli 修改监听器。

相关内容