Terraform:在创建另一个资源之前删除资源



概述

我想创建一个Route53 DNS记录。根据变量的不同,它将是CNAME记录或ALIAS记录。

在第一次运行时,由于这两条记录都不存在,所以运行正常。

然而,当更新变量var.route_53_redirection_type以更改记录类型时,terraform apply失败,因为它试图在删除旧记录之前创建新记录。

Error: [ERR]: Error building changeset: InvalidChangeBatch: [RRSet of type A with DNS name redirect is not permitted because a conflicting RRSet of type CNAME with the same DNS name already exists in zone.]

terraform apply再次运行时,它会工作,因为该记录已在上一次运行中删除。

这是代码:

resource "aws_route53_record" "alias" {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
count = var.route_53_redirection_type == "ALIAS" ? 1 : 0
zone_id = data.aws_route53_zone.public.zone_id
name    = "redirect"
type    = "A"
alias {
name                   = module.alb.alb_dns_name
zone_id                = module.alb.alb_zone_id
evaluate_target_health = true
}

}
resource "aws_route53_record" "cname" {
count = var.route_53_redirection_type == "CNAME" ? 1 : 0
zone_id = data.aws_route53_zone.public.zone_id
name    = "redirect"
type    = "CNAME"
ttl     = "5"
records        = ["www.google.com"]
}

问题

  • 是否可以确保删除发生在创建之前
  • 有没有更好的方法可以完全消除依赖性

注意我已经研究了生命周期和依赖关系,但这两种情况似乎都不适用。

提前感谢!

我认为很难根据需求实现您想要的。我认为解决这一问题的更好方法是使用dynamic块[1]和for_each[2](仍然不确定这是否能如预期那样工作(。代码看起来像:

resource "aws_route53_record" "record" {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
zone_id = data.aws_route53_zone.public.zone_id
name    = "redirect"
type    = var.route_53_redirection_type == "ALIAS" ? "A" : "CNAME"
ttl     = var.route_53_redirection_type == "ALIAS" ? null : 5
dynamic "alias" {
for_each = var.route_53_redirection_type == "ALIAS" ? [1] : []
content {
name                   = module.alb.alb_dns_name
zone_id                = module.alb.alb_zone_id
evaluate_target_health = true
}
}
}

[1]https://www.terraform.io/language/expressions/dynamic-blocks

[2]https://www.terraform.io/language/meta-arguments/for_each

更新记录类型的具体原因是什么?

但如果这是删除任何特定资源的要求,我们可以始终使用destroy,因为destroy命令可以用于销毁一整套云基础设施或目标资源。

terraform destroy --target aws_route53_record.cname

相关内容

  • 没有找到相关文章

最新更新