В настоящее время не существует полного решения этой проблемы, интегрированного в Terraform, но есть некоторые строительные блоки, которые могут быть полезны при написании тестов на отдельном языке программирования.
Terraform создает файлы состояния в формате JSON, которые, в принципе, могут использоваться внешними программами для извлечения определенных данных о том, что создал Terraform. Хотя этот формат еще не считается официально стабильным, на практике он меняется достаточно редко, поэтому люди успешно интегрировались с ним, признавая, что им, возможно, придется вносить изменения по мере обновления Terraform.
Какая стратегия здесь подойдет, во многом будет зависеть от того, что именно вы хотите протестировать. Например:
В среде, в которой раскручиваются виртуальные серверы, такие инструменты, как Спецификация сервера может использоваться для запуска тестов с точки зрения этих серверов. Это можно запустить отдельно от Terraform, используя какой-либо внешний процесс, или как часть приложения Terraform, используя команду Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
expect-1 = TRUE
expect-other = FALSE. Got 1
provisioner. Это позволяет проверять такие вопросы, как «может ли сервер получить доступ к базе данных?», но не подходит для таких вопросов, как «достаточно ли ограничительна группа безопасности экземпляра?», поскольку надежная проверка требует доступа к данным извне самого экземпляра.
Можно писать тесты, используя существующую среду тестирования (например, RSpec для Ruby, terraform init
terraform apply -auto-approve
for Python, etc) which gather relevant resource ids or addresses from the Terraform state file and then use the relevant platform's SDK to retrieve data about the resources and assert that they are set up as expected. This is a more general form of the previous idea, running the tests from the perspective of a host снаружи тестируемой инфраструктуры и, таким образом, может собирать более широкий набор данных для вынесения предположений.
Для более скромных нужд можно довериться тому, что состояние Terraform является точным представлением реальности (во многих случаях допустимое предположение), и просто утверждать это непосредственно. Это наиболее подходит для простых случаев, подобных lint, таких как проверка того, что правильная схема маркировки ресурсов соблюдается в целях распределения затрат.
Есть еще обсуждение этого вопроса в соответствующая проблема Terraform Github.
В последних версиях Terraform настоятельно рекомендуется использовать удаленный бэкэнд для любого неигрового приложения, но это означает, что данные о состоянии не доступны напрямую на локальном диске. Однако его снимок можно получить с удаленного сервера с помощью команды output "module-returns-1" {
value = 1
}
command, which prints the JSON-formatted state data to stdout so it can be captured and parsed by a calling program.