在应用地形计划期间出现网络问题后,如何清除地形资源的污染?

在应用地形计划期间出现网络问题后,如何清除地形资源的污染?

我已经应用 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>

相关内容