AWS CloudFormation — создание и управление стеками
О чём эта статья
- Что такое CloudFormation и какие преимущества даёт
- Как шаг за шагом создать стек с S3 (демо-файлы: createstack.json, updatestack1.json, updatestack2.json)
- Как безопасно обновлять стек: добавление, удаление, модификация ресурсов
- Как удалить стек и на что обратить внимание
- Практические чеклисты, SOP, план отката, матрица рисков и тест-кейсы
Important: все команды и примеры ориентированы на AWS Console и AWS CLI; до работы убедитесь, что у вас есть права для создания/удаления ресурсов.
Краткие определения (1 строка)
- Шаблон (template): декларативный JSON/YAML-файл, описывающий ресурсы и их связи.
- Стек (stack): инстанс шаблона — набор физических ресурсов, созданных CloudFormation.
- Логический ID (Logical ID): имя ресурса внутри шаблона.
- Физический ID (Physical ID): реальный идентификатор ресурса в AWS (например, имя S3-бакета).
Введение: зачем использовать CloudFormation
CloudFormation даёт возможность описывать инфраструктуру как код (IaC). Это повышает воспроизводимость, уменьшает ручные ошибки и упрощает процесс развёртывания и поддержки окружений. Шаблон — единый источник правды, а CloudFormation автоматически создаёт и обновляет ресурсы в правильном порядке с учётом зависимостей.

Полезно помнить: CloudFormation декларативен — вы описываете состояние, а система решает, какие действия выполнить, чтобы привести окружение в нужное состояние.
Преимущества CloudFormation
- Повторяемость: тот же шаблон можно применять в разных окружениях.
- Версионирование: шаблоны можно хранить в Git и проследить историю изменений.
- Автоматизация: интеграция с CI/CD позволяет полностью автоматизировать развёртывание.
- Видимость изменений: Change Sets показывают, какие ресурсы будут добавлены/удалены/изменены.
Требования
- Установленный AWS CLI (рекомендуется актуальная версия) и настроенный профиль с правами на CloudFormation и целевые сервисы.
- Базовые знания об AWS (S3, IAM, EC2) и доступ к AWS Console.
- Скачайте демо-файлы (createstack.json, updatestack1.json, updatestack2.json) в локальную папку.

- Откройте AWS Console -> CloudFormation.

- Нажмите Create stack -> With new resources.

- Выберите Template is ready -> Upload a template file -> Choose file и укажите createstack.json.

- Присвойте стеку имя, например htf, и продолжите.

- Подтвердите параметры по умолчанию и нажмите Create stack.

CloudFormation начнёт выполнение и покажет статус CREATE_IN_PROGRESS. Это обычно занимает несколько минут.

Откройте вкладку Resources, чтобы увидеть создаваемые физические ресурсы (например, S3-бакет htf-catpics-…).

Консоль S3 покажет созданный бакет с шаблонным именем: stackname-logicalid-random.

Почему имена выглядят так: если вы не задаёте явный физический идентификатор (например, BucketName), CloudFormation генерирует уникальное имя по шаблону
Быстрый разбор шаблона (what’s inside createstack.json)
Открывая файл createstack.json вы увидите раздел “Resources”: это список логических идентификаторов и типов ресурсов. Примерно это выглядит так:
{
"Resources": {
"catpics": {
"Type": "AWS::S3::Bucket"
}
}
}- Logical ID: catpics — внутреннее имя в шаблоне.
- Type: AWS::S3::Bucket — тип создаваемого ресурса.

Обновления — ключевая тема. Часто нужно не только создавать, но и менять инфраструктуру. CloudFormation поддерживает три типа изменений для логических ресурсов:
- Add — добавить новый ресурс.
- Remove — удалить ресурс.
- Modify — изменить существующий ресурс (может привести к перезапуску, прерыванию или замене).
Пример: добавление ресурса (updatestack1.json)
Откройте updatestack1.json — в нём добавлен новый логический ID dogpics (AWS::S3::Bucket). При обновлении стека через Upload a template file CloudFormation покажет Change Set с действием Add.

Шаги:
- Выберите стек htf -> Update -> Replace current template -> загрузите updatestack1.json.

- Пройдите далее и подтвердите Update stack. В Change Set preview увидите Add для логического ресурса dogpics.

- После завершения обновления новый бакет появится в S3 с именем htf-dogpics-
.

Добавление — самое безопасное действие, потому что существующие ресурсы не трогают.
Удаление ресурса (возврат к createstack.json)
Чтобы удалить dogpics, обновите стек обратно, загрузив createstack.json. Change Set покажет действие Remove для dogpics и его физического ресурса — бакет будет удалён.

После удаления бакет исчезнет из S3 и в событиях стека появится DELETE_COMPLETE.


Удаление — рискованная операция, особенно если ресурс содержит данные (например, S3-бакет), поэтому всегда проверяйте зависимости и резервные копии.
Модификация ресурса (updatestack2.json)
updatestack2.json не только добавляет dogpics, но и задаёт явное свойство BucketName для catpics: “catsareawesome-howtoforge”. Это пример модификации, которая может привести к одному из трёх исходов для физического ресурса:
- Обновление без прерывания (in-place update).
- Обновление с кратковременным прерыванием (например, рестарт EC2).
- Замена физического ресурса (Replacement) — удаление старого и создание нового.

При обновлении шаблона CloudFormation предупреждает, если потребуется Replacement — в Change Set появится Replacement = True.

В результате старый бакет будет удалён, а новый создан с указанным именем.


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

- Не указывайте физические имена для глобальных ресурсов (S3) в шаблонах, если хотите повторно использовать шаблон.
- Всегда проверяйте Change Set перед применением изменений.
- Для критичных производственных обновлений используйте стек в отдельном окружении и тестируйте апдейты на staging.
- Используйте параметры (Parameters) и Outputs, чтобы шаблоны были гибкими и совместимыми с CI/CD.
- Используйте функции Fn::GetAtt, Ref и встроенные трансформации (например, AWS::Include, Transform).
Important: резервные копии данных перед удалением/заменой обязательны.
Примеры CLI-команд (полезно для CI/CD)
- Создать стек (из файла template.json):
aws cloudformation create-stack --stack-name htf --template-body file://createstack.json --capabilities CAPABILITY_NAMED_IAM- Обновить стек (загрузка нового шаблона):
aws cloudformation update-stack --stack-name htf --template-body file://updatestack1.json --capabilities CAPABILITY_NAMED_IAM- Удалить стек:
aws cloudformation delete-stack --stack-name htf- Создать Change Set и посмотреть его до применения:
aws cloudformation create-change-set --stack-name htf --change-set-name cs1 --template-body file://updatestack2.json --capabilities CAPABILITY_NAMED_IAM
aws cloudformation describe-change-set --stack-name htf --change-set-name cs1Эти команды полезны для автоматизации в CI/CD (Jenkins, GitHub Actions, GitLab CI).
Риски при обновлениях и как их снижать
Матрица рисков (описательно):
- Низкий риск: добавление новых ресурсов (Add). Меры: проверить зависимости.
- Средний риск: удаление ресурсов (Remove). Меры: сделать бэкап данных, убедиться, что ресурсы не используются.
- Высокий риск: модификация параметров, приводящая к Replacement. Меры: тестирование в staging, подготовка rollback-плана.
Митигирующие действия:
- Принудительные бэкапы (S3 versioning, снимки EBS).
- Оповещения и окно обслуживания для production.
- Отдельный процесс review для Change Set.
Playbook: безопасное обновление стека (SOP)
- Локально/в ветке подготовьте шаблон и запушьте в репозиторий.
- На staging выполните update-stack или создайте Change Set.
- Проверить Change Set: какие ресурсы Add/Modify/Remove; обратить внимание на Replacement = True.
- Если есть Replacement — подготовить бэкап и окно обслуживания.
- Применить Change Set в staging, провести smoke-тесты.
- При успешных тестах — запустить обновление в production по расписанию.
- Наблюдать за событиями стека и метриками (CloudWatch).
- Если критические ошибки — выполнить rollback (см. ниже).
Rollback / Runbook для отката
- CloudFormation поддерживает автоматический rollback, если создание/обновление встречает ошибки (по умолчанию). Однако автоматический rollback не всегда корректно восстанавливает данные.
- Ручной откат:
- Остановить автоматические конвейеры, которые могут писать в ресурсы.
- Восстановить из бэкапа (S3, EBS snapshot, RDS snapshot).
- Если нужно — пересоздать стек из предыдущего шаблона (create-stack/replace-template).
Тест-кейсы и критерии приёмки
Критерии приёмки (пример для S3-стека):
- При запуске createstack.json создаётся бакет с логическим ID catpics.
- При применении updatestack1.json добавляется бакет dogpics, catpics остаётся.
- При возврате к createstack.json бакет dogpics удаляется.
- При применении updatestack2.json catpics меняет имя (Replacement) и доступ к данным корректно объяснён (данные перемещены/восстановлены в результате процедуры).
Тест-кейсы:
- Smoke-тест: доступ к S3 через консоль и aws cli list-buckets.
- Интеграционный: загрузка и чтение тестовых объектов в бакет.
- Нагрузочный: проверка time-to-create при массовом создании объектов (опционально).
Часто используемые шаблонные конструкции (cheat sheet)
- Parameters: делают шаблон настраиваемым.
- Mappings: статические соответствия (например, AMI по региону).
- Conditions: условное создание ресурсов.
- Outputs: экспорт значений между стеками (Fn::ImportValue / Export).
- Intrinsic functions: Ref, Fn::GetAtt, Fn::Join и т.д.
Пример простого шаблона (JSON) для S3-bucket:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Пример шаблона: один S3-бакет",
"Resources": {
"catpics": {
"Type": "AWS::S3::Bucket",
"Properties": {}
}
},
"Outputs": {
"BucketName": {
"Value": {"Ref": "catpics"},
"Description": "Имя созданного бакета"
}
}
}(Этот шаблон демонстрационный; ваш createstack.json из урока похож по структуре.)
Ментальные модели и эвристики
- Декларативность: думайте о конечном состоянии, а не о пошаговых командах.
- Идем от безопасного к рискованному: сначала Add, потом Modify, затем Remove.
- Минимизируйте явные физические имена для глобально-уникальных ресурсов.
- Всегда просматривайте Change Set до применения.
Decision tree для принятия решения об обновлении (Mermaid)
flowchart TD
A[Есть обновление шаблона?] --> B{Change Set показывает изменения}
B -->|Только Add| C[Применять — низкий риск]
B -->|Есть Remove| D[Сделать бэкап -> Применять]
B -->|Есть Modify| E{Replacement?}
E -->|Нет| F[Проверить downtime -> Применять]
E -->|Да| G[Назначить окно обслуживания, сделать бэкап -> Применять]
C --> H[Мониторинг после обновления]
D --> H
F --> H
G --> HРольные чек-листы
DevOps инженер:
- Написать шаблон и unit-тесты для него.
- Проверить Change Set.
- Настроить бэкап данных при необходимости.
Системный администратор:
- Подготовить окно обслуживания.
- Проинформировать заинтересованные команды.
Владелец продукта:
- Утвердить изменения, если есть риск прерывания.
Совместимость, миграция и заметки по версиям
- CloudFormation поддерживает как JSON, так и YAML.
- При переносе шаблонов между аккаунтами/регионами учитывайте региональные различия (например, AMI IDs).
- Если шаблон зависит от сторонних ресурсов, удостоверитесь в их доступности в целевом аккаунте.
Удаление стека
Чтобы удалить стек, в CloudFormation выберите стек и нажмите Delete. При удалении стек удалит все ресурсы, входящие в него. Это поведение по дизайну — оно защищает от «забытого» инфраструктурного мусора, но требует осторожности.

Important: если ресурс помечен как Retain, CloudFormation при удалении стека не удалит этот ресурс — проверьте опции DeletionPolicy в шаблоне.
Примеры ошибок и когда CloudFormation «не подойдёт»
- Если вам нужен строгий пошаговый imperative-процесс (пошаговые миграции баз данных с ручным вмешательством), иногда Terraform или специализированные миграционные скрипты дают больше контроля.
- Если шаблон пытается создать ресурс с глобально уникальным именем (S3) и имя уже занято — создание упадёт.
- CloudFormation не хранит содержимое ресурсов — только их конфигурацию. Для данных нужен бэкап.
Локальные особенности и советы для российского рынка
- При работе с AMI учитывайте, что идентификаторы образов специфичны для региона: выбирайте AMI по карте регионов.
- Следите за политиками безопасности и шифрованием данных (S3 Encryption, KMS), особенно при работе с персональными данными.
Краткое резюме
- CloudFormation позволяет безопасно и последовательно управлять инфраструктурой как код.
- Всегда проверяйте Change Set и понимайте, приведёт ли обновление к замене ресурсов.
- Используйте параметры, Outputs и бэкапы — это снизит риск при обновлениях.
- Разработайте SOP для обновлений и отката, включающий тестирование в staging и окно обслуживания.
Спасибо за чтение! Если у вас есть конкретные вопросы по шаблонам, безопасности или CI/CD-процессам с CloudFormation — оставьте комментарий.
Дополнительно: полезные ссылки и команды
- Команды AWS CLI для CloudFormation: create-stack, update-stack, delete-stack, create-change-set, describe-change-set.
- Рекомендуется хранить шаблоны в Git и использовать проверки шаблонов (lint) и unit-тестирование шаблонов.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента