首页 文章

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

提问于
浏览
0

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

假设有2个资源(A和B),其中B依赖于A.

当我运行terraform apply时,会创建资源A(意味着后端创建了一个带有ID的对象),但在创建任务之后处于错误(错误)状态 . 我想构建的是一个能够识别这种不良状态的提供者,并在它继续尝试创建资源B之前就停在那里 . 但是,我想要的是Terraform能够清理的方法处于错误状态的资源(通过销毁或污染),甚至在我手动修复后端问题后再向前移动而不重新创建它 .

也许还有其他流动的可能性,但这里有两个我能想到的:

  • 由于后端给了我们一个ID,我们也在Terraform资源中设置了ID,但是从Create方法返回并带有错误 . 但是,我不确定Terraform接下来会做什么 . 它可以:

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

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

据我所知,Terraform的默认行为似乎是做选项A(如果我错了,请纠正我) . Can I get it to do option B though?

  • 另一个选项是不设置Terraform ID,即使后端有一个对象,但确实有ID . 好消息是Terraform不会继续使用资源B,但重要的是资源A实际上变成了孤儿;它存在于后端,但是Terraform无法清理它 .

我猜这不是一个独特的用例,但没有任何运气找出基于文档的解决方案 . 这里的任何指导将不胜感激!

1 回答

  • 2

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

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

    资源ID的存在(或缺少)在错误处理方面没有任何区别 .

    资源的约定即使它可能具有ID(通常在API第一次成功响应之后, before 任何重试逻辑) . 资源实际上与其ID一起生存和死亡 . 删除其ID意味着从状态中删除资源,并且只有在资源实际消失时才会发生(例如,API返回404) .

    在任何 applydestroy 操作期间,Terraform将始终尝试尽可能地获取 . 它将遍历配置中所有资源的图表,如果发生错误(即从C / R / U / D方法返回),它将继续创建/更新/销毁错误的那些资源 which are unaffected - 基本上所有通过 terraform graph 做出决定的资源 .

    例如,如果 aws_s3_bucket 依赖 aws_s3_bucket_object (通过插值语法或通过 depends_on ), aws_s3_bucket 的创建/更新/销毁因任何原因失败,则 aws_s3_bucket_object 将保持不变 .

    enter image description here

    但是,我还想要Terraform能够在糟糕的状态下清理该资源(通过破坏或污染),或者甚至在我在后端修复问题后继续前进而不重新创建它手动 .

    在出现故障时,或多或少是执行任何自动回滚(如销毁"failed"状态中的资源)的设计选择 not . 根据上下文,最佳回滚策略有所不同,因此Terraform故意将其留给操作员/用户 .

    然而,污染是一个不同的故事,因为它不会直接影响资源,仍然会对用户做出最终决定 .

    目前无法从CRUD /架构界面自动 taint 资源,但至少有one Github issue讨论这个想法 .


    Possibly Related: 有时资源操作需要多个API调用,其中任何一个都可能失败 . Terraform有一个名为"Partial State"的概念来解决https://www.terraform.io/docs/plugins/provider.html#resource-data中描述的部分故障

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

相关问题