AWS: CloudFormation

Автор: | 11/03/2016
 

aws-logo-square-02AWS 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, которое должно содержать имя ключа по которому имеется доступ к реусрсам для их создания.

Создаем ключ:

cloud_formation_guide_1

Переходим в панель управления AWS > CloudFormation и жмем Create New Stack:

cloud_formation_guide_2

Указываем URL к файлу шаблона:

cloud_formation_guide_3

Можно просмотреть создаваемую инфраструктуру в CloudFormation Designer:

cloud_formation_guide_4

Нажимаем Next, и следующим шагом проверяем и при необходимости изменяем поля шаблона из секции Parameters:

cloud_formation_guide_5

Далее можно добавить теги и уведомления:

cloud_formation_guide_6

Проверяем все настройки:

cloud_formation_guide_7

Тут же можно посмотреть примерную стоимость стека, нажав на Cost:

cloud_formation_guide_8

Если все ОК – жмем Create:

cloud_formation_guide_9

Ожидаем CREATE_COMPLETE для всех задач. Создание стека для WordPress заняло около 20 минут:

cloud_formation_guide_10

Переходим в Outputs, и находим URL нашего блога:

cloud_formation_guide_11

Переходим по нему, и продолжаем установку WP как обычно:

cloud_formation_guide_12

cloud_formation_guide_13

Описание всех команд для 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

cloud_formation_guide_14

 

Готово.

У CloudFormation еще много замечательных возможностей по автоматизации, например – итеграция с Chef, о которых по возможности буду добавлять посты.

P.S. И конечно – вы можете пользоваться всеми инстансами, как обычно.

Находим EC2 бокс:

cloud_formation_guide_15

Его IP:

cloud_formation_guide_16

И проверяем:

$ 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