Как запустить и остановить экземпляр AWS EC2 на основе расписания, основанного на времени

17

Есть ли простой способ запускать и останавливать экземпляры AWS EC2 в определенное время каждый день? Это может сэкономить мне немало денег на разработку и тестирование серверов.

Тим
источник

Ответы:

16

Обновить

AWS выпустила инструмент под названием « Планировщик экземпляров », включая полное руководство по настройке, которое связано с этой страницей. Это выглядит как усовершенствование планировщика EC2, которое я опишу ниже, с несколькими дополнительными функциями, но по сути это то же самое.

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

Оригинальный пост

В AWS есть инструмент под названием EC2 Scheduler, который дает вам очень гибкий контроль над запуском и остановкой экземпляров EC2.

Инструмент позволяет вам определять время запуска и остановки по умолчанию при настройке инструмента, которое вы можете изменить позже. Вы можете выбрать, какие экземпляры будут контролироваться, вы и вы можете указать разные времена запуска и остановки для каждого экземпляра, используя теги.

Хотя это отличный инструмент, документация несколько расплывчатая и запутанная. Это похоже на то, что документация была написана инженером, который написал инструмент и знает о нем все, а не техническим писателем.

Примечание : если у вас есть отзывы или исправления, комментарии приветствуются. Если у вас есть вопрос, основанный на этом, пожалуйста, начните свой вопрос.

Что такое планировщик EC2

Этот инструмент является лямбда-функцией, которая работает с Cloudwatch Events и DynamoDB. Он развертывается с использованием шаблона Cloudformation, который также устанавливает необходимые роли и политики IAM. Вы можете прочитать об архитектуре здесь .

Архитектура планировщика AWS EC2

развертывание

Начните с перехода на эту страницу и нажмите «Запустить решение». Прямо сейчас прямая ссылка здесь , но она может измениться.

Выберите область, в которой вы хотите развернуть ресурсы, в верхней части консоли. Сценарий контролирует экземпляры EC2 в любом регионе, но работает в одном регионе.

Пометка экземпляров EC2

Это описано в документации здесь , но это не так просто , как могло бы быть.

Вы контролируете, какие экземпляры запускаются и останавливаются, помечая ваши экземпляры.

В простейшем случае вы должны пометить каждый экземпляр EC2, который вы хотите запустить и остановить в соответствии с расписанием. Для этого найдите свой экземпляр EC2 в консоли, щелкните теги и создайте этот тег.

Маркировка экземпляров EC2 для планировщика

Чтобы включить копирование и вставку:

  • Ключ: планировщик: ec2-StartStop
  • Значение: правда

Если вы хотите, чтобы конкретный экземпляр запускался и останавливался по другому расписанию, вы добавляете дополнительную информацию к ключу и значению тега. Например, если вы хотите, чтобы экземпляр начинался в 1500 UTC и останавливался в 24:00 UTC во вторник, четверг и пятницу, введите следующее.

Ключ: планировщик: ec2-StartStop: поздно Значение: 1500; 2400; utc; вт, чт, пт

Обратите внимание, что слово «поздний» может быть любой строкой, «поздний» не имеет особого значения.

Вы можете конвертировать UTC в местное время, используя этот инструмент .

Вы можете использовать редактор тегов для массовых экземпляров тегов. Это может упростить настройку массовых тегов, которые могут быть полезны для различных настроек dev, test и production. Я сомневаюсь, что вы использовали бы это на производстве, хотя.

Параметры CloudFormation

Когда вы запускаете шаблон CloudFormation, вам нужно ввести много параметров. Большинство вы можете оставить по умолчанию. Вот некоторые из наиболее важных параметров

  • Название стека: называйте это как хотите. Это то, что называется в CloudFormation.
  • Имя пользовательского тега: это «ключ» тега, который вы помещаете в экземпляр EC2. Оставьте значение по умолчанию, если у вас нет веских причин или вам нужно несколько установок.
  • Время запуска / остановки по умолчанию: время UTC по умолчанию для запуска и остановки экземпляров
  • DynamoDB: настройки хранятся в DynamoDB. Вы можете изменить имя таблицы и тому подобное. Поскольку бесплатный уровень DynamoDB не истекает, большинство людей вряд ли будут платить.
  • (второй экран) Разрешения - это красная сельдь, см. раздел ниже. Оставьте его по умолчанию и работайте от имени администратора при попытке настроить планировщик EC2.
  • Варианты уведомлений: я нашел полезным настроить уведомления SNS, чтобы убедиться, что они работают. Я не потратил время на то, чтобы выяснить, как их отключить, я просто удалил его, перезапустил шаблон Cloudformation для переустановки.

Разрешения, политики и роли

Раздел «Разрешения / роль IAM» в шаблоне CloudFormation представляет собой «красную сельдь», т. Е. В значительной степени не имеет значения. Он определяет только роль, используемую для запуска скрипта CloudFormation, не имеет значения для созданных ресурсов или роли, используемой при запуске лямбда-функции. Оглядываясь назад, это очевидно, но для меня это не было очевидно, когда я начинал.

Независимо от роли, которую вы запускаете в этом сценарии, в IAM создаются одинаковые роли и встроенные разрешения. Функция Lambda выполняется с использованием «роли планировщика ec2», которую создает сценарий.

Я включил мои правила ниже на случай, если они будут полезны для всех.

CloudWatch События и метрики

Если вы хотите видеть журналы от вашей Лямбда-функции, зайдите в Cloudwatch Events. Регистрация довольно хорошая. Есть также метрики, поэтому вы можете видеть, когда он работает, время, за которое он работает, и т. Д.

дополнительный

Код для лямбда-функции доступен на Github .

полисы

Обычно они не нужны, но могут быть для кого-то, поэтому я их включу.

Политика для роли IAM

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "iam:CreateRole",
                "iam:GetRole",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DeleteRole",
                "dynamodb:*",
                "lambda:*",
                "SNS:Publish",
                "events:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "S3:GetObject",
            "Resource": [
                "arn:aws:s3:::solutions-us-west-2",
                "arn:aws:s3:::solutions-us-west-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StopInstances",
                "ec2:StartInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
            ]
        }
    ]
}

Политика доверия для роли IAM

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "cloudformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Тим
источник
С тех пор Amazon изменил положение вещей: «Планировщик EC2 заменен планировщиком экземпляров AWS»
Макс Барракло
Спасибо Макс, я обновил ответ, чтобы включить ссылку. Он поставляется с полным руководством по внедрению, поэтому я не думаю, что мне нужно предоставлять подробные инструкции.
Тим
1
Невероятно, как им нравится усложнять вещи ...
Мехди
10

Если вы просто хотите запускать и останавливать экземпляры, вот еще один пример, который также использует службу Lambda. Предполагается, что вы хотите контролировать конкретный идентификатор экземпляра. Вы можете управлять несколькими экземплярами, добавляя больше идентификаторов, разделенных запятой. (например: «i-3453453», «i-45656745»). Вы можете найти идентификатор своего экземпляра в разделе Экземпляры консоли AWS.

В лямбда-консоли

  1. Откройте консоль AWS Lambda и выберите «Создать функцию».
  2. Выберите автора с нуля.
  3. Введите имя для вашей функции, например, «StopEC2Instances».
  4. Для Runtime выберите Python 2.7.
  5. Разверните раскрывающееся меню «Роль» и выберите «Создать пользовательскую роль». Это открывает новую вкладку или окно в вашем браузере.
  6. В раскрывающемся меню «Роль IAM» выберите «Создать новую роль IAM» и введите имя роли, например «lambda_start_stop_ec2».
  7. Выберите View Policy Document, Edit, а затем нажмите Ok, когда будет предложено прочитать документацию. Замените весь текст в политике на это:

Код ниже

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}
  1. Выберите Разрешить, чтобы завершить создание роли и вернуться в консоль AWS Lambda.
  2. Чтобы остановить ваши экземпляры, замените весь текст в редакторе кода функции следующим:

Код ниже

import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

Не забудьте заменить значения регионов и экземпляров на свои.

  1. В раскрывающемся меню Runtime выберите Python2.7.
  2. В основных настройках введите 10 секунд для функции Timeout.
  3. Выберите Сохранить.
  4. Повторите все шаги, чтобы создать другую функцию, которая будет запускать ваши экземпляры, но затем использовать этот скрипт Python для запуска всего этого:

Код ниже

import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print 'started your instances: ' + str(instances)

Расписание функций

Здесь вы создадите событие CloudWatch, которое будет запускать вашу лямбда-функцию ночью

  1. Откройте консоль Amazon CloudWatch.
  2. Выберите События, а затем выберите Создать правило.
  3. Выберите Расписание в разделе «Источник события».
  4. Введите интервал времени или выражение cron, которое сообщает Lambda, когда останавливать ваши экземпляры. Для получения дополнительной информации о правильном синтаксисе см. Синтаксис выражения расписания для правил.

Примечание: выражения Cron оцениваются в UTC. Не забудьте настроить выражение для вашего предпочтительного часового пояса. Вот пример, который будет запускать функцию каждый день в 08:00 по Гринвичу / UTC):

0 08 * * ? *
  1. Выберите Добавить цель, а затем выберите функцию лямбда.
  2. Для функции выберите лямбда-функцию, которая останавливает ваши экземпляры.
  3. Выберите Настроить детали.
  4. Введите в предоставленные поля следующую информацию: В поле «Имя» введите значимое имя, например «StopEC2Instances». В поле «Описание» добавьте содержательное описание, например «останавливает экземпляры EC2 каждый день ночью». Для «Состояние» выберите «Включено».
  5. Выберите Создать правило.

Чтобы перезапустить экземпляры утром, повторите эти шаги и используйте предпочитаемое время запуска. Если вы хотите отправлять почтовое сообщение при сбое функций, вы можете настроить тему SNS и настроить отправку этого сообщения в разделе «Отладка» в окне «Создание функции Lmbda».

Источник всего этого можно найти здесь: документация AWS

netfed
источник
С какой стати вы можете заставить код Python хорошо выглядеть в редакторе, как это выяснилось сейчас?
18:00
Нажмите на помощь "?" и вы узнаете больше об использовании форматирования уценки. serverfault.com/editing-help
jscott
1
Это ошибка в коде форматирования. Вы должны поместить простой текст между различными форматами - в этом случае блок кода и пронумерованный блок. Вот почему я вставил «код ниже» - не имеет смысла, везде, но он работает.
Тим
@Tim Спасибо за разъяснения. Я не знал этого. Это решило также форматирование выражения cron. Еще раз спасибо.
сети