![在应用地形计划期间出现网络问题后,如何清除地形资源的污染?](https://linux22.com/image/751017/%E5%9C%A8%E5%BA%94%E7%94%A8%E5%9C%B0%E5%BD%A2%E8%AE%A1%E5%88%92%E6%9C%9F%E9%97%B4%E5%87%BA%E7%8E%B0%E7%BD%91%E7%BB%9C%E9%97%AE%E9%A2%98%E5%90%8E%EF%BC%8C%E5%A6%82%E4%BD%95%E6%B8%85%E9%99%A4%E5%9C%B0%E5%BD%A2%E8%B5%84%E6%BA%90%E7%9A%84%E6%B1%A1%E6%9F%93%EF%BC%9F.png)
我已经应用 terraform 来创建 redis 集群。
进行到一半时,申请过程失败并出现以下错误消息:
Error: Error waiting for elasticache replication group (my-project) to be created: SerializationError: failed decoding Query response
status code: 200, request id: 3d5a5394-20f0-4834-9e2a-9aff20cceecf
caused by: read tcp 192.168.86.116:53912->54.222.5.156:443: read: connection reset by peer
我知道我已经成功创建集群,因为我可以使用 连接到 redis 集群redis-cli
。
但是如果我再次执行terraform apply
,terraform 会说
module.my_project.aws_elasticache_replication_group.main[0] is tainted, so must be replaced
它正试图破坏并重新创建资源,而不是no action
像我预期的那样。
我尝试将资源导入状态文件以纠正该问题。但是 Terraform 抛出了一个错误:
错误:资源已由 Terraform 管理
如果操作一开始就成功了,我就不会看到tainted
错误消息。
有什么方法可以解决这个问题?我想避免删除然后重新创建资源。
理想情况下,我希望我可以消除状态文件中的资源污染,这样 terraform 就不会尝试破坏新创建的集群。
答案1
Terraform 将该对象标记为受污染,因为由于错误,无法确定该对象是否处于完全可运行的状态。
但是,如果你知道(通过带外检查)该对象曾是处于合适状态,您可以使用以下terraform untaint
命令覆盖 Terraform 的决定:
terraform untaint module.my_project.aws_elasticache_replication_group.main[0]
此后,Terraform 将认为该对象处于适合进一步操作的状态。理想情况下,这意味着后续操作terraform plan
将完全检测不到该实例的任何变化。如果创建曾是不完整但可以通过更新修复,那么提供商可能会制定就地更新计划以匹配配置。
答案2
我可以先从状态文件中删除资源,然后再次导入。
1. 移除
terraform state rm -state=<state-file> "module.my_project.aws_elasticache_replication_group.main[0]"
2. 导入
terraform import -state=<state-file> "module.my_project.aws_elasticache_replication_group.main[0]" <resource-id>