Формируем облако или просто о CloudFormation

Часто когда в IT стартует новый проект, то он проходит несколько фаз, например таких:

  1. Быстренько сделать прототип
  2. Сделать окружение для отладки: DEV, STAGING или как-то так
  3. Сделать окружение которое будет видно конечному пользователю: PRODUCTION

И по этим этапам проходит инфраструктурная поддержка проекта. Благо теперь есть облака и намного легче управлять мощностью виртуальных серверов и их количеством.

Осталось только придумать как это все автоматизировать и обеспечить удобные способы повторения (расширения) и управляемости инфраструктурой.

Далее будет описан один из способов который позволяет разворачивать целые инфраструктуры серверов и всего что их окружает применительно к Amazon AWS

Для начала пройдемся по способам создания инфраструктуры (почти по этапам проекта):

  1. Сначала быстрое накликивание мышкой ключей, секюрити груп, инстансов, дисков, балансеров и т.д.
  2. Далее уже все более-менее известно: нужно то-то и то-то и в таких-то количествах, но для всех: для тестеров одно окружение, для программеров другое, и еще для кого-то третье. Все инфраструктуры повторяют одна другую и похожи как две капли воды, но постоянно кликать уже надоест к этому времени. Да и не модно это 🙂 !
    Начинаем ставить всякие command line Amazon API  и писать скрипты для разворачивания серверов, дисков и т.д.
    Но блин, чего-то не хватает в этой жизни. Особенно напрягает то что для каждого типа ресурса которым нужно управлять нужно ставить свое API
    Значит переходим к следующему пункту.
  3. Ребята из Amazon тоже не сидят на месте и уже довольно давно придумали сервис который позволяет очень удобно управлять ресурсами облака, а именно: CloudFormation.

Что же может AWS CloudFormation?

Если вкратце, то: управлять всеми теми же ресурсами Amazon AWS, но в более приятной, централизованной форме.

Как происходит разворачивание инфраструктуры с помощью сервиса CloudFormation? – Пишем текстовый файл в json формате (да, это небольшая ложка дегтя, но придется проглотить и освоить 🙂 ) и скармливаем этот файлик сервису CloudFormation.

Как скормить файлик? – Да через Amazon AWS консоль или через command line Amazon API

И все.
Через некоторое время (зависит от количества ресурсов которые Вы описали в вашем файлике) Вы имеете полностью сформированную и запущенную инфраструктуру: сервера, диски, IP адреса, балансеры, сервисы баз данных, записи в DNS в конце концов.

В общем, все просто.
Осталось только разобраться как сделать этот файлик (темплейт), который можно скормить сервису CloudFormation.

Темплейт может включать в себя:

  1. Версию формата темплейта
  2. Описание темплейта (необязательно)
  3. Список параметров темплейта (не обязательно)
  4. Список который используется для поиска статических конфигурационных параметров, например, регион Амазона, идентификатор AMI, и т.д. (не обязательно)
  5. Список Amazon AWS ресурсов которые Вы будете использовать: ec2 инстансы, диски, балансеры, RDS инстансы и т.д.
  6. Описание вывода от работы темплейта (не обязательно).

Рассмотрим анатомию простого темплейта который делает один ec2 инстанс, с одним диском и Elastic IP адресом

Инстанс будет создан с Linux внутри, после создания достучатся к нему можно будет с помощью ssh.

Вот наш формат темплейта:

"AWSTemplateFormatVersion" : "2010-09-09"

Это описание темплейта:

"Description" : "Example of CloudFormation template by Oleksandr Shablovskyy, site: http://www.asha.com.ua, e-mail: smyjob@rambler.ru"

Вот так можно определить параметры ( где стартовать инстанс, какие ключи ssh  нужно использовать для входа на инстанс, групу которая описывает файрволл для инстанса):

"Parameters" : {

"AvailabilityZone" : {

"Description" : "Name of an availability zone to create instance",

"Default" : "us-east-1c",

"Type" : "String"

},

"KeyName" : {

"Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance",

"Default" : "access-keys",

"Type" : "String"

},

"InstanceSecurityGroup" : {

"Description" : "Name of an existing security group",

"Default" : "cloud-sg",

"Type" : "String"

}

}

Тут видно статические конфигурационные параметры, в данном случае это какие AMI идентификаторы использовать в каждом регионе (ведь мы же знаем что AMI в каждом регионе свои)

"Mappings" : {

"RegionMap" : {

"us-east-1" : {"AMI" : "ami-84b210ed"},

"eu-west-1" : {"AMI" : "ami-1fa4a16b"},

"us-west-1" : {"AMI" : "ami-af6b4eea"},

"us-west-2" : {"AMI" : "ami-8035b9b0"},

"ap-northeast-1" : {"AMI" : "ami-5e30835f"},

"ap-southeast-1" : {"AMI" : "ami-4efdbb1c"}

}

}

Ресурсы Amazon AWS которые мы будем разворачивать.

"Resources" : {

Вот это сам ec2 инстанс

"cfServer" : {

"Type" : "AWS::EC2::Instance",

"Properties" : {

"AvailabilityZone" : { "Ref" : "AvailabilityZone" },

"KeyName" : { "Ref" : "KeyName" },

"SecurityGroups" : [{ "Ref" : "InstanceSecurityGroup" }],

"ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]},

"InstanceType" : "m1.small",

"Tags" : [{ "Key" : "Name", "Value" : "CloudFormattedServer" }]

}

}

Тут сделаем к нему диск:

"cfServerDataVolume" : {

"Type" : "AWS::EC2::Volume",

"Properties" : {

"Size" : "10",

"AvailabilityZone" : { "Ref" : "AvailabilityZone" },

"Tags" : [{ "Key" : "Name", "Value" : "CloudFormattedServer storage volume" }]

}

}

А вот так мы этот диск прикрепим к серверу:

"MountPointCfServer" : {

"Type" : "AWS::EC2::VolumeAttachment",

"Properties" : {

"InstanceId" : { "Ref" : "cfServer" },

"VolumeId"  : { "Ref" : "cfServerDataVolume" },

"Device" : "/dev/sdh"

}

}

Тут прикрепим к серверу Elastic IP адрес

"cfServerEIP" : {

"Type" : "AWS::EC2::EIP",

"Properties" : {

"InstanceId" : { "Ref" : "cfServer" }

}

}

А это наш темплейт выведет по окончанию работы (это будет строка присоединения к инстансу)

"Outputs" : {

"cfServer" : {

"Description" : "Connection string",

"Value" : { "Fn::Join" : [ "", ["ssh -i ", { "Ref" : "KeyName" },".pem ec2-user@",{ "Fn::GetAtt" : [ "cfServer", "PublicDnsName" ] } ]] }

}

}

Чтобы не клеить все по кусочку: весь темплейт можно скачать здесь

Вот пример лога создания ресурсов темплейта в Amazon AWS консоли:

CloudFormation events
Вот пример вывода результатов работы темплейта в Amazon AWS консоли:

CloudFormation outputsКоманда Amazon хорошо поработала и приготовила много документации по CloudFormation. Кто заинтересовался, милости прошу начинать отсюда: http://aws.amazon.com/cloudformation/

Применительно с затронутому вначале статьи: после написания хорошего темплейта можно в считанные минуты создавать целые окружения которые будут нужны Вам на проекте для девелоперов, тестеров и т.д. Можно вообще вынести параметры которые меняются в параметры темплейта: названия и размеры машин, размеры диска.
Большим плюсом этого всего также является то что все окружения однообразны и одинаковы, а значит все что оттестировано в одном месте будет работать таким же образом и в другом.
Также с помощью CloudFormation удобно следовать одной из последних тенденций управления инфраструктурой в облаках: «hardware as a code»

Кстати, в большинстве случаев после поднятия виртуального сервера его еще нужно и как-то настроить. Как это сделать будет описано в следующих статьях.

This entry was posted in Amazon AWS, Centos, CloudFormation, configuration management, Linux and tagged , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *