首页 文章

aws_lb的动态子网映射

提问于
浏览
0

我正在尝试使用Terraform创建一个网络负载均衡器,重要的是它与保护其免受破坏的弹性IP相关联 .

我有类似以下代码:

resource "aws_lb" "balancer" {
  name = "${var.name}-nlb"

  internal           = "${var.internal}"
  load_balancer_type = "network"
  subnets            = ["${data.aws_subnet_ids.selected.ids}"]

  subnet_mapping {
    subnet_id     = "someid"
    allocation_id = "someid"
  }

  subnet_mapping {
    subnet_id     = "someid"
    allocation_id = "someid"
  }

  subnet_mapping {
    subnet_id     = "someid"
    allocation_id = "someid"
  }

  tags = "${merge(var.tags,
    map("Terraform", "true"),
    map("Environment", var.environment))}"
}

我所追求的是动态生成 subnet_mapping 块,因为此代码位于模块中,我想创建依赖于传入的子网数量的映射数 . 要么是预定义的块,要么传递块 .

有没有办法做到这一点?对我来说重要的是相关的弹性IP需要坚持下去 .

2 回答

  • 0

    Terraform目前不允许您在资源节/子资源上使用 count 元参数 .

    有一个issue tracking this on Github但目前还没有任何关于AFAIK的工作 .

    在该线程中回应的Hashicorp员工(apparentlymart)目前正在开发一个新版本的HCL,可能在将来支持这样的事情 .

  • 1

    一个非常丑陋的解决方案可能是为每个可能的AZ数量创建一个资源 . ex(代码未经测试):

    data "aws_availability_zones" "available" {}
    resource "aws_lb" "lb_2_azs" {
        count = "${length(data.aws_availability_zones.available.names) == 2 ? 1 : 0 }"
        ... all the rest of the stuff here ...
    }
    resource "aws_lb" "lb_3_azs" {
        count = "${length(data.aws_availability_zones.available.names) == 3 ? 1 : 0 }"
        ... all the rest of the stuff here ...
    }
    

    然后在你的模块中输出这样的东西可能会起作用:

    output "lb_id" {
        value = "${element(concat(aws_lb.lb_2_azs.*.id, aws_lb.lb_3_azs.*.id, list("")), 0)}"
    }
    

    如何处理侦听器以及LB可能需要的其他资源:

    resource "aws_lb_listener" "listener" {
        count = "${length(concat(aws_lb.lb_2_azs.*.id, aws_lb.lb_3_azs.*.id))}"
        load_balancer_arn = "${element(concat(aws_lb.lb_2_azs.*.id, aws_lb.lb_3_azs.*.id, list("")), 0)}"
        ... rest of the resource settings ...
    }
    

    我没有测试过前面的代码,但这里有一些我知道有用的代码 . 我有一个 Consul 模块,如果它不用于保险库,则创建一个NLB:

    resource "aws_lb" "consul" {
        name               = "${var.lb_name}"
        count              = "${var.for_vault ? 0 : 1}"
        internal           = true
        subnets            = ["${var.subnet_ids}"]
        load_balancer_type = "network"
        idle_timeout = 60
    }
    
    resource "aws_lb_listener" "consul" {
        count             = "${var.for_vault ? 0 : 1}"
        load_balancer_arn = "${aws_lb.consul.arn}"
        port              = 8500
        protocol          = "TCP"
    
        default_action {
            target_group_arn = "${aws_lb_target_group.consul.arn}"
            type             = "forward"
        }
    }
    

    您可以对aws_lb_target_group以及您需要的任何其他资源使用相同的计数技巧来引用任何aws_lb资源 .

相关问题