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

时间:2017-01-25 16:07:23

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

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

3 个答案:

答案 0 :(得分:4)

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

  

"废黜"是Terraform交易时资源进入的状态   使用create_before_destroy ...因为只能有一个" primary"   在给定资源的实例中,Terraform将首先废除现有资源   一个(所以它仍然在状态跟踪,但不再用于   插值),然后在最终之前创建替换实例   删除已废弃的实例。

     

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

     

所有这一切都是说:这些被废弃的实例是来自a的剩余物   用这些资源替换这些资源时失败了   create_before_destroy。如果您查看Terraform状态文件(或者   terraform.tfstate或.terraform / terraform.tfstate取决于是否   你有远程状态启用)你应该找到这些记录   寻找被废除的词;你可以使用Terraform拥有的数据   为了这些而存储,以确定在出租之前是否可以安全删除   Terraform在这里继续。

所以,你可以推断出#34;被废#"这些资源的状态仅仅表示在destroy阶段导致错误的潜在问题。如报价所述,"被废除"在下次运行terraform apply时,由于缺少更好的术语,资源应该已经解决了#34;在此期间,请检查tfstate文件中是否存在terraform已存储的任何/所有特定信息,以确定是否可以安全地继续和/或可能诊断出问题的位置。

此外,您可以尝试以下操作来刷新本地状态

terraform refresh      Update local state file against real resources

此外,

terraform debug              Debug output management
terraform state              Advanced state management

答案 1 :(得分:1)

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

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

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

enter image description here

答案 2 :(得分:1)

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