Есть ли простой способ запускать и останавливать экземпляры AWS EC2 в определенное время каждый день? Это могло сэкономить мне довольно много денег на моих серверах разработки и тестирования.
Обновить
AWS выпустила инструмент под названием "Планировщик экземпляров", в том числе полный руководство по настройке который связан с этой страницы. Похоже, что это усовершенствованный планировщик EC2, который я описываю ниже, с некоторыми дополнительными функциями, но по сути это то же самое.
Приведенное ниже руководство по-прежнему будет работать, но, вероятно, для новых установок лучше взглянуть на планировщик экземпляров.
Исходный пост
У AWS есть инструмент под названием Планировщик EC2 это дает вам очень гибкий контроль над запуском и остановкой инстансов EC2.
Инструмент позволяет вам определять время начала и окончания по умолчанию при настройке инструмента, которое вы можете изменить позже. Вы можете выбрать, какие экземпляры будут контролироваться, и вы можете указать разное время запуска и остановки для каждого экземпляра с помощью тегов.
Хотя это отличный инструмент, документация несколько расплывчата и запутана. Это как если бы документация была написана инженером, который написал инструмент и знает о нем все, а не техническим писателем.
Заметка : если у вас есть отзывы или исправления, приветствуются комментарии. Если у вас есть вопрос по этому поводу, начните свой собственный вопрос.
Что такое планировщик EC2
Этот инструмент представляет собой лямбда-функцию, которая работает с Cloudwatch Events и DynamoDB. Он развертывается с использованием шаблона Cloudformation, который также устанавливает необходимые роли и политики IAM. Вы можете прочитать об архитектуре Вот.
Развертывание
Начните с перехода к эта страница и щелкнув «запустить решение». Прямо сейчас прямая ссылка Вот, но это могло измениться.
Выберите регион, в котором нужно развернуть ресурсы, в верхней части консоли. Скрипт управляет экземплярами EC2 в любом регионе, но работает в одном регионе.
Пометка инстансов EC2
Это описано в документации Вот, но это не так просто, как могло бы быть.
Вы контролируете, какие экземпляры запускаются и останавливаются, помечая свои экземпляры.
В простейшем случае вам потребуется пометить каждый экземпляр EC2, который вы хотите запускать и останавливать в соответствии с расписанием. Для этого найдите свой экземпляр EC2 в консоли, нажмите теги и создайте этот тег.
Чтобы включить копирование и вставку:
Если вы хотите, чтобы конкретный экземпляр запускался и останавливался по другому расписанию, вы добавляете дополнительную информацию к ключу и значению тега. Например, если вы хотите, чтобы экземпляр запускался в 1500 UTC и останавливался в 2400 UTC во вторник, четверг и пятницу, введите следующее.
Ключ: scheduler: ec2-startstop: late Значение: 1500; 2400; utc; вт, чт, пт
Обратите внимание, что слово «поздно» может быть любой строкой, «поздно» не имеет особого значения.
Вы можете преобразовать UTC в местное время, используя этот инструмент.
Вы можете использовать редактор тегов в экземпляры массовых тегов. Это могло бы упростить вам настройку массовых тегов, что может быть полезно для различных настроек для разработки, тестирования и производства. Я сомневаюсь, что вы использовали бы это в продакшене.
Параметры CloudFormation
Когда вы запускаете шаблон 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.
Код ниже
{
"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": "*"
}
]
}
Код ниже
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)
Код ниже
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 ночью.
Примечание. Выражения Cron вычисляются в формате UTC. Обязательно настройте выражение для предпочтительного часового пояса. Вот пример, который будет запускать функцию каждый день в 08:00 GMT / UTC):
0 08 * * ? *
Чтобы перезапустить экземпляры утром, повторите эти шаги и используйте предпочтительное время запуска. Если вы хотите отправлять почтовое сообщение при сбое функций, вы можете настроить тему SNS и настроить отправку этого сообщения в разделе «Отладка» в окне создания функции Lmbda.
Источник всего этого можно найти здесь: Документация AWS