概述
我想创建一个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