Подтвердить что ты не робот

Есть ли способ unit test Шаблон облачной системы AWS

Когда мы говорим, что облачная информация - это "Инфраструктура как код", следующий вопрос, который сразу приходит в голову, - как можно проверить этот код. Можем ли мы сделать какой-то базовый unit test этого кода

И я отказываюсь от валидации облачной информации, потому что это просто способ синтаксической проверки и что я могу делать с любым другим свободным валидатором JSON/YAML.

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

Не ожидается, что он должен проверить правильность разрешений или что я не исчерпал свои пределы. Но, по крайней мере, за пределами базовой проверки синтаксиса JSON/YAML

4b9b3361

Ответ 1

Вот пример того, как несколько методов тестирования программного обеспечения могут быть применены к шаблонам/стекам CloudFormation:

пыление

Для связывания (проверки кода шаблона CloudFormation на правильность синтаксиса/грамматики) вы можете использовать API-интерфейс ValidateTemplate для проверки базовой структуры шаблона и API-интерфейс CreateChangeSet для более подробной проверки свойств вашего ресурса.

  • Обратите внимание, что ValidateTemplate выполняет гораздо более тщательную проверку, чем простой синтаксис JSON/YAML checker-, он проверяет правильную анатомию шаблона, правильный синтаксис/использование внутренних функций и правильное разрешение всех значений Ref.
  • ValidateTemplate проверяет базовый синтаксис CloudFormation, но не проверяет ресурсы шаблона по конкретным схемам свойств. Для проверки структуры параметров шаблона, ресурсов и свойств по типам ресурсов AWS CreateChangeSet должен возвращать ошибку, если какие-либо параметры или свойства ресурса сформированы неправильно.

Модульное тестирование

Выполнение модульного тестирования сначала требует ответа на вопрос: какова наименьшая отдельная единица функциональности, которую можно/нужно тестировать? Я считаю, что для CloudFormation самым маленьким тестируемым модулем является Resource.

Официальные типы ресурсов AWS поддерживаются/поддерживаются AWS (и в любом случае являются проприетарными реализациями), поэтому не требуется никаких дополнительных модульных тестов, написанных разработчиками для конечных пользователей.

Тем не менее, ваши собственные пользовательские ресурсы могут и должны быть проверены модулем. Это можно сделать с помощью подходящей среды тестирования на собственном языке реализации (например, для пользовательских ресурсов, поддерживаемых lambda-tester, возможно, хорошей отправной точкой будет библиотека, подобная lambda-tester).

Интеграционное тестирование

Это наиболее важный и актуальный тип тестирования для стеков CloudFormation (которые в основном служат для связывания различных ресурсов вместе в интегрированное приложение), а также тип, который может использовать больше уточнений и наилучших разработок. Вот несколько первоначальных идей о том, как провести интеграционное тестирование кода CloudFormation путем фактического создания/обновления полных стеков, содержащих реальные ресурсы AWS:

  • Используя язык сценариев, выполните создание стека CloudFormation с использованием языка AWS SDK. Дизайн шаблона для возврата стека выходов, отражающих поведение, которое вы хотите проверить. После того, как стек создан языком сценариев, сравните выходные данные стека с ожидаемыми значениями (а затем, при необходимости, удалите стек впоследствии в процессе очистки).
  • Используйте ресурсы AWS::CloudFormation::WaitCondition для представления успешных тестов/утверждений, чтобы успешное создание стека указывало на успешный запуск интеграционного теста, а неудачное создание стека - на неудачный запуск интеграционного теста.

Помимо CloudFormation, одним из интересных инструментов, заслуживающих упоминания в области тестирования инфраструктуры как кода, является kitchen-terraform, набор плагинов для Test Kitchen, которые позволяют создавать полностью автоматизированные интеграционные тестовые наборы для модулей Terraform. Подобный жгут для тестирования интеграции в конечном итоге может быть создан для CloudFormation, но пока не существует.

Ответ 2

Этот инструмент "cfn-nag" анализирует коллекцию шаблонов CloudFormation и применяет правила для поиска шаблонов кода, которые могут привести к небезопасной инфраструктуре. Результаты этого инструмента включают в себя идентификаторы логических ресурсов для нарушения ресурсов и объяснение того, какое правило было нарушено. Дополнительная литература: https://stelligent.com/2016/04/07/finding-security-problems-early-in-the-development-process-of-a-cloudformation-template-with-cfn-nag/

Несмотря на то, что существует ряд конкретных правил, которым инструмент будет пытаться соответствовать, грубые категории:

IAM и политики ресурсов (S3 Bucket, SQS и т.д.) Соответствует политикам, которые каким-то образом являются чрезмерно разрешающими (например, подстановочные знаки в действиях или принципалах)

Правила входа и выхода группы безопасности Соответствует слишком либеральным правилам (например, правило входа открыто для 0.0.0.0/0, диапазон портов 1-65535 открыт)

Журналы доступа Поиск журналов доступа, которые не включены для соответствующих ресурсов (например, Elastic Load Balancers и CloudFront Distribution).

Шифрование (на стороне сервера), которое не включено или не применяется для соответствующих ресурсов (например, томов EBS или для вызовов PutObject в сегменте S3)

Ответ 3

Тестирование, которое вы описали (по крайней мере, за разбор JSON), может быть достигнуто частично путем разбора шаблонов CloudFormation программными библиотеками, которые используются для создания/чтения шаблонов. Они не тестируют шаблон явно, но могут вызывать исключение или ошибку при условиях, когда вы используете свойство, которое не определено для ресурса.

Проверьте go-cloudformation: https://github.com/crewjam/go-cloudformation

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