Як швидко та ефективно налагодити шаблони CloudFormation?


83

CloudFormation є потужним AWS пропозицію , яке дозволяє створювати програмні стеки АМС ресурсів, таких як веб - ярусі додатки, в високої продуктивності обчислювальних кластерів, або цілого набору додатків, за допомогою одного виклику API. Це надзвичайно потужний. Його використання, безсумнівно, вважається гарною практикою AWS, особливо коли воно поєднується з шеф-кухарем, ляльковим або хмарним ініціатором. Налагодження це приводить мене до пороку.

Візьмемо виробничий приклад: Шаблони кластерних фондів mongodb для мене не працюватимуть. Я не особливо знаю, чому. Я впевнений, що це щось просте, як майже завжди. Моя проблема не в тому, що я не можу зрозуміти, що не так. Це те, що стеку потрібно 20-20 хвилин, щоб вийти з ладу, а потім ще три-чотири хвилини, щоб видалити, припускаючи, що він взагалі правильно видаляє ресурси.

Чого мені не вистачає? Я знаю про --disable-rollbackпрапор і використовую його як кисень. Я давно навчився обгортати вихідні повідомлення cfn-signalі кидати їх, як баласт, з тонучого корабля. Як я можу зробити процес налагодження шаблону швидшим, або я застряг назавжди, помічаючи свої помилки через півгодини після того, як їх зробив?


3
Навіть помилки в JSON іноді не потрапляють до 10+ хвилин процесу збірки, оскільки він не помічає, що певний тип ресурсу не має певного імені атрибута, доки він не спробує запустити цей ресурс.
Eric Hammond

1
Мої улюблені в певному порядку: коли ви перемикаєте контексти ресурсів і стикаєтесь із майже-але-не-зовсім ідентичними атрибутами, забуваючи додати екрановану лапку всередину декларації скрипта користувача та щось спільне з VolumeAttachments, оскільки вони час від часу жодної причини.
Крістофер

1
+1 за згадку про "вимкнення автоматичного відкоту" - це було приголомшливо для отримання кращих повідомлень про помилки для
підстаків

1
Я виявив, що помилки в сегментах політики змусять такі речі, як BucketPolicy, назавжди застрявати на етапі CREATE - якщо щось застряє в CREATE, почніть там.
Ерік Норд,

Відповіді:


46

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


1
Це також доступно в уніфікованому cli docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
mp3foley

7
До речі, це є aws cloudformation validate-templateв нових інструментах CLI AWS.
Крістофер

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 байт.
Сіва

23

Ще один варіант, через рік, - абстрагувати ці шаблони до сторонніх бібліотек, таких як тропосфера . Ця бібліотека створює для вас корисне навантаження JSON і робить багато перевірок на цьому шляху. Це також вирішує проблему "Вау, управління 1000-рядковим файлом JSON, впевнений, це сумно" .


3
"Вау, управління 1000-рядковим файлом JSON впевнений, що це сумно" - напевно, саме тому було створено вкладені стеки? ;-) Хоча я і погоджуюсь - Тропосфера - якась!
YFP

11

Як я можу зробити процес налагодження шаблону швидшим, або я застряг назавжди, помічаючи свої помилки через півгодини після того, як їх зробив?

Ось кілька найкращих практичних рекомендацій, зосереджених конкретно на покращенні швидкості ітерацій складної розробки шаблону CloudFormation:

Використовуйте інструменти CloudFormation для перевірки шаблонів та стекових оновлень

AWS вже виклав це у своєму власному документі Best Practices , тому я не буду повторювати їх:

Суть цього кроку полягає у виявленні очевидних синтаксичних або логічних помилок перед тим, як фактично виконати створення / оновлення стека.

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

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

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

Створюйте складні стеки невеликими кроками

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

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

Відстежуйте хід оновлення стека

Обов’язково слідкуйте за ходом оновлення стека , переглядаючи події стека під час створення / оновлення. Це буде відправною точкою для налагодження подальших проблем з окремими ресурсами.


Про CloudFront і скільки часу це потрібно, чи знаєте ви про те, щоб стек був у готовому стані, не чекаючи, я хочу отримати результати, але не потрібно чекати, поки розподіл буде розгорнуто в моєму випадку
mcfedr


5

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

У моєму випадку з vim я працював набагато краще, коли зайняв деякий час встановлення плагінів синтаксису json, а також (нарешті) зрозумів методи складання для легкої навігації по великих файлах CF. Моя тепер пропонує помилки друку (коми, де їх не повинно бути тощо), а виділення кольором економить багато часу, даючи чіткі візуальні підказки.

Це може допомогти пом'якшити синтаксичні помилки, але логічні помилки в шаблоні краще виправляти іншими інструментами. Сподіваємось, одного разу на CF буде режим "попереднього перегляду".


1
Зовсім не смішна пропозиція. Я не впевнений, що міг би кодувати без підсвічування синтаксису.
Крістофер

2
є попередній перегляд для CFN, який відображає всі ресурси, які ви збираєтеся створити, а також вкаже, скільки коштуватиме ваш стек. Я використовую Java API, тому не впевнений, що він доступний в CLI, але спробуйте це: посилання
iGili

5

AWS CloudFormation Лінтера забезпечує додатковий статичний аналіз позамежногоaws cloudformation validate-template

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

На додаток до CLI, одним з найпопулярніших механізмів, який потрібно пам’ятати про запуск лінтера, є встановлення плагіна редактора, як розширення Visual Studio Code який працює під час кожного збереження файлу

Інші механізми, такі як попередні фіксації Git-хуків, описані тут

Знімок екрана прикладу розширення коду Visual Studio


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 у TREE. Це допоможе вам перевірити порядок елементів 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/

Це дозволить перевірити схему, а потім перевірити ще раз список правил і дозволить користувацькі правила. Я також дозволяю легку інтеграцію з інструментами розгортання.


0

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

Просто вставте шаблон (JSON) на панель «Шаблон», а потім клацніть на символ галочки, щоб перевірити шаблон. Будь-які помилки відображатимуться на панелі "Помилка".

Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.