【问题标题】:How should I handle `deposed` resources in Terraform?我应该如何处理 Terraform 中的“已沉积”资源?
【发布时间】:2017-06-10 21:49:45
【问题描述】:

我很难理解我应该如何处理在我的 TF 状态中找到的 deposed 资源。

特别是,在运行应用程序时,我现在遇到一些错误,如下所示:

Error applying plan:

11 error(s) occurred:

* aws_instance.mongo-replica-01 (deposed #0): Error terminating instance: InvalidInstanceID.NotFound: The instance ID 'i-0f0bdc2c16e922fbc' does not exist
    status code: 400, request id: 71b98708-cb06-4f11-ad14-8d3d160fbc1a
* aws_instance.mongo-replica-01 (deposed #1): Error terminating instance: InvalidInstanceID.NotFound: The instance ID 'i-080ef01dc84c09685' does not exist
    status code: 400, request id: 07c96f82-1e32-4944-a1d6-ab0e6306b82e
* aws_instance.mongo-replica-02 (deposed #1): Error terminating instance: InvalidInstanceID.NotFound: The instance ID 'i-085b997daac742c1e' does not exist
    status code: 400, request id: 20ff2b73-39c9-4d49-af41-f4ec542ec782
* aws_instance.mongo-replica-02 (deposed #0): Error terminating instance: InvalidInstanceID.NotFound: The instance ID 'i-00bc7fd15b04a3688' does not exist
    status code: 400, request id: cdea3c4f-9bec-496a-aedd-bcfbf0a706d2

有问题的 AWS EC2 实例确实不存在,但是在尝试删除它们时 TF 出错(可能是因为它们不存在)并且仍然保持它们的状态。

我尝试使用terraform state 命令来尝试删除deposed 资源,但它只允许我删除整个资源,而不仅仅是它的deposed 实例...

我是否应该简单地手动进入 terraform 状态文件并删除已删除的部分??

【问题讨论】:

  • 我不太清楚你所说的“被废黜”是什么意思?你的意思是他们被TF以外的东西删除了? terraform destroy 的默认 -refresh=true 参数应使用 AWS 中的内容自动更新状态文件,从而删除丢失的实例,然后不要尝试销毁它们。
  • 显然废黜是一种状态。例如,请参阅此问题:github.com/hashicorp/terraform/issues/9844
  • 确实,“废黜”状态的文档有些稀缺,如github issue here中所示

标签: amazon-web-services amazon-ec2 terraform


【解决方案1】:

来自GitHub Issue requesting for Documentation about the "deposed" state

“Deposed”是 Terraform 处理时资源进入的状态 使用 create_before_destroy... 因为只能有一个“主要” 给定资源的实例,Terraform 将首先释放现有的资源 一个(所以它仍然在状态中被跟踪,但不再用于 插值),然后在 finally 之前创建替换实例 删除被废除的实例。

该过程中的错误可能会导致被废弃的实例坚持 状态,因为 Terraform 以前不想忘记它们 它可以删除它们。但是,这种行为有点不一致 在早期的 Terraform 版本中,Terraform 也处理了废弃 实例静默而不是将它们包含在计划输出中。

所以所有这一切都是说:这些被废止的实例是从一个 在替换这些资源的过程中失败 create_before_destroy。如果您查看 Terraform 状态文件(无论是 terraform.tfstate 或 .terraform/terraform.tfstate 取决于是否 您启用了远程状态)您应该通过以下方式找到这些记录 搜索被废黜的词;您可以使用 Terraform 拥有的数据 存储这些以决定它们是否可以安全删除,然后再让 Terraform 在此处继续。

因此,您可以推断这些资源的“已弃用”状态仅表示在 destroy 阶段导致错误的潜在问题。正如引用中提到的,“已弃置”的资源应该被“解决”,因为没有更好的术语,下次你运行terraform apply 时。同时,检查 tfstate 文件以获取 terraform 已存储的任何/所有特定信息,以确定继续进行和/或诊断问题所在位置是否安全。

另外,您可以尝试以下刷新本地状态

terraform refresh      Update local state file against real resources

还有,

terraform debug              Debug output management
terraform state              Advanced state management

【讨论】:

  • terraform destroy 和 refresh 对我没有任何作用; terraform state 列表显示 5 个资源,但 terraform show 表示所有 5 个资源都为空且已被废弃。我可以用terraform state rm 删除它们吗?然后还剩下一堆数据对象。删除该状态可能更容易(AWS 中没有与此相关的资源)。
【解决方案2】:

我在删除 EC2 实例时遇到了类似问题,但在中途停止了进程,我最终做的是手动编辑我的 terraform tfstate 文件。

在其中,我找到了被废除的项目,将tainted更改为false并清空了deposed数组。

运行terraform plan 后,实例从输出中消失了。

【讨论】:

    【解决方案3】:

    terraform state rm 后跟terraform import 从状态中删除被释放的对象。

    【讨论】:

      猜你喜欢
      • 2016-12-22
      • 2019-08-17
      • 1970-01-01
      • 2011-12-05
      • 2022-11-26
      • 2012-07-14
      • 1970-01-01
      • 2017-11-06
      • 2012-08-29
      相关资源
      最近更新 更多