Как я могу быстро и эффективно отлаживать шаблоны CloudFormation?

83

CloudFormation является мощным AWS предложение , которое позволяет создавать программные стеки АМС ресурсов, таких как веб - ярусе приложения, в высокой производительности вычислительных кластеров, или целого набора приложений, с помощью одного вызова API. Это невероятно мощно. Его использование, безусловно, считается хорошей практикой AWS, особенно в сочетании с Chef, Puppet или cloud-init. Отладка сводит меня к порокам.

Возьмем производственный пример: склад стандартные шаблоны кластеров mongodb мне не подходят . Я особо не знаю почему. Я уверен, что это что-то простое, как и почти всегда. Моя проблема не в том, что я не могу понять, что случилось. Дело в том, что стеку требуется от 20 до 30 минут, чтобы выйти из строя, а затем еще три или четыре минуты для удаления, при условии, что он вообще удаляет ресурсы правильно.

Что мне не хватает? Я знаю о --disable-rollbackфлаге и использую его как кислород. Я давно научился оборачивать сообщения о выходе cfn-signalи сбрасывать их, как балласт с тонущего корабля. Как я могу ускорить процесс отладки шаблона, или я застрял навсегда, замечая свои ошибки через полчаса после их совершения?

Кристофер
источник
3
Даже опечатки в JSON иногда не обнаруживаются до 10+ минут в процессе сборки, поскольку он не замечает, что конкретный тип ресурса не имеет определенного имени атрибута, пока он не попытается запустить этот ресурс.
Эрик Хаммонд,
1
Мои фавориты в произвольном порядке: когда вы переключаете контексты ресурсов и сталкиваетесь с почти идентичными, но не совсем идентичными атрибутами, забывая добавить экранированную кавычку внутри объявления пользовательского скрипта, и все, что связано с VolumeAttachments, поскольку они иногда терпят неудачу для вообще без причины.
Кристофер
1
+1 за упоминание «отключения автоматического отката» - это было здорово для улучшения сообщений об ошибках для подзапаков
izikandrw
1
Я обнаружил, что ошибки в сегментах политики приведут к тому, что такие вещи, как BucketPolicy, навсегда застрянут на этапе CREATE - если что-то застряло в CREATE, начните с него.
Эрик Норд

Ответы:

46

Используйте aws cloudformation validate-templateкоманду в инструменте AWS CLI. Он только проверяет, является ли ваш шаблон действительным JSON или YAML, а не правильность ваших ключей и значений (например, не проверяет опечатки в ключах)

Лучано Иссо
источник
1
Это также доступно в едином клиенте docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
mp3foley
7
Кстати, это есть aws cloudformation validate-templateв новых инструментах AWS CLI.
Кристофер
8
Для всех, кто сталкивается с этим вопросом в 2017+, это сейчас aws cloudformation validate-template, и он только проверяет, является ли ваш шаблон допустимым JSON или YAML, а не правильность ваших ключей и значений (например, не проверяет опечатки в ключах).
Дэниел Кац
1
По какой-то причине кажется, что игнорируется длина строки, например Property validation failure: [Length of value {XYZ} for property {/RepositoryDescription} is greater than maximum allowed length {100}]. Согласно validate-templateкоманде, это не было проблемой, но пользовательский интерфейс возвращает эту ошибку.
030
2
Если этот инструмент выполняет только проверку формата файла, этого не происходит; jsonlint или yamllint достаточно? Также этот инструмент имеет ограничение на размер файла 51 200 байт.
Siva
23

Другой вариант, год спустя, - абстрагировать эти шаблоны в стороннюю библиотеку, такую ​​как тропосфера . Эта библиотека создает для вас полезную нагрузку JSON и попутно выполняет множество проверок. Это также решает проблему «Ух ты, управление файлом JSON из 1000 строк, конечно, печально» .

Кристофер
источник
3
«Ух ты, управлять файлом JSON из 1000 строк, конечно, это грустно» - наверняка поэтому были созданы вложенные стеки? ;-) Хотя я согласен - Тропосфера ужасна!
YFP
11

Как я могу ускорить процесс отладки шаблона, или я застрял навсегда, замечая свои ошибки через полчаса после их совершения?

Вот несколько практических советов, специально посвященных повышению скорости итераций разработки сложных шаблонов CloudFormation:

Используйте инструменты CloudFormation для проверки шаблонов и обновлений стека

AWS уже изложил их в своем собственном документе Best Practices , поэтому я не буду их повторять:

Цель этого шага - выявить очевидные синтаксические или логические ошибки перед фактическим выполнением создания / обновления стека.

Тестовые ресурсы изолированно

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

  • Если вы разрабатываете или используете какие-либо сторонние пользовательские ресурсы, напишите модульные тесты с использованием соответствующих библиотек для языковой платформы, чтобы убедиться, что логика приложения работает должным образом во всех случаях использования.
  • Имейте в виду, что время, необходимое для создания / обновления / удаления отдельного ресурса, может сильно различаться между типами ресурсов в зависимости от поведения базовых вызовов API. Например, для создания / обновления / удаления сложного AWS::CloudFront::Distributionресурса может потребоваться 30-60 минут , в то время какAWS::EC2::SecurityGroup обновления - за секунды.
  • Отдельные ресурсы могут иметь ошибки / проблемы / ограничения в их реализации, которые намного проще отлаживать и разрабатывать обходные пути при тестировании изолированно, а не в рамках гораздо большего стека. Помните об ограничениях, например об ограничениях сервисов AWS в зависимости от индивидуальных настроек вашего аккаунта AWS или о доступности сервисов в регионе в зависимости от региона, в котором вы создаете свой стек.

Создавайте сложные стеки небольшими приращениями

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

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

Следите за ходом обновления стека

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

Wjordan
источник
О CloudFront и о том, сколько времени это займет, знаете ли вы, что стек должен быть в завершенном состоянии, не дожидаясь, я хочу получить выходные данные, но не нужно ждать развертывания дистрибутива в моем случае
mcfedr
9

Вы смотрели на редактор шаблонов AWS CloudFormation, который включен в AWS Toolkit для Eclipse ? У него есть подсветка синтаксиса, завершение операторов и развертывание в AWS CloudFormation.

Вэйд Матвеенко
источник
7
«AWS Toolkit для Visual Studio» был для меня незаменим.
Эд Норрис
5

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

В моем случае с vim я показал себя намного лучше, когда я потратил некоторое время на установку плагинов синтаксиса json, а также (наконец) понял методы сворачивания для легкой навигации по большим файлам CF. Мой теперь предлагает опечатки (запятые там, где их не должно быть и т. Д.), А цветное выделение экономит много времени, давая четкие визуальные подсказки.

Это может помочь уменьшить синтаксические ошибки, но логические ошибки в шаблоне лучше исправлять другими инструментами. Надеюсь, что однажды на CF появится режим «превью».

Aitch
источник
1
Совсем не смешное предложение. Я не уверен, что смогу писать код без подсветки синтаксиса.
Christopher
2
есть предварительный просмотр для CFN, который показывает все ресурсы, которые вы собираетесь создать, а также сообщает вам, сколько будет стоить ваш стек. Я использую Java API, поэтому не уверен, что он доступен в CLI, но попробуйте следующее: ссылка
iGili
5

ЛИНТЕР AWS CloudFormation обеспечивает дополнительный статический анализ запредельногоaws cloudformation validate-template

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

Помимо интерфейса командной строки, одним из самых популярных механизмов запуска линтера является установка плагина редактора, такого как расширение Visual Studio Code. которое запускается при каждом сохранении файла.

Другие механизмы, такие как перехватчики Git перед фиксацией, описаны здесь.

Пример снимка экрана с расширением Visual Studio Code

Пэт Майрон
источник
4

Для IDE JetBrains (IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion Gogland DataGrip Rider Android Studio) в AWS CloudFormation есть плагин, который поддерживает глубокую проверку шаблонов JSON и YAML CFN.

Джейсон
источник
2

Если вы имеете дело с машинами EC2, то я бы порекомендовал вам войти на машину EC2 и закрыть файл boot.log (/var/log/boot.log в RHEL6 / Centos). Этот файл обновляется вместе со всеми вашими действиями оболочки (такими как: установка, загрузка файлов, копирование файлов и т. Д.).

Кроме того, используйте редакторы, например http://www.jsoneditoronline.org/, чтобы получить представление JSON в виде ДЕРЕВА. Это поможет вам проверить порядок элементов JSON.

И когда вы обновляете файлы, всегда используйте такие инструменты, как http://www.git-tower.com/blog/diff-tools-mac/ или настоящую систему контроля версий, чтобы убедиться, что вы случайно не изменили что-то, что может сломать ваш скрипт.

ЧайтаньяБхатт
источник
1

Недавняя новая функция, добавленная в Cloudformation в декабре прошлого года, заключалась в добавлении дополнительных типов параметров . Эти новые типы позволяют вашим шаблонам выполнять более строгую проверку данных, а также могут работать без сбоев при создании ресурсов и вложенных стеков Cloudformation. У вас также есть возможность предоставлять более удобные для человека настраиваемые сообщения об ошибках, когда недопустимые значения передаются с использованием нового атрибута ConstraintDescription .

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

Например:

"Parameters" : {
  "SingleGroup": { "Type": "AWS::EC2::SecurityGroup::Id", ...},
  "GroupList": {"Type": "List<AWS::EC2::SecurityGroup::Id>", ...}
}
Микелакс
источник
1

Пожалуйста, проверьте мой валидатор облачной информации на https://pypi.org/project/cloudformation-validator/

Это проверит схему, а затем снова проверит список правил и разрешит настраиваемые правила. Я также допускаю простую интеграцию с инструментами развертывания.

WillRubel
источник
0

Вы также можете использовать CloudFormation Designer, доступный на Amazon здесь: https://console.aws.amazon.com/cloudformation/designer/home?region=us-east-1

Просто вставьте свой шаблон (JSON) в область «Шаблон», а затем щелкните значок галочки, чтобы подтвердить свой шаблон. Все ошибки будут отображаться на панели «Ошибка».

Надеюсь это поможет.

VictorPro
источник