在Terraform配置中从销毁过程中排除资源

时间:2019-12-02 16:46:40

标签: kubernetes terraform

我目前正在一个完全由Terraform环境管理的工作中,但是我遇到了一些限制,我想知道是否有某个功能或变通办法可以实现我想要的功能:

我有一个这样描述的环境:

  • 具有公共子网和私有子网的VPC
  • 一个带有一些工人的EKS集群
  • 一些kubernetes配置(使用kubernetes提供程序)
  • 某些头盔配置(使用头盔提供商)

一切正常,但是当我想通过运行terraform destroy进行完全清理时,我必须使用-target选项逐个销毁一些资源,然后手动删除状态文件中的某些引用。

我要这样做的两个原因:

  1. 只是因为失败

    不知道为什么,但是我无法使用Terraform手动破坏某些子网(无法分离Internet网关),但是我能够通过简单地破坏VPC来破坏它们。

    在这种情况下,我想告诉Terraform仅删除VPC,这样做,AWS会自动销毁相关组件,例如子网,Internet网关,路由表,网络ACL等。

  2. 因为它会更快

    我正在使用带有Kubernetes(和Helm)提供程序的Terraform来定义我的Kubernetes配置,但是当我运行terraform destroy时,它将删除所有Kubernetes资源,然后是集群(和工作人员)。

    仅删除群集会更快。


这是我的问题: 是否可以在Terraform配置文件中将资源排除到销毁过程中?

3 个答案:

答案 0 :(得分:1)

实际上没有办法做我想做的事,但是文档说:

  

与其使用-target作为对非常大的配置的隔离部分进行操作的方法,不如将大的配置分解为几个可以分别应用的较小的配置。数据源可用于访问有关在其他配置中创建的资源的信息,从而可以将复杂的系统体系结构分解为易于管理的部分,这些部分可以独立更新。

如果我们使用标准模式(一种用于VPC的配置,一种用于集群和工作器的配置,一种用于kubernetes的配置),这将不适用于某些用例,因为销毁VPC仍会销毁所有组件,然后再销毁该组件。 VPC(并会导致失败)。


这是一个可能的解决方法,目标是创建两个配置:

  • 主要配置:包含所有需要销毁的组件
    • 例如:VPC,群集,RDS,DynamoDB
  • 子配置:包含将通过破坏主要组件而被破坏的所有组件(提供方)
    • 例如:Kubernetes配置,子网,Internet网关等

使用这种模式,我们可以使用destroy命令创建一个简单的CLI:

  1. 主要配置
  2. 中运行命令terraform destroy
  3. 步骤1成功完成后,请删除子配置
  4. 的状态

我在Terraform github存储库上发布了一个问题,以提出一项增强功能,即一种注释系统,该系统允许插件与带注释的资源进行交互并收听不同的事件(创建,破坏,状态刷新等)

如果您是同一情况,请查看该问题,添加+1并发表您的看法!

https://github.com/hashicorp/terraform/issues/23547

答案 1 :(得分:1)

这允许您创建一个计划来销毁除模块“module.exclude.me”之外的所有资源

terraform plan -destroy $(for r in `terraform state list | fgrep -v module.exclude.me` ; do printf " -target ${r} "; done) -out destroy.plan

来自相应的 github 问题的感谢来自 cmacrae:https://github.com/hashicorp/terraform/issues/2253

答案 2 :(得分:0)

我还看到破坏资源时出现地形故障,需要手动干预。 recommended way似乎是将所需的资源模块化为单独的配置,然后根据需要计划/销毁它们。对于您的情况,请为EKS配置说一个单独的eks.tf。