В этой статье я расскажу об основах 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 можно кратко описать с помощью приведенного здесь изображения.

Основы 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 CloudFormation
Основы AWS CloudFormation

Ниже перечислены основные компоненты шаблона:

  • Описание: Позволяет включить произвольные комментарии о вашем шаблоне. (Опционально).

  • Параметры: Параметры позволяют вводить пользовательские значения в шаблон каждый раз при создании или обновлении стека (Опционально).

  • Маппинги (Сопоставления): Коллекция пар "ключ-значение", которые можно использовать для задания значений. (Опционально).

  • Ресурсы: Объявляет ресурсы AWS, которые вы хотите включить в стек.

  • Результаты: Объявляет выходные значения, которые можно импортировать в другие стеки, возвращать в ответ или просматривать на консоли AWS CloudFormation (Опционально).

Пример AWS CloudFormation

AWS CloudFormation можно использовать для быстрой настройки и развертывания очень сложных стеков, что сэкономит вам часы работы вручную и обеспечит возможность повторного использования. В этом разделе я сделаю простой инстанс EC2 и группу безопасности, которую затем назначу инстансу. Образец шаблона по созданию подобной конфигурации (также показан на рисунке ниже) выложен по адресу aws-cloudformation-basic-example.template.

Как только стек будет развернут, ему будут предоставлены все ресурсы. Вы можете получить доступ к инстансу через SSH и выполнить дальнейшую настройку. В качестве опции вы также можете установить приложения, создать файлы и т.д. и выполнить любую пользовательскую настройку инстансов EC2 с помощью шаблона CloudFormation, как описано в разделах ниже:

Основы AWS CloudFormation
Основы AWS 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]

Вы можете увидеть то, что происходит, ниже:

Основы AWS CloudFormation
Основы AWS CloudFormation

На этом пока все. Надеюсь, вам понравился этот пост, и он был полезен для вас! :-)

В завершение хочу порекомендовать бесплатный вебинар: "Mock интервью со студентом на позицию cloud solution architect". На вебинаре обсудим:

  • Страшное слово интервью и как переставить его бояться :).

  • Карьерные путь SA, CSA, teamlead, engineering manager, director of engineering.

  • Из каких этапов состоит интервью.

  • Какие методики используются для ответа на вопросы.

  • Обсудим что такое Soft skills и Hard skills.

  • Проведем симуляцию интервью.

Зарегистрироваться на бесплатный вебинар

Комментарии (6)