Как запустить и остановить экземпляр AWS EC2 на основе расписания, основанного на времени
Есть ли простой способ запускать и останавливать экземпляры AWS EC2 в определенное время каждый день? Это может сэкономить мне немало денег на разработку и тестирование серверов.
3 ответа
Обновить
AWS выпустила инструмент под названием " Планировщик экземпляров ", включая полное руководство по настройке, которое связано с этой страницей. Это выглядит как усовершенствование планировщика EC2, которое я опишу ниже, с несколькими дополнительными функциями, но по сути это то же самое.
Приведенное ниже руководство по-прежнему будет работать, но, вероятно, лучше взглянуть на планировщик экземпляров для новых установок.
Оригинальный пост
В AWS есть инструмент под названием EC2 Scheduler, который дает вам очень гибкий контроль над запуском и остановкой экземпляров EC2.
Инструмент позволяет вам определять время запуска и остановки по умолчанию при настройке инструмента, которое вы можете изменить позже. Вы можете выбрать, какие экземпляры будут контролироваться, вы и вы можете указать разные времена запуска и остановки для каждого экземпляра, используя теги.
Хотя это отличный инструмент, документация несколько расплывчатая и запутанная. Это похоже на то, что документация была написана инженером, который написал инструмент и знает о нем все, а не техническим писателем.
Примечание: если у вас есть отзывы или исправления, комментарии приветствуются. Если у вас есть вопрос, основанный на этом, пожалуйста, начните свой вопрос.
Что такое планировщик EC2
Этот инструмент является лямбда-функцией, которая работает с Cloudwatch Events и DynamoDB. Он развертывается с использованием шаблона Cloudformation, который также устанавливает необходимые роли и политики IAM. Вы можете прочитать об архитектуре здесь.
развертывание
Начните с перехода на эту страницу и нажмите "Запустить решение". Прямо сейчас прямая ссылка здесь, но она может измениться.
Выберите область, в которой вы хотите развернуть ресурсы, в верхней части консоли. Сценарий контролирует экземпляры 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"
}
]
}
Если вы просто хотите запускать и останавливать экземпляры, вот еще один пример, который также использует службу Lambda. Предполагается, что вы хотите контролировать конкретный идентификатор экземпляра. Вы можете управлять несколькими экземплярами, добавляя больше идентификаторов, разделенных запятой. (например: "i-3453453", "i-45656745"). Вы можете найти идентификатор своего экземпляра в разделе Экземпляры консоли AWS.
В лямбда-консоли
- Откройте консоль AWS Lambda и выберите "Создать функцию".
- Выберите автора с нуля.
- Введите имя для вашей функции, например, "StopEC2Instances".
- Для Runtime выберите Python 2.7.
- Разверните раскрывающееся меню "Роль" и выберите "Создать пользовательскую роль". Это открывает новую вкладку или окно в вашем браузере.
- В раскрывающемся меню "Роль IAM" выберите "Создать новую роль IAM" и введите имя роли, например "lambda_start_stop_ec2".
- Выберите 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": "*"
}
]
}
- Выберите Разрешить, чтобы завершить создание роли и вернуться в консоль AWS Lambda.
- Чтобы остановить ваши экземпляры, замените весь текст в редакторе кода функции следующим:
Код ниже
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)
Не забудьте заменить значения регионов и экземпляров на свои.
- From the Runtime drop-down menu, choose Python2.7.
- In Basic settings, enter 10 seconds for the function Timeout.
- Выберите Сохранить.
- Repeat all the steps to create another function that will start your instances, but then use this python script for starting it all:
Code below
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)
Schedule the functions
Here you will create a CloudWatch Event that will trigger your Lambda function at night
- Open the Amazon CloudWatch console.
- Choose Events, and then choose Create rule.
- Choose Schedule under Event Source.
- Enter an interval of time or cron expression that tells Lambda when to stop your instances. For more information on the correct syntax, see Schedule Expression Syntax for Rules.
Note: Cron expressions are evaluated in UTC. Be sure to adjust the expression for your preferred time zone. Here is an example that will run the function every day at 08:00 GMT/UTC):
0 08 * * ? *
- Choose Add target, and then choose Lambda function.
- For Function, choose the Lambda function that stops your instances.
- Выберите Настроить детали.
- Enter the following information in the provided fields: For Name, enter a meaningful name, such as "StopEC2Instances." For Description, add a meaningful description, such as “stops EC2 instances every day at night.” For State, select Enabled.
- Выберите Создать правило.
To restart your instances in the morning, repeat these steps and use your preferred start time. If you want to send a mail message whenever the functions fail, you can set up an SNS topic and configure the sending of that message under Debugging in the Lmbda Function Creation Window.
The source of all this can be found here: AWS documentation
Более простой способ достичь той же цели — использовать правила AWS EventBridge.
Перейдите в Amazon EventBridge > Правила.
Создайте новое правило и выберите Тип правила как Расписание .
Предоставьте выражение cron для расписания выключения экземпляра. Например. хрон(30 17 * * ? *)
Для Target1 выберите:
- Тип цели : «Сервис AWS».
- Целью является «вызов API AWS StopInstances» и
- укажите идентификатор экземпляра для завершения работы по расписанию.
- Наконец, выберите «Создать новую роль для этого конкретного ресурса».
Просмотрите расписание и сведения об экземпляре и завершите создание правила.
Вы можете использовать упомянутый выше метод (с использованием лямбда-выражения), чтобы снова запустить тот же экземпляр.