Terraform:如果父级部分完成并出现错误,是否会创建依赖资源?

Terraform:如果父级部分完成并出现错误,是否会创建依赖资源?,terraform,Terraform,请注意,这是一个关于自定义生成提供程序如何处理错误流的可能性的设计问题。无论流动是否良好。。。这是另一个问题 假设有两种资源(A和B),其中B依赖于A 当我运行terraform apply时,资源A被创建(意味着后端创建了一个ID为的对象),但在创建任务后处于错误(error)状态。我想建立的是一个能够识别这种不良状态的提供者,在它继续尝试创建资源B之前,就停止它。不过,我也希望Terraform能够在不良状态下清理资源(通过销毁或污染),甚至在我手动修复后端的问题后,继续前进而不重新创建它

请注意,这是一个关于自定义生成提供程序如何处理错误流的可能性的设计问题。无论流动是否良好。。。这是另一个问题

假设有两种资源(A和B),其中B依赖于A

当我运行terraform apply时,资源A被创建(意味着后端创建了一个ID为的对象),但在创建任务后处于错误(error)状态。我想建立的是一个能够识别这种不良状态的提供者,在它继续尝试创建资源B之前,就停止它。不过,我也希望Terraform能够在不良状态下清理资源(通过销毁或污染),甚至在我手动修复后端的问题后,继续前进而不重新创建它

也许还有其他流动的可能性,但我可以想到以下两种:

  • 因为后端给了我们一个ID,所以我们也在Terraform资源中设置了ID,但是从Create方法返回时出错。然而,我不确定Terraform下一步会做什么。它可以是:

    A.继续并尝试创建资源B,因为A有一个ID(不需要)

    B.拒绝尝试创建资源B,因为创建A时返回错误(需要)

    据我所知,Terraform的默认行为似乎是执行选项A(如果我错了,请纠正我)但我可以让它执行选项B吗?

  • 另一个选项是不设置Terraform ID,即使后端上现在有一个对象具有ID。好的是Terraform不会移动到资源B,但坏的是资源A实际上变成了孤儿;它存在于后端,但Terraform无法清理它

  • 我猜这不是一个独特的用例,但是我还没有找到一个基于文档的解决方案。如蒙指导,不胜感激

    我想要构建的是一个能够识别这种糟糕状态的提供者,并在它继续尝试创建资源B之前停止

    这就是HashiCorp、供应商和社区维护的大多数(如果不是全部的话)提供商的工作方式

    资源ID的存在(或缺乏)对错误处理没有任何影响

    即使资源处于挂起/失败状态,它也有一个ID。资源代码应始终尽可能快地设置ID(通常在API第一次成功响应之后,在任何重试逻辑之前)。资源实际上随其ID一起生存和死亡。移除其ID意味着将资源从状态中移除,并且只有在资源实际消失时才会发生(例如,API返回404)

    在任何
    应用
    销毁
    操作期间,Terraform都会尽可能地进行。它将遍历配置中所有资源的图表,如果发生错误(即,从C/R/U/D方法返回),它将只继续创建/更新/销毁那些不受错误影响的资源,基本上是所有不依赖失败资源的资源。您可以通过
    terraformgraph
    查看Terraform做出决策的完全依赖关系图

    例如,如果您有
    aws_s3_bucket_对象
    依赖于
    aws_s3_bucket
    ,并且
    aws_s3_bucket
    的创建/更新/销毁因任何原因失败,则
    aws_s3_bucket_对象
    将保持不变

    不过,我也希望Terraform能够在糟糕的状态下清理该资源(通过销毁或污染),甚至在我手动修复后端问题后不重新创建它而继续前进

    在发生故障时执行任何自动回滚(如在“失败”状态下销毁资源)或多或少是一种设计选择而不是。任何操作都会有很多失败的方式,而对什么是最佳回滚策略的看法也会因上下文而异,因此Terraform有意将此留给操作员/用户

    然而,污染是另一回事,因为它不会直接影响资源,而且最终还是由用户决定

    目前没有办法从CRUD/schema接口自动
    污染
    资源,但至少有人在讨论这个想法


    可能相关:有时资源操作需要多个API调用,其中任何调用都可能失败。Terraform有一个称为“部分状态”的概念来解决中所述的部分故障

    基本上,它总是确保在返回错误之前甚至存储了部分状态

    我想要构建的是一个能够识别这种糟糕状态的提供者,并在它继续尝试创建资源B之前停止

    这就是HashiCorp、供应商和社区维护的大多数(如果不是全部的话)提供商的工作方式

    资源ID的存在(或缺乏)对错误处理没有任何影响

    即使资源处于挂起/失败状态,它也有一个ID。资源代码应始终尽可能快地设置ID(通常在API第一次成功响应之后,在任何重试逻辑之前)。资源实际上随其ID一起生存和死亡。移除其ID意味着将资源从状态中移除,并且只有在资源实际消失时才会发生(例如,API返回404)

    在任何
    应用
    销毁
    操作期间,Terraform都会尽可能地进行。它将遍历配置中所有资源的图表,如果发生错误(即从C/R/U/D方法返回),它将继续创建/更新/销毁