Назад | Перейти на главную страницу

Как распаковать терраформный ресурс после сбоя сети во время применения терраформного плана?

Я применил терраформу для создания кластера 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>