我应该如何处理 Terraform 中的“废弃”资源?

问题描述 投票:0回答:4

我正在努力了解应该如何处理在我的 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 状态文件并删除废弃的部分??

amazon-web-services amazon-ec2 terraform
4个回答
14
投票

来自 GitHub 问题,请求提供有关“废黜”状态的文档

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

该过程中的错误可能会导致被废弃的实例滞留 状态,因为 Terraform 不想在之前失去对它们的跟踪 它可以删除它们。然而,这种行为有点不一致 在早期的 Terraform 版本中,Terraform 也处理了废弃的 静默地实例化,而不是将它们包含在计划输出中。

所以所有这一切都是在说:这些被废止的实例是一个 替换这些资源期间失败 创建_之前_销毁。如果您查看 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

10
投票

terraform state rm
后跟
terraform import
从状态中删除已废弃的对象。


4
投票

我删除的 EC2 实例也遇到了类似的问题,但中途停止了该过程,最终我所做的是手动编辑我的 terraform

tfstate
文件。

在其中,我找到了被废弃的项目,将

tainted
更改为
false
,并清空了
deposed
数组。

运行

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


0
投票

对于我的场景,我最终禁用了

create_before_destroy
(从 true 变为 false)。否则,我无法弄清楚在哪里应用其他解决方案,并且 terraform 状态在任何地方都没有显示
deposed
tainted

© www.soinside.com 2019 - 2024. All rights reserved.