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