Как завершить создание aws_instance, если user_data не удалось выполнить до завершения - PullRequest
0 голосов
/ 28 мая 2020

Возможна ли ошибка создания aws_instance, если сценарий, переданный в user_data, не запускается? например, с выходом 1?

У меня есть null_resource, который использует зависимый_on [aws_instance.myVM] для отправки JSON экземпляру, и мне нужно, чтобы этот файл depends_on завершился сбоем при сбое сценария user_data.

Спасибо!

1 Ответ

2 голосов
/ 29 мая 2020

user_data обрабатывается программным обеспечением, работающим внутри самого экземпляра, например cloud-init, поэтому его обработка асинхронна от вызова ec2:RunInstances, который провайдер Terraform AWS делает для запуска экземпляр работает. Следовательно, нет способа получить информацию о статусе из обработки user_data, потому что она потенциально может работать через некоторое время после того, как EC2 API начнет сообщать, что экземпляр «запущен», в зависимости от того, где в процессе загрузки он имел дело.

Кроме того, depends_on предназначен для упорядочивания, а не для обработки ошибок, поэтому предложение depends_on никогда ничего не изменит в обработке ошибок Terraform.

Если вы хотите запускать программное обеспечение на своем экземпляре синхронно как часть операции create Terraform, к сожалению, единственный практический вариант - использовать remote-exec Provisioners . Это происходит за счет значительной дополнительной сложности, потому что Terraform теперь должен иметь возможность открывать сеанс S SH с экземпляром и аутентифицироваться с ним для создания двустороннего канала связи.

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

С учетом сказанного, может быть лучше найти другой способ достижения цели, который не требует непосредственной привязки запуска Terraform к состоянию программного обеспечения, запущенного на виртуальной машине. Обычно не ожидается, что конфигурация Terraform должна одновременно запускать виртуальную машину и для взаимодействия с программным обеспечением, запущенным на этой виртуальной машине. Это может быть хорошим моментом для некоторой декомпозиции системы, когда у вас будет одна конфигурация Terraform, которая объявляет, что виртуальная машина должна существовать, а затем вторая конфигурация, которая предполагает , что виртуальная машина существует, и предпринимает действия против нее. . Затем вы можете запустить любое другое программное обеспечение, которое вам нужно запустить между этими двумя, чтобы проверить, успешно ли запущен экземпляр.

...