AWS CloudFormation предоставляет разработчикам и системным администраторам простой способ создания и управления наборам ресурсов AWS.
Для CloudFormation можно использовать наборы готовых шаблонов, создать свои вручную или с помощью визуализации в CloudFormation Designer, либо использовать утилиты типа CloudFormer для создания шаблона из уже готовой инфрастуктуры.
Вам так же не придется беспокоится по поводу порядка выполнения создания сервисов AWS или вникать в тонкости зависимостей различных частей вашего проекта.
После того, как проект уже развернут — вы с легкостью можете модифицировать каждую службу и даже использовать контроль версий, как это происходит с кодом приложений.
Вы можете деплоить и обновлять ваш шаблон и связанные с ним коллекции (или «stack«) используя AWS Management Console, AWS Command Line Interface или API. Привсе этом вы оплачиваете только стоимость ресурсов — использование самого CloudFormation бесплатно.
Содержание
Шаблоны CloudFormation
Мы поднимем простой стек ресурсов для WordPress используя готовый шаблон от AWS, который создаст EC2 инстанс для самого блога и MySQL базу данных для него, используя сервис AWS RDS.
Кроме того — будет создана Security Group для управления доступом к этим ресурсам.
Каждый шаблон представляет собой JSON-файл, в котором описываются все ресурсы, необходимые для создания стека в AWS. В шаблоне WordPress в него входят:
AWSTemplateFormatVersion
— версия разметки шаблона (опционально);Description
— комментарии или описание шаблона (опционально);Parameters
— для создания и передачи переменных при создании стека из шаблона (опционально);Mappings
— для создания наборовkey { name: value }
, которые будут использоваться для определения параметров стека(опционально);Resources
— наиболее важная секция шаблона, описывающая собственно входящие в стек ресурсы AWS (обязательно);Outputs
— содержит заданные значения для использования в консоли AWS или возвращаемые стеком.
Каждый ресурс в шаблоне описывается отдельным блоком (секцией). Для примера возьмем описание ресурса AWS RDS, который будет использоваться далее при создании стека под WordPress:
"Resources" : { ... "DBInstance" : { "Type": "AWS::RDS::DBInstance", "Properties": { "DBName" : { "Ref" : "DBName" }, "Engine" : "MySQL", "MasterUsername" : { "Ref" : "DBUsername" }, "DBInstanceClass" : { "Ref" : "DBClass" }, "DBSecurityGroups" : [{ "Ref" : "DBSecurityGroup" }], "AllocatedStorage" : { "Ref" : "DBAllocatedStorage" }, "MasterUserPassword": { "Ref" : "DBPassword" } } },
А для передачи параметров этого ресурса — их можно описать в секции Parameters
. Тут можно указать имя пользователя, пароли, URL-ы и другие специфичные для каждого ресурса или стека настройки. Например, для ресурса AWS RDS блок его параметров выглядит так:
"Parameters" : { ... "DBClass" : { "Default" : "db.t1.micro", "Description" : "Database instance class", "Type" : "String", "AllowedValues" : [ "db.t1.micro", "db.t2.micro", "db.t2.small", "db.t2.medium", "db.m3.medium", "db.m3.large", "db.m3.xlarge", "db.m3.2xlarge" ], "ConstraintDescription" : "must select a valid database instance type." }, "DBName" : { "Default": "wordpress", "Description" : "The WordPress database name", "Type": "String", "MinLength": "1", "MaxLength": "64", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*", "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters." }, "DBUsername" : { "Default": "admin", "NoEcho": "true", "Description" : "The WordPress database admin account username", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*", "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters." }, "DBPassword" : { "Default": "password", "NoEcho": "true", "Description" : "The WordPress database admin account password", "Type": "String", "MinLength": "8", "MaxLength": "41", "AllowedPattern" : "[a-zA-Z0-9]*", "ConstraintDescription" : "must contain only alphanumeric characters." },
В описании ресурса RDS имеется запись, содержащая ссылку на этот параметр:
... "DBName" : { "Ref" : "DBName" }, ...
В результате вызова функциии Ref
— из секции Parameters
будет вызван блок, в котором указывается имя базы:
... "DBName" : { "Default": "wordpress", ...
Создание стека
Для авторизации на сервисах — CloudFormation использует поле KeyName из секции Resources
, которое должно содержать имя ключа по которому имеется доступ к реусрсам для их создания.
Создаем ключ:
Переходим в панель управления AWS > CloudFormation и жмем Create New Stack:
Указываем URL к файлу шаблона:
Можно просмотреть создаваемую инфраструктуру в CloudFormation Designer:
Нажимаем Next, и следующим шагом проверяем и при необходимости изменяем поля шаблона из секции Parameters
:
Далее можно добавить теги и уведомления:
Проверяем все настройки:
Тут же можно посмотреть примерную стоимость стека, нажав на Cost:
Если все ОК — жмем Create:
Ожидаем CREATE_COMPLETE для всех задач. Создание стека для WordPress заняло около 20 минут:
Переходим в Outputs, и находим URL нашего блога:
Переходим по нему, и продолжаем установку WP как обычно:
Описание всех команд для CloudFormation в AWS CLI можно найти тут>>>.
Например, просмотреть описание стека и его ресурсы можно с помощью describe-stack-resources
:
$ aws cloudformation describe-stack-resources --stack-name CloudFormationWPsetup > CloudFormationWPsetup.json $ head -5 CloudFormationWPsetup.json { "StackResources": [ { "StackName": "CloudFormationWPsetup", "ResourceType": "AWS::RDS::DBInstance",
А удалить созданный стек — с помощью delete-stack
:
$ aws cloudformation delete-stack --stack-name CloudFormationWPsetup
Готово.
У CloudFormation еще много замечательных возможностей по автоматизации, например — итеграция с Chef, о которых по возможности буду добавлять посты.
P.S. И конечно — вы можете пользоваться всеми инстансами, как обычно.
Находим EC2 бокс:
Его IP:
И проверяем:
$ chmod 400 CloudFormationWPsetup.pem $ ssh [email protected] -i CloudFormationWPsetup.pem The authenticity of host '52.19.1.208 (52.19.1.208)' can't be established. ECDSA key fingerprint is 03:14:3c:34:5b:6a:1a:7d:fb:78:27:c3:cb:1d:b2:e0. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '52.19.1.208' (ECDSA) to the list of known hosts. __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/ 39 package(s) needed for security, out of 203 available Run "sudo yum update" to apply all updates. Amazon Linux version 2015.09 is available. [ec2-user@ip-172-31-24-227 ~]$ sudo ls -l /var/www/ total 16 drwxr-xr-x 2 root root 4096 сер 13 2015 cgi-bin drwxr-xr-x 3 root root 4096 бер 10 18:20 error drwxr-xr-x 3 root root 4096 бер 10 18:20 html drwxr-xr-x 3 root root 4096 бер 10 18:20 icons [ec2-user@ip-172-31-24-227 ~]$ sudo ls -l /var/www/html/ total 4 drwxr-xr-x 5 apache apache 4096 бер 10 18:20 wordpress [ec2-user@ip-172-31-24-227 ~]$ sudo ls -l /var/www/html/wordpress/ total 176 -rw-r--r-- 1 apache apache 418 вер 25 2013 index.php -rw-r--r-- 1 apache apache 19930 січ 2 03:48 license.txt -rw-r--r-- 1 apache apache 7360 січ 9 12:56 readme.html -rw-r--r-- 1 apache apache 5035 жов 6 21:56 wp-activate.php drwxr-xr-x 9 apache apache 4096 лют 2 17:11 wp-admin -rw-r--r-- 1 apache apache 271 січ 8 2012 wp-blog-header.php -rw-r--r-- 1 apache apache 1369 жов 3 14:47 wp-comments-post.php -rw-r--r-- 1 apache apache 492 бер 10 18:20 wp-config.php -rw-r--r-- 1 apache apache 2853 гру 16 09:58 wp-config-sample.php drwxr-xr-x 4 apache apache 4096 лют 2 17:11 wp-content -rw-r--r-- 1 apache apache 3286 тра 24 2015 wp-cron.php drwxr-xr-x 16 apache apache 4096 лют 2 17:12 wp-includes -rw-r--r-- 1 apache apache 2380 жов 24 2013 wp-links-opml.php -rw-r--r-- 1 apache apache 3316 лис 5 23:59 wp-load.php -rw-r--r-- 1 apache apache 33770 гру 21 03:30 wp-login.php -rw-r--r-- 1 apache apache 7887 жов 6 14:07 wp-mail.php -rw-r--r-- 1 apache apache 13021 лис 20 07:24 wp-settings.php -rw-r--r-- 1 apache apache 28594 жов 30 08:52 wp-signup.php -rw-r--r-- 1 apache apache 4035 лис 30 2014 wp-trackback.php -rw-r--r-- 1 apache apache 3061 жов 2 22:46 xmlrpc.php