Назад | Перейти на главную страницу

Как запускать и останавливать инстанс AWS EC2 по расписанию

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

Обновить

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

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

Исходный пост

У AWS есть инструмент под названием Планировщик EC2 это дает вам очень гибкий контроль над запуском и остановкой инстансов EC2.

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

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

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

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

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

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

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

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

Пометка инстансов EC2

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

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

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

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

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

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

Ключ: scheduler: ec2-startstop: late Значение: 1500; 2400; utc; вт, чт, пт

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

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

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

Параметры 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"
    }
  ]
}

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

В консоли Lambda

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

Код ниже

{
  "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 секунд для функции Тайм-аут.
  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, которое активирует вашу функцию Lambda ночью.

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

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

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

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

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