Что такое 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 для хранения.