Что такое CloudFormation?

AWS CloudFormation — это сервис для управления инфраструктурой как кодом, который позволяет создавать и управлять AWS ресурсами с помощью JSON или YAML шаблонов. CloudFormation автоматизирует создание, обновление и удаление инфраструктуры, обеспечивая консистентность и воспроизводимость развертываний.

Основные возможности CloudFormation

  • Infrastructure as Code — декларативное описание инфраструктуры
  • Stack management — группировка ресурсов в логические стеки
  • Change sets — предварительный просмотр изменений
  • Rollback — автоматический откат при ошибках
  • Cross-stack references — ссылки между стеками
  • Nested stacks — модульная архитектура шаблонов

Основные компоненты CloudFormation

  • Templates — JSON/YAML файлы с описанием ресурсов
  • Stacks — экземпляры шаблонов с созданными ресурсами
  • Resources — AWS сервисы и компоненты
  • Parameters — входные параметры для настройки
  • Outputs — значения для экспорта в другие стеки
  • Conditions — условная логика создания ресурсов

Пример шаблона CloudFormation

  1# vpc-template.yaml
  2AWSTemplateFormatVersion: '2010-09-09'
  3Description: 'VPC with public and private subnets'
  4
  5Parameters:
  6  VpcCidr:
  7    Type: String
  8    Default: '10.0.0.0/16'
  9    Description: CIDR block for VPC
 10
 11  Environment:
 12    Type: String
 13    Default: 'dev'
 14    AllowedValues: ['dev', 'staging', 'prod']
 15    Description: Environment name
 16
 17Conditions:
 18  IsProduction: !Equals [!Ref Environment, 'prod']
 19
 20Resources:
 21  # VPC
 22  MyVPC:
 23    Type: AWS::EC2::VPC
 24    Properties:
 25      CidrBlock: !Ref VpcCidr
 26      EnableDnsHostnames: true
 27      EnableDnsSupport: true
 28      Tags:
 29        - Key: Name
 30          Value: !Sub '${Environment}-vpc'
 31
 32  # Internet Gateway
 33  InternetGateway:
 34    Type: AWS::EC2::InternetGateway
 35    Properties:
 36      Tags:
 37        - Key: Name
 38          Value: !Sub '${Environment}-igw'
 39
 40  # Attach IGW to VPC
 41  AttachGateway:
 42    Type: AWS::EC2::VPCGatewayAttachment
 43    Properties:
 44      VpcId: !Ref MyVPC
 45      InternetGatewayId: !Ref InternetGateway
 46
 47  # Public Subnet
 48  PublicSubnet:
 49    Type: AWS::EC2::Subnet
 50    Properties:
 51      VpcId: !Ref MyVPC
 52      CidrBlock: !Select [0, !Cidr [!Ref VpcCidr, 4, 8]]
 53      AvailabilityZone: !Select [0, !GetAZs '']
 54      MapPublicIpOnLaunch: true
 55      Tags:
 56        - Key: Name
 57          Value: !Sub '${Environment}-public-subnet'
 58
 59  # Private Subnet
 60  PrivateSubnet:
 61    Type: AWS::EC2::Subnet
 62    Properties:
 63      VpcId: !Ref MyVPC
 64      CidrBlock: !Select [1, !Cidr [!Ref VpcCidr, 4, 8]]
 65      AvailabilityZone: !Select [1, !GetAZs '']
 66      Tags:
 67        - Key: Name
 68          Value: !Sub '${Environment}-private-subnet'
 69
 70  # NAT Gateway (only for production)
 71  NATGateway:
 72    Type: AWS::EC2::NatGateway
 73    Condition: IsProduction
 74    Properties:
 75      AllocationId: !GetAtt EIPForNAT.AllocationId
 76      SubnetId: !Ref PublicSubnet
 77
 78  EIPForNAT:
 79    Type: AWS::EC2::EIP
 80    Condition: IsProduction
 81    Properties:
 82      Domain: vpc
 83
 84Outputs:
 85  VPCId:
 86    Description: VPC ID
 87    Value: !Ref MyVPC
 88    Export:
 89      Name: !Sub '${Environment}-vpc-id'
 90
 91  PublicSubnetId:
 92    Description: Public Subnet ID
 93    Value: !Ref PublicSubnet
 94    Export:
 95      Name: !Sub '${Environment}-public-subnet-id'
 96
 97  PrivateSubnetId:
 98    Description: Private Subnet ID
 99    Value: !Ref PrivateSubnet
100    Export:
101      Name: !Sub '${Environment}-private-subnet-id'

Основные команды AWS CLI

 1# Создание стека
 2aws cloudformation create-stack \
 3  --stack-name my-vpc-stack \
 4  --template-body file://vpc-template.yaml \
 5  --parameters ParameterKey=Environment,ParameterValue=dev
 6
 7# Обновление стека
 8aws cloudformation update-stack \
 9  --stack-name my-vpc-stack \
10  --template-body file://vpc-template.yaml \
11  --parameters ParameterKey=Environment,ParameterValue=staging
12
13# Создание change set
14aws cloudformation create-change-set \
15  --stack-name my-vpc-stack \
16  --change-set-name my-changes \
17  --template-body file://vpc-template.yaml
18
19# Применение change set
20aws cloudformation execute-change-set \
21  --change-set-name my-changes \
22  --stack-name my-vpc-stack
23
24# Удаление стека
25aws cloudformation delete-stack --stack-name my-vpc-stack
26
27# Просмотр статуса стека
28aws cloudformation describe-stacks --stack-name my-vpc-stack
29
30# Просмотр событий стека
31aws cloudformation describe-stack-events --stack-name my-vpc-stack

Nested Stacks пример

 1# master-template.yaml
 2AWSTemplateFormatVersion: '2010-09-09'
 3Description: 'Master stack with nested stacks'
 4
 5Parameters:
 6  Environment:
 7    Type: String
 8    Default: 'dev'
 9
10Resources:
11  NetworkStack:
12    Type: AWS::CloudFormation::Stack
13    Properties:
14      TemplateURL: https://my-bucket.s3.amazonaws.com/network-template.yaml
15      Parameters:
16        Environment: !Ref Environment
17
18  DatabaseStack:
19    Type: AWS::CloudFormation::Stack
20    Properties:
21      TemplateURL: https://my-bucket.s3.amazonaws.com/database-template.yaml
22      Parameters:
23        VPCId: !GetAtt NetworkStack.Outputs.VPCId
24        PrivateSubnetId: !GetAtt NetworkStack.Outputs.PrivateSubnetId
25        Environment: !Ref Environment
26
27  ApplicationStack:
28    Type: AWS::CloudFormation::Stack
29    DependsOn: DatabaseStack
30    Properties:
31      TemplateURL: https://my-bucket.s3.amazonaws.com/app-template.yaml
32      Parameters:
33        VPCId: !GetAtt NetworkStack.Outputs.VPCId
34        PublicSubnetId: !GetAtt NetworkStack.Outputs.PublicSubnetId
35        DatabaseEndpoint: !GetAtt DatabaseStack.Outputs.DatabaseEndpoint

Когда использовать CloudFormation

  • Управление AWS инфраструктурой как кодом
  • Автоматизация создания сред разработки/тестирования
  • Обеспечение консистентности между окружениями
  • Disaster recovery и backup стратегии
  • Compliance и аудит требования
  • Масштабирование инфраструктуры по шаблонам

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

  • Нативная интеграция с AWS сервисами
  • Автоматическое управление зависимостями
  • Бесплатный сервис (платишь только за ресурсы)
  • Поддержка rollback при ошибках
  • Change sets для безопасных обновлений
  • Cross-stack references для модульности

Ограничения CloudFormation

  • Работает только с AWS (vendor lock-in)
  • Ограничения на размер шаблонов (51,200 байт)
  • Не все AWS сервисы поддерживаются сразу
  • Сложность отладки больших шаблонов
  • Ограниченная логика по сравнению с программными языками

CloudFormation vs Terraform

  • Провайдеры — CloudFormation только AWS, Terraform multi-cloud
  • Синтаксис — CloudFormation JSON/YAML, Terraform HCL
  • State — CloudFormation управляет автоматически, Terraform требует state файлы
  • Стоимость — CloudFormation бесплатный, Terraform Cloud платный
  • Поддержка — CloudFormation от AWS, Terraform от HashiCorp

Best Practices

  • Используй параметры для переиспользования шаблонов
  • Создавай модульные шаблоны с nested stacks
  • Используй change sets для проверки изменений
  • Версионируй шаблоны в системе контроля версий
  • Добавляй теги для всех ресурсов
  • Используй условия для разных окружений
  • Настрой мониторинг и алерты для стеков

FAQ

Подходит ли CloudFormation для продакшена?

Да, CloudFormation широко используется в production средах и является рекомендуемым AWS способом управления инфраструктурой как кодом.

Можно ли управлять существующими ресурсами?

Да, можно импортировать существующие AWS ресурсы в CloudFormation стеки, но это требует осторожности и планирования.

Как обеспечить безопасность шаблонов?

Используй AWS Secrets Manager или Parameter Store для секретов, настрой правильные IAM роли, версионируй шаблоны и используй encrypted S3 для хранения.