首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >terraform:修改lb侦听器

terraform:修改lb侦听器
EN

Server Fault用户
提问于 2019-06-08 11:19:23
回答 2查看 1.2K关注 0票数 2

我有一个terraform脚本,在这个脚本中,我使用一个模块dcos-terraform/dcos/aws来设置我的下位程序,然后进行某些修改,比如route52规则和加载平衡器证书等等。我试图用一个证书从TCP修改北草坪443协议到TLS,但是terraform尝试创建一个新的协议,但是失败了。

代码语言:javascript
复制
...
# 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本地-exec脚本。

代码语言:javascript
复制
#! /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文件

代码语言:javascript
复制
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

EN

回答 2

Server Fault用户

发布于 2019-06-08 12:42:06

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

如果你没有在其他地方定义它,你能污染当前的资源吗?

这样你就可以干净利落地改变它了。

票数 2
EN

Server Fault用户

发布于 2019-06-08 13:04:30

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

解决这一问题的两种可能办法:

  • 使用terraform导入将侦听器导入状态。然后用地形来修改它。
  • 用aws cli修改监听器。
票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/970658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档