GitHub

Tensho

Заметки непутевого программиста

Terraform Deposed

05/03/2019

Нежданно-негаданно наткнулся сегодня на одно из возможных состояний ресурса, которое до сих пор недокументированно. Когда выставляется в жизненном цикле ресурса директива create_before_destroy, то как следует их названия прежде чем удалить старый ресурс, сначала создается новый.

resource "aws_instance" "example" {
  # ...

  lifecycle {
    create_before_destroy = true
  }
}

Что я не осозновал ранее, так это тот факт, что Terraform помечает старый ресурс как deposed. Такого рода ресурсы исключаются из интерполяции и просто удаляются в конце применения изменений. Вот как приблизительно выглядит вывод при изменении упомянутого ресурса:

Plan: 1 to add, 0 to change, 1 to destroy.

module.instance.aws_instance.example: Creating...
module.instance.aws_instance.example: Still creating... (10s elapsed)
module.instance.aws_instance.example: Still creating... (20s elapsed)
module.instance.aws_instance.example: Provisioning with 'remote-exec'...
module.instance.aws_instance.example: Creation complete after 57s (ID: i-0b4a7876b0ff9d10e)

module.instance.aws_instance.example.deposed: Destroying... (ID: i-04d414b59bb1f7c59)
module.instance.aws_instance.example (deposed #0): Still destroying... (ID: i-04d414b59bb1f7c59, 10s elapsed)
module.instance.aws_instance.example (deposed #0): Still destroying... (ID: i-04d414b59bb1f7c59, 20s elapsed)
module.instance.aws_instance.example.deposed: Destruction complete after 1m22s

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

Для такого рода ресурсов есть отдельная секция в файле описания состояния:

...
"aws_instance.instance": {
  "type": "aws_instance",
  "depends_on": [],
  "primary": { ... },
  "deposed": [],
  "provider": "provider.aws"
},
...

В нормальных условиях секция deposed должна быть пустой. Если во время работы terraform apply возникли какие-то ошибки, то deposed ресурс останется записанным в state до следующего запуска. Таким образом Terraform не забудет таки подчистить за нами, когда ошибка будет исправлена.