В этой статье я расскажу об основах CloudFormation, а затем продемонстрирую все его преимущества на примере.
Статья состоит из следующих основных разделов:
Что такое AWS CloudFormation?
AWS CloudFormation - это сервис, который помогает вам моделировать и настраивать ресурсы Amazon Web Services, чтобы вы могли тратить меньше времени на управление ими и больше времени уделять приложениям, которые работают в AWS. Вы создаете шаблон, описывающий все необходимые вам ресурсы AWS (например, экземпляры (инстансы) Amazon EC2 или Amazon RDS DB), а AWS CloudFormation позаботится о предоставлении и настройке данных ресурсов за вас.
Преимущества AWS CloudFormation:
Упрощение управления инфраструктурой.
Быстрая репликация вашей инфраструктуры.
Легко контролировать и отслеживать изменения в вашей инфраструктуре.
Основы AWS CloudFormation
В CloudFormation вы работаете с шаблонами и стеками.
Шаблон: Текстовый файл в формате JSON или YAML, который представляет собой описание ваших ресурсов AWS.
Стек: В CloudFormation вы управляете ресурсами как единым блоком, называемым стеком. Все ресурсы в стеке определяются его шаблоном.
Таким образом, рабочий процесс AWS CloudFormation можно кратко описать с помощью приведенного здесь изображения.
1. Создайте или используйте существующий шаблон
2. Сохраните локально или в S3-бакете
3. Используйте AWS CloudFormation для создания стека на основе вашего шаблона. Он выстроит и сконфигурирует ваши ресурсы стека.Документация Amazon CloudFormation: docs.aws.amazon.com
Шаблон:
Шаблон - это текстовый файл в формате JSON или YAML, который описывает, какие ресурсы содержатся в стеке. Он содержит информацию о каждом ресурсе, его конфигурации и о том, как он может быть связан или зависеть от других ресурсов.
Шаблон может быть разработан двумя методами:
1. UI Designer (дизайнер интерфейсов): Вы можете создать схему ресурсов шаблона с помощью интерфейса drag-and-drop (перетаскивания), а затем отредактировать их детально с помощью встроенного редактора JSON/YAML.
2. Скрипт (Сценарий): Непосредственное создание сценария шаблона в формате JSON или YAML.
Как показано на скриншоте ниже, дизайнер и редактор расположены рядом, бок о бок на консоли, и поэтому вы можете визуализировать свои изменения/обновления по мере их внесения.
Ниже перечислены основные компоненты шаблона:
Описание: Позволяет включить произвольные комментарии о вашем шаблоне. (Опционально).
Параметры: Параметры позволяют вводить пользовательские значения в шаблон каждый раз при создании или обновлении стека (Опционально).
Маппинги (Сопоставления): Коллекция пар "ключ-значение", которые можно использовать для задания значений. (Опционально).
Ресурсы: Объявляет ресурсы AWS, которые вы хотите включить в стек.
Результаты: Объявляет выходные значения, которые можно импортировать в другие стеки, возвращать в ответ или просматривать на консоли AWS CloudFormation (Опционально).
Пример AWS CloudFormation
AWS CloudFormation можно использовать для быстрой настройки и развертывания очень сложных стеков, что сэкономит вам часы работы вручную и обеспечит возможность повторного использования. В этом разделе я сделаю простой инстанс EC2 и группу безопасности, которую затем назначу инстансу. Образец шаблона по созданию подобной конфигурации (также показан на рисунке ниже) выложен по адресу aws-cloudformation-basic-example.template.
Как только стек будет развернут, ему будут предоставлены все ресурсы. Вы можете получить доступ к инстансу через SSH и выполнить дальнейшую настройку. В качестве опции вы также можете установить приложения, создать файлы и т.д. и выполнить любую пользовательскую настройку инстансов EC2 с помощью шаблона CloudFormation, как описано в разделах ниже:
Конфигурирование ваших инстансов:
CloudFormation также можно использовать для автоматической настройки инстансов после их деплоя в стеке. Можно запускать скрипты, загружать и устанавливать приложения, создавать файлы и т.д.
Чтобы продемонстрировать это, здесь я привожу пример установки и запуска httpd-сервера на инстансе EC2, развернутом в предыдущем примере.
Чтобы настроить инстанс EC2, вы можете ввести команды, которые нужно выполнить при запуске, в разделе UserData свойств ресурса, как показано ниже. Полный шаблон для этого примера - aws-cloudformation-http-install-userdata-only.template.
"Resources" : {
"WebServerInstance": {
"Type" : "AWS::EC2::Instance",
"Properties": {
"ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : ["AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] },
"InstanceType" : { "Ref" : "InstanceType" },
"SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ],
"KeyName" : { "Ref" : "KeyName" },
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash\n",
"yum update -y\n",
"mkdir /tmp\n",
"mkdir /tmp/amol\n",
"yum install httpd php php-mysql stress -y\n",
"echo '<html><title>Hello Amol Title</title><body><h1>header H1</h1></body></html>' > /var/www/html/index.html\n",
"echo 'i am healthy' > /var/www/html/healthy.html\n",
"service httpd start\n",
"chkconfig httpd on\n"
]]}}
}
}
}
Лучшим и рекомендуемым способом достижения вышеуказанной функциональности является создание и использование наборов конфигурации (Config Sets). Вы можете создать набор конфигурации для каждой операции, которую собираетесь выполнить над инстансом. Преимущество такого подхода заключается в том, что информация о наборе конфигурации сохраняется в метаданных стека, и доступ к ней можно получить даже после того, как стек будет создан. Вы можете создать столько наборов конфигурации, сколько захотите, и можете не использовать их при запуске инстанса.
Например, можно иметь наборы конфигурации для установки/удаления WordPress, скажем: install_wordpress
, uninstall_wordpress
:
Вы можете вызвать
install_wordpress
только при запуске инстанса, чтобы настроить и установить WordPress, когда он будет инициализирован в стеке.
Если вы хотите повторно инсталлировать WordPress на этот инстанс, то можете обратиться к наборам конфигурации
uninstall_wordpress
,install_wordpress
(с помощью скрипта cfn-init, описанного позже), чтобы выполнить чистую установку после того, как инстанс уже запущен.
Набор конфигурации может содержать несколько конфигов, и вы можете вызывать их в любом порядке, используя различные комплекты. Допустим, у вас есть конфигурации под названиями "install", "configure", "deploy", "teardown". Тогда вы можете использовать несколько наборов конфигурации для достижения определенных целей, как показано ниже:
"SetupConfigSet" : [ "install", "configure" ],
"InitialDeployConfigSet" : [ "install", "configure", "deploy" ],
"DeployOnlyConfigSet" : [ "deploy" ],
"TeardownConfigSet" : ["teardown"],
В целях демонстрации, в приведенном здесь примере я создам два набора конфигурации с одним конфигом в каждом. Полный шаблон для этого примера находится по адресу aws-cloudformation-httpd-install-using-configset.template.
Здесь я создал два набора конфигурации для нашего инстанса, а именно 'InstallHttpd' и 'UninstallHttpd', как показано ниже:
Прежде всего, в разделе AWS::CloudFormation::Init определите наборы конфигурации. В каждом наборе InstallHttpd и UninstallHttpd содержится по одному конфигу.
"configSets" : {
"InstallHttpd" : [ "install_httpd" ],
"UninstallHttpd" : [ "uninstall_httpd" ]
}
Теперь определите конфигурацию install_httpd, как показано ниже. В этом конфиге есть шаги по установке httpd-сервера на компьютер. Он также создает основной HTML-файл и обеспечивает запуск httpd-сервера при включении компьютера.
"install_httpd" : {
"packages" : {
"yum" : {
"httpd" : [],
"php" : [],
"php-mysql" : [],
"stress" : []
}
},
"files" : {
"/var/www/html/healthy.html" : {
"content" : "I am healthy"
},
"/var/www/html/index.html" : {
"content" : "<html><title>Hello Amol Title</title><body><h1>header H1</h1></body></html>"
}
},
"commands" : {
"httpd" : {
"command" : "chkconfig httpd on",
"ignoreErrors" : "false"
}
},
"services" : {
"sysvinit" : {
"httpd" : { "enabled" : "true", "ensureRunning" : "true" }
}
}
}
Затем определите набор конфигурации uninstall_httpd, как показано ниже. Эта конфигурация состоит из последовательных действий по удалению сервера httpd.
"uninstall_httpd" : {
"commands" : {
"httpd" : {
"command" : "rm -rf /var/www/html",
"ignoreErrors" : "false"
}
}
}
После того, как конфиги и наборы конфигурации определены, при запуске инстанса нам необходимо выполнить скрипт cfn-init для вызова набора конфигурации InstallHttpd, который инсталлирует и настроит httpd-сервер на инстансе. Скрипт cfn-init можно использовать для выполнения любого из наборов конфигурации во время или после запуска инстанса.
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"",
[
"#!/bin/bash -xe\n",
"yum update aws-cfn-bootstrap\n",
"# Install the files and packages from the metadata\n",
"/opt/aws/bin/cfn-init ",
" –stack", {"Ref":"AWS::StackName" },
" –resource WebServerInstance ",
" –configsets InstallHttpd ",
" –region", {"Ref":"AWS::Region" }, "\n",
"# Signal the status from cfn-init\n",
"/opt/aws/bin/cfn-signal -e $? ",
" –stack", {"Ref":"AWS::StackName" },
" –resource WebServerInstance ",
" –region", {"Ref":"AWS::Region" }, "\n"
]
]
}
}
Полный шаблон для этого примера - aws-cloudformation-httpd-install-using-configset.template.
После развертывания стека ваша консоль будет выглядеть так, как показано на скриншоте ниже. Как видите, у вас есть все события, входные параметры, предоставленные при создании стека, ресурсы, а также сценарий шаблона. В выводах я добавил ссылку на веб-страницу, размещенную на сервере, поэтому если вы перейдете по ней (или, в данном случае, кликните на сгенерированный URL), то попадете на HTML-страницу.
Основы AWS CloudFormation
Если вы используете данный шаблон, то он инсталлирует httpd и настроит ваш веб-сервер при запуске, как только стек будет создан.
Теперь, если вы хотите удалить httpd, вы можете подключиться к инстансу по SSH и выполнить команду (с root-правами):
/opt/aws/bin/cfn-init --stack [stack name/id] --resource WebServerInstance --configsets UninstallHttpd --region [region where stack is deployed]
Чтобы снова установить и настроить httpd с той же конфигурацией при запуске, выполните команду:
/opt/aws/bin/cfn-init --stack [stack name/id] --resource WebServerInstance --configsets InstallHttpd--region [region where stack is deployed]
Вы можете увидеть то, что происходит, ниже:
На этом пока все. Надеюсь, вам понравился этот пост, и он был полезен для вас! :-)
В завершение хочу порекомендовать бесплатный вебинар: "Mock интервью со студентом на позицию cloud solution architect". На вебинаре обсудим:
Страшное слово интервью и как переставить его бояться :).
Карьерные путь SA, CSA, teamlead, engineering manager, director of engineering.
Из каких этапов состоит интервью.
Какие методики используются для ответа на вопросы.
Обсудим что такое Soft skills и Hard skills.
Проведем симуляцию интервью.