Давайте рассмотрим пример использования API с помощью Terraform HCL и Python.

Сегодня большая часть инфраструктурного кода выполняется через Terraform. Он существует уже довольно давно, имеет сильное сообщество и мультиоблачный. Однако все становится сложнее, когда дело доходит до тестирования кода Terraform. Хотя Terraform использует свой собственный язык (HCL), его серверная часть написана на Golang.

Хорошим шаблоном для тестов модулей Terraform является terratest, но, как вы уже догадались, вам нужно будет написать их на Golang. Здесь мы собираемся продемонстрировать, как мы можем использовать простой Python с мощной, но простой библиотекой tftest в существующем коде Terraform HCL.

Tftest

Tftest — небольшая библиотека Python от Google. Он позволяет программно выполнять действия Terraform (планирование | развертывание | уничтожение) и получать план выполнения, выходные переменные и т. д.

Сила tftest заключается в потенциальной комбинации с pytest. Кроме того, Python имеет действительно хорошую поддержку SDK для различных облачных провайдеров, что делает его удобным для тестирования облачной инфраструктуры.

Тематическое исследование

Наша установка будет включать в себя простой Cloud Run API (бессерверная среда выполнения контейнера), но вы можете применить описанный выше метод для любой развертываемой вами инфраструктуры!

Простой тест инфраструктуры

В первом примере мы проведем простой тест, чтобы разобраться с tftest. Давайте попробуем следующее

  • Создайте planфикстуру
  • Утверждаем, что выходное имя нашего образа контейнера соответствует нашим ожиданиям.
  • Проверьте ожидаемые выходные переменные

Фикстура плана просто смотрит, какой модуль/каталог terraform нам нужно найти (и выполняет команду apply), и делает выходную переменную доступной как объект.

Как видите, вы можете легко получить любые выходные данные и/или переменные для выполнения любых тестов, которые вам нужны!

Расширенный тест инфраструктуры e2e

Теперь мы собираемся провести тест e2e, который сделает следующее:

  • Разверните API в Cloud Run
  • Получить URL-адрес развернутой службы
  • Создайте сеанс аутентификации, готовый к запросу
  • Выполните запрос и подтвердите ответ
  • Уничтожить API

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

На этот раз наш прибор выполнит apply и destroy в конце теста.

Он также создаст сеанс аутентификации на основе развернутого URL-адреса, чтобы разрешить выполнение запроса. Мы завершим этот сеанс авторизации с помощью функции request_wrapper.

Поместим этот прибор в conftest.py:

А вот наш тестовый файл, который будет выполнять запрос и подтверждать ответ:

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

Предостережение

Эта настройка отлично подходит для любых бессерверных компонентов (например, Cloud Run), у которых нет длительного холодного запуска. Готовность некоторых облачных сервисов иногда может занять до 15–20 минут, что делает утомительным их включение в конвейер CI.

Разве нет лучшего решения?

Представленная здесь установка прекрасно работает с существующей кодовой базой terraform. Однако, если вы начинаете новый проект, есть более подходящие решения.

У Terraform уже есть бета-версия Terraform CDK, которая позволяет вам напрямую использовать Python (или любой другой поддерживаемый язык программирования) для объявления вашей инфраструктуры, что значительно упрощает тестирование.

Pulumi также является отличным кандидатом, и он более зрелый на стороне CDK.

Если вы хотите работать только с AWS, вы также можете использовать AWS CDK, но вы потеряете преимущества инвестирования знаний в платформу IAC, которая не привязана к поставщику.

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

Удачного тестирования.

Ссылка на полный демонстрационный репозиторий GitHub здесь.

Want to Connect?
Follow me on YouTube or LinkedIn