根据 terraform 中的条件或标志创建 AWS 资源

aru*_*unp 2 amazon-web-services amazon-elb terraform aws-application-load-balancer

在使用 terraform 的 AWS 中,仅当 LB 不存在时才必须创建负载均衡器资源。为此,我可以定义一个类似于“lb_exists=true”的变量,并根据这个“true”值,必须创建资源,否则,terraform 应该跳过 LB 创建。

为了实现这一目标,我计划使用depend_on。如果“lb_exists=false”,则depends_on应该是空列表或设置为无资源名称。

locals {
  lb_exists = "true"
}

resource "aws_lb" "test" {
  name               = var.alb_name
  internal           = false
  load_balancer_type = "application"
  #...
}

data "aws_lb" "test" {
  lb_exists = "${local.lb_exists}"
  depends_on    = ["aws_lb.test"]
}
Run Code Online (Sandbox Code Playgroud)

实现这一目标的正确方法是什么以及如何实现?有什么解决方法吗?如果 AWS 中存在 LB,我不想重新创建该 LB。请建议。

[编辑]复制完整代码

provider "aws" {
  region = var.aws_region
}

resource "aws_lb" "test" {
  count = local.lb_exists == "true" ? 1 : 0
  name               = var.alb_name
  internal           = false
  load_balancer_type = "application"
  security_groups    = var.alb_security_groups
  subnets            = var.alb_subnets


  enable_deletion_protection = true

  access_logs {
    #bucket  = aws_s3_bucket.lb_logs.bucket
    bucket = "aws-lab-demo"
    prefix  = "test-lb-logs"
    enabled = false
  }

  tags = {
    Environment = var.env
    Name = var.vpc_id
  }
}

data "aws_lb" "test" {
 # count = local.lb_exists == "true" ? 1 : 0
  arn  = "${aws_lb.test.arn}"
  name = "${aws_lb.test.name}"
}

resource "aws_lb_target_group" "test" {
  name     = var.alb_name
  port     = 8080
  protocol = "HTTP"
  vpc_id   = var.vpc_id
  stickiness {
    type            = "lb_cookie"
    cookie_duration = 1800
    enabled         = false
  }
  health_check {
    healthy_threshold   = 3
    unhealthy_threshold = 10
    timeout             = 5
    interval            = 10
    path                = "/"
    port                = "8081"
  }
}

data "aws_lb_target_group" "test" {
  arn  = "${aws_lb_target_group.test.arn}"
  name = "${aws_lb_target_group.test.name}"
}

resource "aws_lb_listener" "front_end" {
  load_balancer_arn = data.aws_lb.test.arn
  port              = "80"
  protocol          = "HTTP"
  default_action {
    type             = "forward"
    target_group_arn = data.aws_lb_target_group.test.arn
  }
}
Run Code Online (Sandbox Code Playgroud)

rkm*_*rkm 8

有两种方法可以实现:

  1. 您可以使用count 元参数来告知terraform应创建多少个资源或数据源实例。这可能是适合您的情况的推荐方法。
resource "aws_lb" "test" {
  count = local.lb_exists == "true" ? 1 : 0
 ...
}
Run Code Online (Sandbox Code Playgroud)

如果您使用count,则terraform创建资源列表,您应该像这样访问它们:aws_lb.test[0]

  1. 第二个选项可能是使用for_each。不同之处在于,如果您使用此选项,则必须提供setmapto for_each。当您需要控制正在创建的资源类型时,此方法非常有用。例如,如果你有这样的东西:
locals {
  load_balancers = ["app1", "app2"]
}

resource "aws_lb" "test" {
  # you can also make it conditional and provide an empty map
  for_each = { for item in local.load_balanecers: item => item }
 ...
}
Run Code Online (Sandbox Code Playgroud)

在本例中,terraform创建可以通过提供给 的密钥访问的资源映射for_eachaws_lb.test["app1"]