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

Как разрешить конфликт версий файла состояния, когда файлы состояния хранятся в git?

Мои файлы состояния хранятся вместе с файлами терраформ. (Я знаю, что это не идеально, но сейчас это то, что есть на моем рабочем месте. Есть планы отказаться от этой модели управления состоянием)

Цель моей ветки - создать новый экземпляр ec2 (названный adhoc-ec2) с различными вложениями политики. Изменение протестировано, поэтому экземпляр ec2 существует в среде разработки.

В конце, моя ветка и связанный с ней PR прошли процесс проверки PR, файл состояния уже обновлен в другой ветке и объединен с master филиал.

Разница между двумя версиями файлов настолько велика, что невозможно сопоставить вручную.

Основная причина, конечно, в том, что файл terraform содержит слишком много ресурсов, но сейчас уже слишком поздно отменить это.

Теперь мне нужно разрешить все конфликты, прежде чем я смогу объединить свою ветку в master.

Я пытался разрешить конфликт следующим образом:

  1. Переустановите мою ветку на master (чтобы мой файл terraform содержал все последние изменения)

  2. Замените устаревший файл состояния в ветке последней версией в master

  3. бегать terraform refresh в попытке синхронизировать файл состояния и фактические ресурсы среды AWS.

Однако, видимо, этот план не работает. Потому что когда я бегу terraform plan сразу после этого, планы показывают, что terrafrom все еще хочет создать экземпляр ec2 adhoc-ec2 (который уже создан, как я уже говорил ранее в этом вопросе)

В качестве альтернативы я могу уничтожить экземпляры ec2 со всеми зависимыми ролями и политиками, но это займет много времени.

Есть ли более простой способ разрешить такой конфликт файлов состояний? Зачем refresh не сработало в первую очередь?

Рабочий процесс Terraform не поддерживает совместное использование изменений состояния через пул-реквест, если только вы не можете гарантировать, что одновременно будет только один пул-реквест. Terraform ожидает, что после обновления файла состояния новый файл будет немедленно доступен для всех последующих запусков Terraform.

Чтобы лучше приблизиться к стандартному рабочему процессу Terraform (с удаленным состоянием), я бы предложил изменить ваш подход следующим образом:

  • Когда вы разрабатываете изменение, используйте terraform plan чтобы увидеть, каков будет его эффект, но не применить еще.
  • Как только вы будете довольны своим изменением, отправьте свой PR, включая только изменения конфигурации. Поскольку изменение еще не применено, обновление моментального снимка состояния для включения в этот PR отсутствует.
  • Как только изменение будет рассмотрено и объединено, как-нибудь сообщите своим коллегам, что master ветка временно заморожена, пока вы применяете изменения. (Это ручная версия блокировки, которую Terraform обычно обрабатывает автоматически с помощью удаленного сервера.)
  • Бегать terraform apply против основной ветки с внесенными в нее изменениями и создайте новую фиксацию, содержащую terraform.tfstate Обновить. Вставьте это прямо в master ветвь, минуя запросы на вытягивание, потому что это просто результат вашего изменения, которое уже было рассмотрено. (Вы должны переместить новое состояние в master ветвь, даже если terraform apply не удалось, потому что вам нужно будет открыть новый PR, чтобы реагировать на любые ошибки, но вы должны убедиться, что все, кто запускает Terraform, тем временем увидят частично обновленное состояние.)
  • После того, как вы нажали обновленный terraform.tfstate в основную ветвь, сообщите своим коллегам, что основная ветвь снова разморожена и что теперь они должны перенастроить все ожидающие ветки на основную ветку, чтобы гарантировать, что они проводят тестирование на соответствие последнему состоянию. (Это ручной эквивалент разблокировки состояния.)

Как вы знаете, сохранять состояние Terraform в системе контроля версий не рекомендуется, поскольку это предотвращает автоматическую блокировку и создает некоторую неопределенность в отношении того, работают ли разработчики с самым последним снимком состояния. Но если вы будете осторожны, чтобы сохранить все предположения, которые делает Terraform, как я описал выше, тогда вы сможете относительно безопасно использовать Terraform на данный момент, пока не сможете перейти к стандартному подходу с использованием удаленного состояния.

Бег terraform refresh будет обновлять только ресурсы, уже находящиеся в файле состояния, поэтому, если ваш экземпляр еще не существует в файле состояния, Terraform все равно хочет его создать.

Вместо этого вам следует использовать terraform import чтобы добавить ресурсы в файл состояния на основе того, что возвращает API AWS, который затем должен соответствовать тому, что находится в ваших манифестах.