how/state
S3 хранит state, DynamoDB держит lock. Что происходит, когда двое запускают apply одновременно, и почему «команда из одного» - единственный сценарий, где можно без этого жить.
Локальный terraform.tfstate рядом с main.tf отлично работает,
пока ты один. Как только в команде появляется второй человек -
обязателен remote backend. Без него вы либо коммитите state в
git и редактируете его в merge-конфликтах (катастрофа), либо
теряете изменения один другого (тихая катастрофа).
Стандарт де-факто в AWS - S3 + DynamoDB:
Жми ▶ - пройдём по сценарию, когда двое одновременно делают apply.
Алиса и Боб работают с одной инфраструктурой. Они запускают
terraform apply со своих ноутбуков, но state хранится не у них,
а в S3-бакете команды.
В DynamoDB пока пусто - никто не работает. State в S3 имеет
serial: 10 (то есть на нём уже сделано 10 успешных apply
кем-то из команды).
итого
Что важно запомнить:
PutItem с условием «ключ не существует». Кто успел первым -
взял lock; второй получает ConditionalCheckFailed и видит
«Lock held by …».terraform apply упал по сети, lock
остаётся висеть, пока кто-нибудь не сделает
terraform force-unlock <LockID>. Это нормальная процедура,
не повод паниковать.serial в state. Backend перед
записью проверяет, что serial вырос - это защита от
одновременных перезаписей (даже без lock).Дальше: tf-state-mv-rm-import про то, как руками двигать ресурсы внутри state-файла.