Для будущих студентов курса «Infrastructure as a code in Ansible» и всех интересующихся подготовили перевод полезного материала.
Также приглашаем записаться на открытый урок по теме «Управление Kubernetes при помощи Kubespray».
С возвращением! Это очередная техническая статья из серии заметок о terraform и kubernetes на тему инфраструктуры как кода, подготовленных компанией Contino.
TL;DR
Размер команды не имеет значения. В любом случае реализация хорошего анализа конфигурации инфраструктуры на базе terraform и сквозного тестирования ее разумности не обязательно должна быть длительным и сложным процессом.
Мне подвернулась интереснейшая задача: изучить, разработать и представить подходящую платформу тестирования с открытым кодом для базы кода terraform в рамках конвейера выпуска инфраструктуры. Принцип «контроль качества во всем» далеко не нов. Но его реализация зависит от зрелости инфраструктуры организации и допустимого уровня риска — до стадии выхода на [сколь-либо] готовый продукт.
Свежий взгляд на сферу тестирования кода для инфраструктуры позволил мне познакомиться с новейшими тестовыми платформами и обновить свои знания.
Стоит признать, в начале своего пути я страдал от предубеждения, что подготовка и реализация такого «контроля качества корпоративного класса» может потребовать значительных трудозатрат.
В конце концов, Hashicorp Terraform имеет достаточные функциональные возможности без дополнительной настройки для проверки и валидации вашей базы кода.
- Контроль качества кода —
terraform fmt -check
иterraform validate
. - Предварительный просмотр —
terraform plan
. - Построение —
TFLOG=debug terraform apply
для дотошной проверки.
Средства статического анализа кода Terraform
Прочесывание Google выявило весьма обширный перечень потенциально пригодных средств тестирования terraform.
Но сначала пройдемся по списку наших требований.
- Наличие модульных тестов в конфигурации ресурсов terraform и возможность расширять любой подобный общий список проверок соответствия передовым методам* для определенного поставщика облачных услуг. Кроме того, нас интересуют простые в использовании инструменты, с которыми можно начать работать без промедления.
* Отсутствие экземпляров ec2, открытых миру 0.0.0.0/0, — и так далее.
- Возможность выполнять более нестандартные тесты — своего рода «отбойник» нормативного соответствия, позволяющий ограничивать конфигурацию ресурсов. Эта возможность должна быть разумно расширяемой, чтобы защитить подсети, роли безопасности, нестандартные теги и даже обеспечить включение или выключение флагов определенных функций кластера EKS.
- Требование, определенное в большей степени личным опытом, — платформа тестирования по возможности должна сокращать инженерные трудозатраты, а не увеличивать их, с учетом имеющихся навыков. Разумеется, я прекрасно понимаю, что после создания такие тестовые платформы в дальнейшем требуют значительных инженерных трудозатрат на поддержание их работы и расширение.
- Поддержка сообщества важна, когда дело касается программного обеспечения с открытым исходным кодом. Ну и самое последнее, любые выбранные платформы должны быть написаны на распространенном языке программирования, таком как Go или Python. Если понадобится углубиться в платформу и написать собственные методы, найти инженера с опытом работы с одним языком будет, пожалуй, проще, чем с двумя. Любой предыдущий опыт работы с подобными инструментами, который может быть у имеющихся сотрудников группы и организации в целом, также будет полезен. Итак, теперь я готов отправиться на поиски правильного средства тестирования и платформ для выполнения этой работы.
Подборка: анализ и сравнение средств и платформ тестирования Terraform
Надеюсь, что приведенный далее список облегчит ваши труды по статическому анализу инфраструктуры как кода и контролю качества. Обращаю внимание, это полный список всех найденных мной соответствующих инструментов тестирования terraform, представляющий собой смесь средств тестирования обоснованности конфигурации, контроля качества кода и передовых методов, ориентированных на secOps, с модульными тестами. Далее вашему вниманию предлагается этот список.
- tflint — github.com/terraform-linters
- terrafirma — github.com/wayfair/terrafirma
- tfsec — github.com/liamg/tfsec
- terrascan — github.com/cesar-rodriguez/terrascan (на данный момент отсутствует поддержка TF 0.13)
- checkov — github.com/bridgecrewio/checkov
- conftest — github.com/instrumenta/conftest
Выбранные средства тестирования
Подытожим. Я старался найти стандартизированный модульный тест для компонентов ресурсов terraform и более настраиваемый набор тестов, которые берут конфигурацию ресурсов для валидации по результатам
terraform plan
.Рассмотрев преимущества и недостатки каждой платформы, я остановил свой выбор на инструменте
checkov
и платформе с очень подходящим названием terraform-compliance
— обе они написаны на python. Они удовлетворяли всем моим описанным выше требованиям.Конвейер выпуска инфраструктуры как кода в общих чертах выглядит примерно так.
Основательно покопавшись в этих платформах, я неизбежно пересмотрел собственный опыт и пришел к следующим актуальным заключениям по обсуждаемой теме:
- Тесты разумности не обязательно должны стоить как чугунный мост.
- Некоторые платформы тестирования являются настолько зрелыми, что значительная часть передовых методов, касающихся модульного тестирования, в них уже заложена.
- Освоить большинство платформ действительно очень просто, в связи с чем принятие и интеграция подобных платформ тестирования являются обязательными для организаций любого размера, в которых инфраструктура как код дополняет ее собственные гибкие техники управления, выстроенные на основе бизнес-требований «быстрый провал» и «двигайся быстрее».
Модульное тестирование — Checkov от BridgeCrew
www.checkov.io
Checkov — это инструмент статического анализа кода для инфраструктуры как кода.
Он сканирует облачную инфраструктуру, подготовленную с помощью Terraform, Cloudformation, Kubernetes, Serverless или шаблонов ARM, и выявляет неправильную конфигурацию с точки зрения безопасности и соблюдения нормативных требований.
Есть несколько модульных тестов, выполняемых по умолчанию при сканировании репозитория кода terraform, которые показывают отклонения от передовых методов — например, когда согласно конфигурации безопасности у вас есть виртуальная машина на порту 22, открытом миру (0.0.0.0/0).
Все тесты можно найти по этой ссылке на GitHub.
Начать работать с платформой очень просто.
- Установите двоичный файл.
- Инициализируйте каталог terraform командой terraform init.
- Запустите chechov для этого каталога.
Список всех модульных тестов, выполняемых по умолчанию, можно вывести в командной строке. Кроме того, при работе checkov платформа по умолчанию выдает все пройденные и непройденные модульные тесты. Очень удобно, начать использовать просто. Передовые методы terraform проверяются, но не все. Это фундаментальное отличие.
Chechov с радостью оценит ТОЛЬКО ваш код
terraform
. Платформа может работать сразу после terraform init
. Ей нет дела до вашего terraform plan
— со всеми преимуществами и недостатками. Платформа выполняет то, что заявлено, а именно «статический анализ кода». Помните о возможных последствиях, а также любых соображениях относительно логики для ваших ресурсов.Вывод после работы checkov с указанием пройденных и непройденных проверок.
Если вы готовы заниматься углубленной разработкой на Python, то сможете написать дополнительные модульные тесты. Язык разработки платформы входил в число моих требований, поскольку иногда мне приходится анализировать базу кода тестов, чтобы прикинуть, насколько трудно будет [при необходимости] создать подобные дополнительные методы. Этот момент в сочетании с вопросами обслуживания для группы в целом стал основным фактором выбора этой платформы вместо альтернативной, позволяющей получить такой же результат.
Резюмируя, в области статического анализа кода платформа checkov просто великолепна. В частности, если мне нужно, чтобы изначально определенный IP-адрес подсети был помещен в белый список. Но такой вариант не годится для тестов e2e, нуждающихся в отдельной платформе тестирования.
С другой стороны, в качестве решения я могу реплицировать модульный тест и жестко прописать параметры моей подсети/IP-адреса. А что тогда делать, если у меня несколько экземпляров и проектов, — пропускать этот тест, даже если он нужен? Может быть. А может и нет.
Вот здесь-то в игру и вступает вторая платформа тестирования —
terraform-compliance
.Terraform-compliance
terraform-compliance.com
Terraform-compliance — это облегченная платформа тестирования, предназначенная для проверки безопасности и соблюдения нормативных требований в terraform для обеспечения совместимости вашей инфраструктуры как кода с отрицательным тестированием.
Предыстория
Еще раз отмечу, сквозная разработка через тестирование поведения (BDD) стала использоваться как платформа тестирования недавно, подчеркнув потребность в универсальной платформе тестирования. Но это не единственная польза. Простота.
На самом деле, мне кажется, что BDD получает недостаточно внимания. Возможно, вы слышали о разработке посредством тестирования (TDD), которая глубоко пускает корни, прежде всего в среду разработки программного обеспечения. Но именно здесь платформы наподобие BDD упрощают создание дополнительной логики, предлагая обычному специалисту по обслуживанию инфраструктуры более простой, лаконичный и повторяемый способ разработки сквозных настраиваемых тестов без углубленного изучения какого-либо специализированного и нового языка программирования.
И хотя с помощью кода можно описать, по сути, все на свете, в конечном счете все упирается в управляемость, возможности постичь сложность кода (для чего может потребоваться подготовка обширной документации), не говоря уже о поддержке и обслуживании. Здесь можно подробнее познакомиться с BDD.
Cucumber.io — это не просто язык, это система, упрощающая работу по тестированию за счет применения подхода WYSIWYG к созданию тестов, пониманию их работы и обслуживанию. Эти примеры определяются до начала разработки и используются в качестве критериев приемки.
Они являются частью определения.
Тестирование с помощью Terraform-Compliance
Каждая платформа рассматривается по своим достоинствам с углубленным исследованием того, где ее особенности и нюансы можно использовать с наибольшей пользой. Забегая вперед, скажу, что использовать можно обе платформы.
Вот пример такого теста, разработанного с помощью платформы
terraform-compliance
с применением BDD. Он позволяет выполнять достаточно сложное сквозное тестирование.Платформа
terraform-compliance
использует вывод terraform plan
. В результате это позволяет формировать полные «планы» выпусков и тщательно тестировать их. Например, контролировать использование правильной пары ключей шифрования [для вашего поставщика облачных услуг] для учетной записи, среды и т. п. У вас будет большая свобода для творчества, и самое важное — работать с платформой очень просто.Просто ознакомьтесь с приведенными ниже действиями и примерами.
- Шаг 1. Инициализируйте каталог terraform:# terraform init
- Шаг 2. Можно быстро сформировать terraform plan следующей командой: #terraform plan -out=plan.out
- Шаг 3. Напишите несколько тестов. Дело нехитрое — уже есть папка с примерами. Давайте пройдемся по моим собственным примерам тестов, приведенным ниже, написанным на основе моего вывода terraform plan.
Это фрагмент плана
terraform
— конфигурации terraform, которая создает EKS с указанной группой запуска. Давайте удостоверимся, что в нашем коде инфраструктуры terraform
не применяется instancetype
, а используется «одобренный» вариант a1.xlarge
или a1.2xlarge
.Теперь я намеренно изменю его на
t2.small
, чтобы имитировать непрохождение теста.Напишем тест, чтобы обеспечить успешную валидацию этого требования.
- Шаг 4. Давайте заставим
terraform-compliance
оценить плат с использованием тестовых сценариев:#terraform-compliance -p plan.out -f ./<test-cases-folder>
Выполнение тестов
Пример результата с прохождением и непрохождением
Если в нашем коде инфраструктуры Terraform используется правильный
instancetype
, то все результаты будут зелеными SUCCESS.Если же наш код инфраструктуры Terraform нарушает требование из-за наличия неправильного
instancetype
, то результаты будут красными FAIL.Давайте напишем еще больше тестов
Еще несколько простых тестов, взятых из каталога примеров:
Если одна ситуация с непрохождением — в этом случае пользователь увидит «фактическое_значение», которое извлекается и показывается в целях справки и отладки.
Результаты тестов
После выполнения всех тестов отображается удобная итоговая сводка по всем пройденным и непройденным тестам, в которой также указываются пропущенные тесты. Она мне нравится тем, что позволяет написать длинный список тщательных тестов, а также найти в конце четкие сведения о том, какие тесты не были пройдены и когда. Кроме того, в случае непрохождения некоторые тесты могут быть пропущены с указанием тега
@warning
, как показано в примере ниже.Итоги
Без всякого сомнения, это была великолепная возможность заново взглянуть на некоторые платформы для валидации и тестирования превосходного качества, имеющиеся для кода как инфраструктуры Terraform.
Я получил удовольствие, рассматривая обе эти платформы, и был особенно удивлен простотой интеграции checkov, а также потрясающей валидацией
e2e terraform plan
и вариантами нестандартного тестирования, которые предлагает terraform-compliance
.Последняя напоминает мне поведение behave, еще одной великолепной платформы тестирования BDD e2e kubernetes, с которой я работал в прошлом.
Полностью написанные на Python платформы тестирования упрощают общий обмен знаниями Python между платформами и сокращают объем интеллектуального труда для обслуживания и разработки тестов в будущем.
Если вам требуется проверка конфигурации на соответствие передовым методам, когда не требуется terraform plan, то, возможно, checkov — это то, что вам нужно. В иных случаях ответом может быть платформа
terraform-compliance
, имеющая более богатый набор функций для валидации terraform plan
. Лучше всего то, что, будучи платформой BDD, terraform-compliance
очень проста в освоении.Модульное тестирование прежде всего. Проще простого. Платформа Checkov от bridgecrewio позволяет выполнять проверку соответствия передовым методам без дополнительной настройки.
На самом деле нет никакой обоснованной причины пропускать любые из этих тестов контроля качества, каким бы ни был размер вашей группы. Особенно учитывая те незначительные трудозатраты, которые нужно приложить для их реализации (см. примеры в статье).
P.S. В компании Contino реализуется порядочное количество фантастических проектов. Если вам хотелось бы поработать над суперсовременными инфраструктурными проектами или вы ищете серьезные задачи — свяжитесь с нами! Мы нанимаем персонал и ищем светлые умы на всех уровнях. Мы в компании Contino гордимся тем, что разрабатываем передовые проекты по трансформации облачных систем, предназначенные как для компаний среднего размера, так и для крупных предприятий.
Узнать подробнее о курсе «Infrastructure as a code in Ansible».
Записаться на открытый урок по теме «Управление Kubernetes при помощи Kubespray».