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, которая объявляет, что виртуальная машина должна существовать, а затем вторая конфигурация, которая предполагает , что виртуальная машина существует, и предпринимает действия против нее. . Затем вы можете запустить любое другое программное обеспечение, которое вам нужно запустить между этими двумя, чтобы проверить, успешно ли запущен экземпляр.