Гид по технологиям

AWS CloudFormation — создание и управление стеками

• 9 min read • DevOps • Обновлено 18 Nov 2025
AWS CloudFormation — создание и управление стеками
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 автоматически создаёт и обновляет ресурсы в правильном порядке с учётом зависимостей.

Диаграмма: обзор AWS CloudFormation

Полезно помнить: CloudFormation декларативен — вы описываете состояние, а система решает, какие действия выполнить, чтобы привести окружение в нужное состояние.

Преимущества CloudFormation

  • Повторяемость: тот же шаблон можно применять в разных окружениях.
  • Версионирование: шаблоны можно хранить в Git и проследить историю изменений.
  • Автоматизация: интеграция с CI/CD позволяет полностью автоматизировать развёртывание.
  • Видимость изменений: Change Sets показывают, какие ресурсы будут добавлены/удалены/изменены.

Требования

  • Установленный AWS CLI (рекомендуется актуальная версия) и настроенный профиль с правами на CloudFormation и целевые сервисы.
  • Базовые знания об AWS (S3, IAM, EC2) и доступ к AWS Console.

  1. Скачайте демо-файлы (createstack.json, updatestack1.json, updatestack2.json) в локальную папку.

Скриншот: скачайте три файла из репозитория

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

Навигация: AWS Console → CloudFormation

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

Экран: кнопка 'Create stack'

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

Выбор опции шаблона: Template is ready / Upload a template file

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

Форма: введите имя стека 'htf'

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

Экран подтверждения: кнопка 'Create stack'

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

Статус стека: CREATE_IN_PROGRESS и логические ресурсы

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

Вкладка 'Resources' — физический ресурс S3 с ID htf-catpics-...

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

Консоль S3: созданный бакет htf-catpics-1roqn54xwm3of

Почему имена выглядят так: если вы не задаёте явный физический идентификатор (например, BucketName), CloudFormation генерирует уникальное имя по шаблону --. Это позволяет многократно применять один и тот же шаблон без конфликтов имён.


Быстрый разбор шаблона (what’s inside createstack.json)

Открывая файл createstack.json вы увидите раздел “Resources”: это список логических идентификаторов и типов ресурсов. Примерно это выглядит так:

{
  "Resources": {
    "catpics": {
      "Type": "AWS::S3::Bucket"
    }
  }
}
  • Logical ID: catpics — внутреннее имя в шаблоне.
  • Type: AWS::S3::Bucket — тип создаваемого ресурса.

Фрагмент JSON-шаблона createstack.json в редакторе


Обновления — ключевая тема. Часто нужно не только создавать, но и менять инфраструктуру. CloudFormation поддерживает три типа изменений для логических ресурсов:

  • Add — добавить новый ресурс.
  • Remove — удалить ресурс.
  • Modify — изменить существующий ресурс (может привести к перезапуску, прерыванию или замене).

Пример: добавление ресурса (updatestack1.json)

Откройте updatestack1.json — в нём добавлен новый логический ID dogpics (AWS::S3::Bucket). При обновлении стека через Upload a template file CloudFormation покажет Change Set с действием Add.

Фрагмент JSON-шаблона updatestack1.json: добавлен логический ресурс dogpics

Шаги:

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

Консоль CloudFormation: кнопка 'Update' для стека htf

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

Предпросмотр изменений: действие Add для логического ресурса dogpics

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

Консоль S3: создан бакет htf-dogpics-4qesklu84ugq

Добавление — самое безопасное действие, потому что существующие ресурсы не трогают.

Удаление ресурса (возврат к createstack.json)

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

Предпросмотр удаления ресурса dogpics при возврате к createstack.json

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

Консоль S3: бакет dogpics удалён

Событие стека: DELETE_COMPLETE для ресурса dogpics

Удаление — рискованная операция, особенно если ресурс содержит данные (например, S3-бакет), поэтому всегда проверяйте зависимости и резервные копии.

Модификация ресурса (updatestack2.json)

updatestack2.json не только добавляет dogpics, но и задаёт явное свойство BucketName для catpics: “catsareawesome-howtoforge”. Это пример модификации, которая может привести к одному из трёх исходов для физического ресурса:

  1. Обновление без прерывания (in-place update).
  2. Обновление с кратковременным прерыванием (например, рестарт EC2).
  3. Замена физического ресурса (Replacement) — удаление старого и создание нового.

Фрагмент updatestack2.json: свойство BucketName задано как 'catsareawesome-howtoforge'

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

Предпросмотр изменений: столбец Replacement = True при замене ресурса

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

Сообщение: требуется создание нового физического ресурса перед удалением старого

Консоль S3: создан новый бакет catsareawesome-howtoforge

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

Ошибка: попытка создать бакет с уже существующим именем


  • Не указывайте физические имена для глобальных ресурсов (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)

  1. Локально/в ветке подготовьте шаблон и запушьте в репозиторий.
  2. На staging выполните update-stack или создайте Change Set.
  3. Проверить Change Set: какие ресурсы Add/Modify/Remove; обратить внимание на Replacement = True.
  4. Если есть Replacement — подготовить бэкап и окно обслуживания.
  5. Применить Change Set в staging, провести smoke-тесты.
  6. При успешных тестах — запустить обновление в production по расписанию.
  7. Наблюдать за событиями стека и метриками (CloudWatch).
  8. Если критические ошибки — выполнить rollback (см. ниже).

Rollback / Runbook для отката

  • CloudFormation поддерживает автоматический rollback, если создание/обновление встречает ошибки (по умолчанию). Однако автоматический rollback не всегда корректно восстанавливает данные.
  • Ручной откат:
    1. Остановить автоматические конвейеры, которые могут писать в ресурсы.
    2. Восстановить из бэкапа (S3, EBS snapshot, RDS snapshot).
    3. Если нужно — пересоздать стек из предыдущего шаблона (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. При удалении стек удалит все ресурсы, входящие в него. Это поведение по дизайну — оно защищает от «забытого» инфраструктурного мусора, но требует осторожности.

Подтверждение удаления стека CloudFormation

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-тестирование шаблонов.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро