当前位置: 首页 > 知识库问答 >
问题:

Terraform上的AWS:删除资源出错:等待状态被破坏时超时

陆昊
2023-03-14

我正在使用Terraform(v0.12.28)启动我的AWS环境(AWS provider v2.70.0
当我尝试使用terraform destroy删除所有资源时,我面临以下错误:

error deleting subnet (subnet-XXX): timeout while waiting for state to become 'destroyed' (last state: 'pending', timeout: 20m0s)

我可以添加我的Terraform代码,但我认为我的资源堆栈中没有什么特别之处,基本上包括:

  1. 专有网络和子网
  2. Internet和NAT GTWs
  3. 应用程序负载平衡器
  4. 路由表
  5. 自动生成的NACL和弹性网络接口(ENIs)

在我的案例中,问题似乎与连接到ALB的ENIs有关-从AWS控制台可以看出:

在寻找解决方案时,我注意到这是一个常见的问题,可能来自不同的资源和依赖类型。

在这个问题中,我将集中讨论与VPC组件(子网、ENI等)和依赖于它们的资源(负载均衡器、EC2、Lambda函数等)相关的问题,这些问题可能由于需要分离阶段而无法删除删除之前。

我们将非常感谢您的帮助。

(*)此环境(DEV)的Terraform用户具有完全管理员权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

所以这不应该与政策有关。

有关问题的例子:

更新:在AWS Lambda的VPC改进后,影响HashiCorp Terraform资源删除的问题(解决方案不起作用-我有AWS提供商的更新版本)。

AWS VPC-无法分离“正在使用”的AWS Lambda VPC ENI

Lambda相关EC2子网和安全组删除问题及改进

AWS:删除子网超时,因为扩展组

等待路由表(rtb-xxxxxx)被破坏时出错:等待状态被破坏时超时

等待Internet网关分离/群集已附加节点组时出错

共有2个答案

方俊
2023-03-14

我刚才碰到这个问题...

一个(hacky)解决方案是尝试通过AWS控制台删除子网。AWS将告诉你是什么阻止了子网被删除——对我来说,在Terraform有权删除我的子网之前,需要分离并删除两个网络接口。

正如Mathew Tinsley所说,有时AWS会隐式地创建一些相关资源,而Terraform无法自行销毁这些资源。

欧阳何平
2023-03-14

我在试图销毁EKS群集时遇到了这个问题,因为我已经在群集上部署了服务,特别是负载均衡器。为了解决这个问题,我手动删除了负载均衡器和关联到负载均衡器的安全组。

Terraform不知道k8s提供的资源,也不会清理依赖资源。

如果您不确定是什么资源阻止Terraform破坏基础设施,您可以尝试以下方法:

  • 使用terraformapply恢复到良好状态,然后在再次运行terraformdestroy之前使用kubectl清理资源
  • 本知识库文章包含一个脚本,您可以运行该脚本来识别依赖项:https://aws.amazon.com/premiumsupport/knowledge-center/troubleshoot-dependency-error-delete-vpc/
  • 查看CloudTrail日志以查看创建了哪些资源。如果这是EKS的问题,您可以通过用户名进行过滤:AmazonEKS

此问题的另一个变体是DependencyViolation错误。前任:

错误删除VPC:依赖违反:vpc'vpc-xxxxx'有依赖关系,不能删除

 类似资料:
  • 我用绝地武士连接redis服务器。Redis ip值在一个单独的文件中配置,我试图在初始化期间加载该文件 我从redis获取多个密钥的方法如下 当我在属性文件中给出了不正确的ip值时,访问它的请求线程等待了很长一段时间。我的请求不应该因为池中资源不可用而停止。 在这里,我附加了停顿线程的线程转储(即;处于等待状态的线程) 我怎样才能做到这一点?非常感谢您的帮助。提前感谢:-)

  • 我一直在尝试使用android studio emulator,但我无法在emulator上运行我的应用程序。当我运行我的应用程序时,它会显示带有以下详细信息的模拟器: > Hax已启用 Hax ram\U尺寸0x40000000 HAX正在工作,emulator以快速virt模式运行。 端口5554上的控制台;5555港口ADB 之后,将进入下一个选项卡启动应用程序,并显示等待设备联机。之后显示

  • 在Bash脚本中,我想做如下操作: 一、 例如,在后台启动两个应用程序,并给他们60秒时间完成工作。然后,如果他们没有在这段时间内完成,就杀了他们。 不幸的是,上面的方法行不通,因为< code>timeout是一个可执行文件,而< code>wait是一个shell命令。我试着把它改成: 但是这仍然不起作用,因为< code>wait只能在同一个shell中启动的PID上调用。 有什么想法吗?

  • 问题内容: 我想知道WebDriver等待超时和隐式等待超时之间的技术差异。 问题答案: 如文档中所述: 在内部设置将用于所有连续搜索的超时。如果找不到该元素,它将尝试在指定的时间内反复查找该元素。它仅执行此操作,不能强制执行其他任何操作- 它等待元素显示。 ,或者只是您用于特定搜索的一次计时器。它具有更大的可扩展性,意味着您可以将其设置为等待可能需要的任何条件。通常,您可以使用一些预构建的元素来

  • 问题内容: 在Bash脚本中,我想执行以下操作: 即,在后台启动两个应用程序,并给它们60秒以完成其工作。然后,如果他们没有在该时间间隔内完成,请杀死他们。 不幸的是,上述内容不起作用,因为它是可执行文件,而它是Shell命令。我尝试将其更改为: 但这仍然行不通,因为只能在同一外壳程序内启动的PID上进行调用。 有任何想法吗? 问题答案: 将PID写入文件并像这样启动应用程序: 这将创建另一个hi

  • 问题内容: 我使用Node.js和TypeScript,并且使用。这是我的测试用例: 我想为整个功能设置一个超时时间。即如果要花费2秒,花费0.5秒,花费5秒,我想在3秒钟后让我抛出错误的超时。 正常调用是一个问题,因为范围丢失了: 而且我不能用普通的方式抓住它: 有关如何解决的任何想法? 问题答案: 您可以使用超时: 您必须将其包装在诺言中才能使用。