Униформа облаков AWS: один большой файл шаблона или много маленьких?

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

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

Кто-нибудь пытался объединить свои файлы шаблонов во время выполнения, чтобы их обрабатывали как один большой, или это сложно поддерживать?

Ответ 1

Нет простого ответа, но нужно помнить несколько важных моментов:

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

  • существует ограничение в CloudFormation относительно количества ресурсов (200 ресурсов на стек). Это очень легко достичь, если у вас есть правила SecurityGroupIngress/Egress, например. Не уверен, что этот предел может быть обновлен поддержкой.

  • с другой стороны, параметры подачи вложенных стеков могут приводить к большим файлам, у которых не так много информации... рассмотрим это: вам нужно передать все параметры вызову, внутри вложенного стека, который вы должны снова объявите все параметры. Два уровня гнездования - настоящая боль, поверьте!

Самое лучшее решение, которое я нашел, это использование интерфейса шаблона CloudFormation (я использую troposphere - в python), так что вы действительно описывают инфраструктуру как код, со всеми преимуществами кода (циклы, условные выражения, внешний файл, функции), и в конце концов у вас есть подлинный шаблон CloudFormation.

Я смог написать огромные шаблоны CloudFormation с этой системой, без кошмаров обслуживания...

Ответ 2

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

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

Была проведена сессия в Re: Invent 2014 с рядом полезных советов: APP304 - Рекомендации по использованию CloudFormation AWS. Slides/Видео

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

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

Ответ 3

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