【问题标题】:Terraform: Delete resource before creating another resourceTerraform:在创建另一个资源之前删除资源
【发布时间】:2022-07-28 20:48:59
【问题描述】:

概述

我想创建一个 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\"]
}

问题

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

笔记我看过lifecycledepends_on 但在这种情况下这些似乎都不适用。

提前致谢!

  • 为什么要更改记录类型?用例是什么?
  • 谢谢。它不会经常改变。短期CNAME,长期ALIAS。 @simmyk 的答案可能会奏效。这似乎是一个我认为 Terraform 能够处理的简单用例。
  • 但否则否:您不能指定删除顺序。

标签: amazon-web-services terraform terraform-provider-aws


【解决方案1】:

更新记录类型的任何具体原因?

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

 terraform destroy --target aws_route53_record.cname

【讨论】:

  • 谢谢,看上面的评论。是的,我很欣赏这个建议,它会起作用,但它需要运行 2 次,并且在更新记录时可能会停机。
【解决方案2】:

我认为根据要求很难实现您想要的。我认为解决此问题的更好方法是使用dynamic block [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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2022-07-24
    • 2019-08-11
    • 2020-11-07
    相关资源
    最近更新 更多