В двух словах, у нас есть платформа, которая включает в себя несколько приложений / серверов. Terraform используется для управления как развертыванием инфраструктуры AWS (VPC, Subnet, IGW, Security Groups, ...), так и приложений (используя Ansible в качестве поставщика от Terraform). Для каждого развертывания Packer будет собирать все AMI, пометьте их соответствующим именем, чтобы из Terraform были получены последние AMI.
Процесс в целом работает, но мы сталкиваемся с дилеммой, когда мы хотим развернуть небольшие исправления, которые могут происходить довольно часто, так как после каждого развертывания и тестирования из QA могут возникнуть некоторые регрессии. Таким образом, для каждого приложения, которое должно быть исправлено (может быть, не все приложения должны быть исправлены), мы создаем ветку исправлений, создаем артефакт (может быть jar или deb pkg) - тогда есть 2 случая:
- Либо активируйте Packer для создания нового образа, отметьте его соответствующим исправлением и примените terraform.
- Или, запустите задание Ansible для горячего развертывания пакета приложения, перезапустите службу / приложение, если это необходимо.
При первом подходе мы обеспечиваем реализацию идеи Immutable Infra, к сожалению, это также вызвало некоторые недостатки, поскольку любые небольшие изменения в конфигурации Terraform или Infra могут привести к изменению плана terraform, например, у нас могут быть некоторые изменения в группе безопасности который находится вне состояния terraform (то есть: это может быть из некоторых функций, касающихся внесения в белый список некоторых IP-адресов), и применение tf отменит все изменения. Весь процесс построения AMI и запуска Terraform также довольно тяжелый.
Мы больше склоняемся ко второму подходу, который прост, но все еще задается вопросом, хорошая ли это практика?