Запуск и остановка AWS серверов по расписанию

21.06.2018

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

Данный инструмент представляет из себя связку из нескольких облачных сервисов: AWS Dynamo DB, AWS Lambda, AWS EC2 и других сопутствующих им. Связка сервисов организуетcя с помощью стека AWS Cloud Formation.

Для того, чтобы внедрить решение, нужно загрузить шаблон стека и дописать в него свои расписания в конец секции "Resources". Ниже представлены отрывки, определяющие три расписания.

Первое расписание: RUOfficeHours - запускать серверы в 7:30 и останавливать в 19:00 с понедельника по пятницу, часовой пояс Европа/Москва, не форсировать запуск/остановку серверов, если они были выключены/включены вне указанного периода вручную.

Второе расписание: RUStopAfterWorkingDay - останавливать серверы в 18:00 каждый день, часовой пояс Европа/Москва, не форсировать запуск/остановку серверов, если они были выключены/включены вне указанного периода вручную.

       "RUOfficeHours": {
           "Type": "Custom::ServiceInstanceSchedule",
           "DependsOn": "Main",
           "Properties": {
               "Description": "RU Office hours",
               "ServiceToken": {
                   "Fn::Sub": "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${AWS::StackName}-InstanceSchedulerMain",
               },
               "Enforced": "False",
               "Timezone": "Europe/Moscow",
               "Periods": [
                   {
                       "Description": "Working hours on weekdays",
                       "BeginTime": "07:30",
                       "EndTime": "19:00",
                       "WeekDays": "Mon-Fri"
       
                   }
               ]
           }
       },
       "RUStopAfterWorkingDay": {
           "Type": "Custom::ServiceInstanceSchedule",
           "DependsOn": "Main",
           "Properties": {
               "Description": "RU Stop after working day and don't start",
               "ServiceToken": {
                   "Fn::Sub": "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${AWS::StackName}-InstanceSchedulerMain",
               },
               "Enforced": "False",
               "Timezone": "Europe/Moscow",
               "Periods": [
                   {
                       "Description": "Stopping hours every day",
                       "EndTime": "18:00"
                   }
               ]
           }
       }

Третье расписание имеет двойной период активности: CZOfficeHours - запускать серверы в 7:30 и останавливать в 18:00 каждый день с понедельника по четверг, запускать серверы в 7:30 и останавливать в 17:00 каждую пятницу, часовой пояс Европа/Прага, не форсировать запуск/остановку серверов, если они были выключены/включены вне указанного периода вручную.

         "CZOfficeHours": {
           "Type": "Custom::ServiceInstanceSchedule",
           "DependsOn": "Main",
           "Properties": {
               "Description": "CZ Office hours",
               "ServiceToken": {
                   "Fn::Sub": "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${AWS::StackName}-InstanceSchedulerMain",
               },
               "Enforced": "False",
               "Timezone": "Europe/Prague",
               "Periods": [
                   {
                       "Description": "Working hours on weekdays",
                       "BeginTime": "07:30",
                       "EndTime": "18:00",
                       "WeekDays": "Mon-Thu"
       
                   },
                   {
                       "Description": "Working hours in Fridays",
                       "BeginTime": "07:30",
                       "EndTime": "17:00",
                       "WeekDays": "Fri"
       
                   }
               ]
           }
       }

В примере к заметке можно найти все указанные выше расписания. Более подробно о составлении расписаний и периодах активности можно прочитать в документации к сервису.

Примечание. Если использовать расписания в шаблонах для Cloud Formation, как описано в этой заметке, то нельзя самостоятельно изменять расписания и периоды в базе данных Dynamo DB, а так же через API к сервису, так как это приведет к конфликту настроек.

Когда шаблон отредактирован, можно создавать из него стек ресурсов в  AWS Cloud Formation. 

Start-stop AWS instances by a schedule

Далее необходимо указать Имя стека, Часовой пояс расписаний, Частоту проверки состояний серверов, Участие в анонимном сборе данных.

В качестве информационных тэгов Started tags и Stopped tags я рекомендую использовать следующие параметры:

Notice=Started by AWS scheduler at {day}.{month}.{year} {hour}:{minute} UTC
Notice=Stopped by AWS scheduler at {day}.{month}.{year} {hour}:{minute} UTC

 

Start-stop AWS instances by a schedule

 На странице опций ничего менять не надо.

Start-stop AWS instances by a schedule

 На странице обзора настроек стека нужно поставить параметр, разрешающий изменять роли IAM.

Start-stop AWS instances by a schedule

 Дождаться окончания создания стека.

Start-stop AWS instances by a schedule

 Если все этапы прошли без ошибок, то будут созданы следующие ресурсы: таблицы Dynamo DB, функция Lambda, роли IAM.

Start-stop AWS instances by a schedule
Start-stop AWS instances by a schedule
Start-stop AWS instances by a schedule

Чтобы приписать сервер к какому-нибудь расписанию, определенному ранее в шаблоне стека, необходимо создать тег Schedule и присвоить ему значение равное <Имя стека>-<Имя расписания>, например cfn-StartStopScheduler-RUStopAfterWorkingDay.

Start-stop AWS instances by a schedule

Настройка автоматического запуска и остановки серверов Amazon Web Services завершена.