Я применил терраформу для создания кластера 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 не попытался уничтожить вновь созданный кластер.
Terraform помечает объект как испорченный, потому что из-за ошибки нельзя быть уверенным, что объект был оставлен в полностью функциональном состоянии.
Однако, если вы знаете (посредством внеполосной проверки), что объект был оставленный в подходящем состоянии, вы можете переопределить определение Terraform, используя terraform untaint
команда:
terraform untaint module.my_project.aws_elasticache_replication_group.main[0]
После этого Terraform будет считать, что объект находится в подходящем состоянии для дальнейших действий. В идеале это будет означать, что последующий terraform plan
вообще не обнаружит никаких изменений в этом экземпляре. Если создать был неполный, но может быть исправлен с помощью обновления, тогда поставщик может разработать план обновления на месте в соответствии с конфигурацией.
Я могу сначала удалить ресурс из файла состояния, а затем снова импортировать.
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>