根据 terraform 中的条件或标志创建 AWS 资源
create AWS resource based on condition or flag in terraform
在使用 terraform 的 AWS 中,仅当 LB 不存在时才必须创建负载均衡器资源。为此,我可以定义一个像“lb_exists=true”这样的变量,并且基于这个“true”值,必须创建资源,否则,terraform 应该跳过 LB 创建。
为了实现这个目标,我打算 depends_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"]
}
实现这一目标的正确方法是什么?如何实现?有什么解决方法吗?如果 AWS 中存在 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
}
}
有两种实现方式:
- 您可以使用 count meta argument 来告诉
terraform
应该创建多少个资源或数据源实例。这可能是针对您的案例的推荐方法。
resource "aws_lb" "test" {
count = local.lb_exists == "true" ? 1 : 0
...
}
如果您使用 count
,那么 terraform
会创建资源列表,您应该像这样访问它们:aws_lb.test[0]
- 第二个选项可能是使用 for_each。不同之处在于,如果您使用此选项,则必须向
for_each
提供 set
或 map
。当您需要控制要创建的资源类型时,此方法很有用。例如,如果您有这样的内容:
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 }
...
}
在这种情况下,terraform
创建了一个资源映射,可以通过提供给 for_each
的密钥进行访问:aws_lb.test["app1"]
在使用 terraform 的 AWS 中,仅当 LB 不存在时才必须创建负载均衡器资源。为此,我可以定义一个像“lb_exists=true”这样的变量,并且基于这个“true”值,必须创建资源,否则,terraform 应该跳过 LB 创建。
为了实现这个目标,我打算 depends_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"]
}
实现这一目标的正确方法是什么?如何实现?有什么解决方法吗?如果 AWS 中存在 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
}
}
有两种实现方式:
- 您可以使用 count meta argument 来告诉
terraform
应该创建多少个资源或数据源实例。这可能是针对您的案例的推荐方法。
resource "aws_lb" "test" {
count = local.lb_exists == "true" ? 1 : 0
...
}
如果您使用 count
,那么 terraform
会创建资源列表,您应该像这样访问它们:aws_lb.test[0]
- 第二个选项可能是使用 for_each。不同之处在于,如果您使用此选项,则必须向
for_each
提供set
或map
。当您需要控制要创建的资源类型时,此方法很有用。例如,如果您有这样的内容:
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 }
...
}
在这种情况下,terraform
创建了一个资源映射,可以通过提供给 for_each
的密钥进行访问:aws_lb.test["app1"]