Повторное развертывание узлов Terraform aws_instance последовательно, а не параллельно - PullRequest
1 голос
/ 10 октября 2019

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

Есть ли способ настроить Terraform так, чтобы он ожидал полного уничтожения / воссоздания одного экземпляра, прежде чем уничтожать / создавать другой? экземпляры?

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Вы можете использовать настройку жизненного цикла create_before_destroy , чтобы заставить Terraform создать новый ресурс перед уничтожением старого во время действия замены.

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

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

0 голосов
/ 10 октября 2019

Существует атрибут depends_on, который позволяет устанавливать явные зависимости и создавать вещи по порядку. Он ограничен для вашего сценария, потому что он не ждет, пока новые экземпляры будут «готовы», только что созданы.

Одна идея, которая у меня возникла при чтении вашего сценария, вы можете использовать источник данных extermal. Не уверен, что это было предназначено для такого рода вещей, но я думаю, что это может сработать. По сути, вы можете написать сценарий, который будет использовать интерфейс командной строки AWS и все остальное, что нужно, чтобы увидеть, создан ли экземпляр и готов ли он. Если вы используете с depends_on или объедините выходные данные источника данных external со следующим экземпляром (используйте выходные данные для установки тега?), Я думаю, это даст желаемый эффект.

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

Ресурсы:

https://www.terraform.io/docs/providers/external/data_source.html

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-create-loadbalancer-rolling.html

Редактировать:

Если вы застряли с экземплярами EC2, другой собственный способ решения AWS может заключаться в использовании ловушек жизненного цикла. Я использовал сценарии пользовательских данных EC2 в сочетании с перехватчиками жизненного цикла, вызывающими функции Lambda, для развертывания и настройки пользовательского кластера Kafka (до MSK). Это требовало, чтобы я приводил экземпляры в порядок и назначал каждому экземпляру уникальный идентификатор брокера. Похоже на ваш сценарий.

Ресурс: https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...