Защитите свою инфраструктуру, автоматизируя ее доставку

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

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

Сейчас разработчики используют CI для разработки кода и приложений. Но как насчет Terraform? Как применить методы непрерывной интеграции и доставки к вашему коду Terraform?

В этой статье мы продемонстрируем, как построить полный конвейер Terraform с помощью GitLab CI.

Реализация конвейера

В этом конвейере мы рассмотрим 3 этапа:

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

Мы также можем рассмотреть дополнительный этап: возврат последнего примененного набора изменений. Но поскольку эти операции могут быть разумными, я лично держу их подальше от CI.

Настраивать

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

Давайте продемонстрируем использование Google Cloud Platform и сегмента хранилища.

  1. Сначала создайте новую учетную запись службы для GitLab и сохраните файл учетных данных.
  2. Предоставьте этому сервисному аккаунту соответствующие права в сегменте Terraform (владелец хранилища).
  3. Настройте учетные данные учетной записи службы как файловую переменную в настройках CI / CD вашего проекта GitLab.

Этот процесс аналогичен, если вы используете AWS: вам нужно настроить AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY переменные среды с учетными данными пользователя с соответствующей областью действия.

Инициализировать конвейер GitLab CI

Создайте .gitlab-ci.yml файл в корне проекта со следующим содержимым:

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

Статическая проверка кода Terraform

Первое, что нам нужно, это обеспечить отправляемый код:

Эти проверки будут первыми работами в нашем конвейере. Они запускаются параллельно, чтобы сэкономить время. Обратите внимание, что команда validate требует инициализации Terraform.

Создать план

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

Здесь происходит несколько интересных вещей:

  • Сначала мы сохраняем план в виде файла, чтобы передать его команде применения на следующем этапе. Это единственный способ быть абсолютно уверенным в том, что то, что мы планируем, будет применено к нашей инфраструктуре.
  • По той же причине мы сохраняем папку .terraform, чтобы все модули провайдера были в той же версии, что и та, которая использовалась для создания плана. В Terraform 0.14 файл блокировки зависимостей решит эту проблему более элегантно.
  • Мы сохраняем файлы с помощью ключевого слова артефактов GitLab CI, чтобы сделать их доступными для заданий на более позднем этапе.

Применение изменений

Последнее, что нужно сделать, - это применить изменения.

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

Мы возвращаем наш сохраненный план и .terraform папку с предыдущего этапа и просто запускаем команду Terraform в неинтерактивном режиме. Это задание создается только для основной ветки.

Идти дальше

Если хотите, вы можете реализовать ключевые метрики из плана Terraform прямо в графическом интерфейсе GitLab с помощью интеграции Terraform MR.

Или вы можете добавить этап тестирования для своей инфраструктуры, реализовав несколько тестовых примеров Terratest, особенно в среде промежуточной инфраструктуры, перед развертыванием в производственной среде.

Заключение

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