如何防止Terraform在索引[0]超出计数范围时删除资源



我以前创建了一个类型cloudflare记录,并希望在添加另一个时保持它。所以我定义了一个标志来跳过它

resource "cloudflare_record" "cloudflare-a-record" {
count   = var.flag != false ? 1 : 0
zone_id = var.zone_id
name    = var.sub_domain
type    = "A"
value   = aws_eip.my_eip.public_ip
ttl     = 1
proxied = false
}
resource "cloudflare_record" "vault-cloudflare-cname-record" {
count   = var.flag == false ? 1 : 0
zone_id = var.zone_id
name    = cloudflare_record.cloudflare-a-record.hostname
type    = "CNAME"
value   = aws_eip.my_eip.public_dns
ttl     = 1
proxied = false
}

但是Terraform删除了这个资源,并发出了以下消息:

cloudflare_record。Vault-cloudflare-a-record[0]将被销毁(因为index[0]超出了count的范围)

是否有其他方法可以忽略此资源?还是代码错了?

在这种情况下,您不能对两个不同的资源使用相同的标志,因为A和CNAME资源的变量值将保持相同。我认为当前代码有两种可能的选择,因为您使用不同的条件(在A中使用==,在CNAME中使用!=):

var.flag == false ? 1 : 0 # A record
var.flag != false ? 1 : 0 # CNAME record

这意味着如果flag = false将创建A记录(因为计数将是1),而CNAME记录将不被创建(因为计数将是0)。现在,如果flag的值更改为true,那么A记录将被删除(因为true == false将返回false), CNAME记录将被创建(因为true != false将是true)。这意味着同一个flag不应该用于两个不同的资源。您可以对这两个资源使用相同的条件,这意味着将同时创建/删除这两个资源(不确定这是否是您想要的)。更好的方法是定义两个变量,一个用于A,一个用于CNAME record:

variable "create_a_record" {
type = bool
}
variable "create_cname_record" {
type = bool
}

然后,在代码中将使用count元参数的行更改为:

resource "cloudflare_record" "cloudflare-a-record" {
count   = var.create_a_record ? 1 : 0
zone_id = var.zone_id
name    = var.sub_domain
type    = "A"
value   = aws_eip.my_eip.public_ip
ttl     = 1
proxied = false
}
resource "cloudflare_record" "vault-cloudflare-cname-record" {
count   = var.create_cname_record ? 1 : 0
zone_id = var.zone_id
name    = cloudflare_record.cloudflare-a-record.hostname
type    = "CNAME"
value   = aws_eip.my_eip.public_dns
ttl     = 1
proxied = false
}

这样你就可以控制你是想同时创建还是只创建一个。还要注意以下几点:

count = var.create_a_record ? 1 : 0
count = var.create_cname_record ? 1 : 0

当变量类型为bool(truefalse)时,在条件中使用它们时,您不必检查它们是否与另一个布尔值相等,因为最左边的值无论如何都会是truefalse。例如,如果您设置了create_a_record = true,那么将使上面的表达式:

count = true ? 1 : 0

,计算结果为count = 1。你也可以为变量设置默认值,例如,如果你想确保A记录总是在那里,你可以这样做:

variable "create_a_record" {
type    = bool
default = true
}

[1] https://www.terraform.io/language/expressions/conditionals

相关内容

最新更新