Terraform生命周期防止销毁。

20

我正在使用 Terraform V11 和 AWS provider 进行工作;我正在寻找一种在销毁阶段防止销毁某些资源的方法。因此,我采用了以下方法。

lifecycle {
    prevent_destroy = true

} 

当我运行 "terraform plan" 命令时,出现以下错误。

the plan would destroy this resource, but it currently has 
lifecycle.preven_destroy set to true. to avoid this error and continue with the plan. 
    either disable or adjust the scope. 

我所寻找的只是一种在执行销毁命令时避免破坏资源及其依赖关系的方法。


重新创建是什么意思?您想使用新名称创建一个新资源吗? - mohit
1
这是完全有可能的,但需要提供更多关于用例、计划和配置的信息。 - Matt Schuchard
1
你解决了这个问题吗? - SystemFailure
2
@Moe 那么你的问题解决了吗?你是怎么解决的?我也遇到了类似的情况,必须清除所有内容,只留下一个资源。按照建议使用-target似乎有些疯狂,因为指定要省略的内容比指定要删除的内容更容易。 - avepr
请发布您正在尝试提供的“资源”的Terraform代码。一些AWS资源需要替换而不是就地更新。 - Blair Nangle
显示剩余5条评论
3个回答

8
据我所知,该功能尚未得到支持。您需要从状态文件中删除该资源,然后重新导入它。
terraform plan | grep <resource> | grep id 
terraform state rm <resource>
terraform destroy
terraform import <resource> <ID>

3

最简单的方法是将您想要销毁的所有资源注释掉,然后执行terraform apply


2
这真的是最好的方法吗?显然这不具备可扩展性。 - Ben Longo
1
相当方便,实际上 - JesusIniesta
2
@BenLongo 这就是使用生命周期的目的。如果可以的话,建议不要使用生命周期,因为它会完全改变 Terraform 的行为方式。 - alex067

1
我发现管理这个问题最实用的方法是通过变量的组合来条件性地创建或不创建所需资源,同时让所有其他资源依赖于相关的数据源而不是条件性地创建的资源。
一个很好的例子是 Route 53 托管区域,如果你在 AWS 外部管理你的域并需要更新你的名称服务器,则销毁和重新创建它可能会很麻烦,每次启动时都要等待 DNS 传播。
1. 通过指定一些变量。
variable "should_create_r53_hosted_zone" {
  type        = bool
  description = "Determines whether or not a new hosted zone should be created on apply."
}

2. 你可以将其与资源上的count一起使用,以有条件地创建它。

resource "aws_route53_zone" "new" {
  count = var.should_create_r53_hosted_zone ? 1 : 0
  name  = "my.domain.com"
}

3. 然后,通过对关联的数据源进行跟进电话

data "aws_route53_zone" "existing" {
  name = "my.domain.com"
  depends_on = [
    aws_route53_zone.new
  ]
}

4. 如果你设置了标志,你可以让所有其他资源都能够一致地访问该资源的属性,而不管你的标志是否已经设置。


resource "aws_route53_record" "rds_reader_endpoint" {
  zone_id = data.aws_route53_zone.existing.zone_id
  # ...
}

这种方法只比在apply期间注释/取消注释资源略好,但至少提供了一种一致、有文档记录的解决方案。


但是这如何防止 aws_route53_zone.new 被销毁呢?如果它被创建了,它最终会出现在状态文件中,对吧? - LavaHot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接