请注意,这是一个关于自定义构建提供程序如何处理错误流的可能性的设计问题 . 无论这种流程是否良好......这是另一个问题 .
假设有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 回答
这就是HashiCorp,供应商和社区维护的大多数(如果不是全部)提供商的工作方式 .
资源ID的存在(或缺少)在错误处理方面没有任何区别 .
资源的约定即使它可能具有ID(通常在API第一次成功响应之后, before 任何重试逻辑) . 资源实际上与其ID一起生存和死亡 . 删除其ID意味着从状态中删除资源,并且只有在资源实际消失时才会发生(例如,API返回404) .
在任何
apply
或destroy
操作期间,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
将保持不变 .在出现故障时,或多或少是执行任何自动回滚(如销毁"failed"状态中的资源)的设计选择 not . 根据上下文,最佳回滚策略有所不同,因此Terraform故意将其留给操作员/用户 .
然而,污染是一个不同的故事,因为它不会直接影响资源,仍然会对用户做出最终决定 .
目前无法从CRUD /架构界面自动
taint
资源,但至少有one Github issue讨论这个想法 .Possibly Related: 有时资源操作需要多个API调用,其中任何一个都可能失败 . Terraform有一个名为"Partial State"的概念来解决https://www.terraform.io/docs/plugins/provider.html#resource-data中描述的部分故障
基本上它总是确保在返回错误之前存储甚至部分状态 .