Планирование работы на AWS EC2
У меня есть веб-сайт, работающий на AWS EC2. Мне нужно создать ночное задание, которое генерирует файл Sitemap и загружает файлы в различные браузеры. Я ищу утилиту на AWS, которая позволяет эту функциональность. Я рассмотрел следующее:
1) Создайте запрос на веб-сервер, который запускает его для выполнения этой задачи.
- Мне не нравится этот подход, потому что он связывает поток сервера и использует циклы процессора на хосте
2) Создайте задание cron на компьютере, на котором выполняется веб-сервер, для выполнения этой задачи
- Опять же, мне не нравится этот подход, потому что он берет циклы процессора от веб-сервера.
3) Создайте еще один экземпляр EC2 и настройте задание cron для выполнения задачи
- Это решает проблемы с ресурсами веб-сервера, но зачем платить за дополнительный экземпляр EC2 для запуска задания за 5 минут? Отходы денег!
Есть ли другие варианты? Это работа для ElasticMapReduce?
Ответы
Ответ 1
Amazon только что выпустила [1] новые функции для Elastic Beanstalk. Теперь вы можете создать рабочую среду, содержащую cron.yaml, которая настраивает задачи планирования, вызывающие URL-адрес с синтаксисом CRON: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html#worker-periodictasks
[1] http://aws.amazon.com/about-aws/whats-new/2015/02/17/aws-elastic-beanstalk-supports-environment-cloning-periodic-tasks-and-1-click-iam-role-creation/
Ответ 2
Если бы я был в ваших силах, я бы, вероятно, начал, пытаясь запустить задание cron на веб-сервере каждую ночь во время отлива и следить за использованием ресурсов, чтобы убедиться, что он не мешает веб-серверу.
Если вы обнаружите, что он не играет хорошо, или у вас высокие стандарты элегантности вашей архитектуры (я могу восхищаться этим), вам, вероятно, потребуется запустить отдельный экземпляр.
Я согласен с тем, что для запуска экземпляра 24 часа в сутки кажется пустой тратой на работу, которую нужно выполнять только один раз в сутки.
Здесь один aproach: задание cron на вашей основной машине (в настоящее время веб-сервер) может запустить новый экземпляр для запуска задачи. Он может передавать пользовательские данные script, которые запускаются при запуске экземпляра, и экземпляр может закрыться при завершении задачи (где для запуска экземпляра-shutdown-поведения установлено значение "завершение" ).
К сожалению, это пропустит ваше желание обеспечить разделение проблем, оно усложняется при запуске масштабирования на несколько веб-серверов и требует, чтобы ваш веб-сервер был жив, чтобы работа выполнялась.
Несколько месяцев назад я придумал другой подход, чтобы запустить экземпляр в расписании cron, полностью полагаясь на существующие функции AWS и не требуя, чтобы другие серверы работали.
Основная идея состоит в том, чтобы использовать автоматическое масштабирование Amazon с повторяющимся действием, которое масштабирует группу от "0" до "1" в определенное время каждую ночь. Экземпляр может завершаться, когда задание выполняется, а автоматическое масштабирование может быть очищено намного позже, чтобы убедиться, что оно завершено.
Я привел более подробную информацию и рабочий пример в этой статье:
Запуск экземпляров EC2 в повторяющемся расписании с автоматическим масштабированием
http://alestic.com/2011/11/ec2-schedule-instance
Ответ 3
Предполагая, что вы работаете в версии nix версии EC2, я предлагаю вам запустить его в cron с помощью команды nice.
nice изменяет приоритет задания. Вы можете сделать его гораздо более низким приоритетом, поэтому, если ваш веб-сервер занят, задание cron должно будет ждать CPU.
Чем выше приятное число, тем ниже приоритет.
Ничушности варьируются от -20 (наиболее выгодное расписание) до 19 (наименее благоприятное).
Ответ 4
AWS DataPipeline
Вы можете использовать AWS Data Pipeline для schedule задание с заданным периодом. Действие может быть любой командой при настройке вашего конвейера с ShellCommandActivity.
Вы даже можете использовать существующий экземпляр EC2 для запуска команды: Setup Task Runner на вашем экземпляре EC2 и установить поле workerGroup
, когда установив ShellCommandActivity (doc) на вашу DataPipeline:
{
"pipelineId": "df-0937003356ZJEXAMPLE",
"pipelineObjects": [
{
"id": "Schedule",
"name": "Schedule",
"fields": [
{ "key": "startDateTime", "stringValue": "2012-12-12T00:00:00" },
{ "key": "type", "stringValue": "Schedule" },
{ "key": "period", "stringValue": "1 hour" },
{ "key": "endDateTime", "stringValue": "2012-12-21T18:00:00" }
]
}, {
"id": "DoSomething",
"name": "DoSomething",
"fields": [
{ "key": "type", "stringValue": "ShellCommandActivity" },
{ "key": "command", "stringValue": "echo hello" },
{ "key": "schedule", "refValue": "Schedule" },
{ "key": "workerGroup", "stringValue": "yourWorkerGroup" }
]
}
]
}
Limits: Минимальный интервал планирования составляет 15 минут.
Pricing: около $1,00 в месяц.
Ответ 5
Вам следует рассмотреть событие CloudWatch и Lambda (http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html). Вы платите только за фактические прогоны. Я полагаю, что работники, поддерживаемые эластичным бобовым стеблем, по-прежнему стоят денег, даже когда они простаивают.
Обновление: нашел эту приятную статью (http://brianstempin.com/2016/02/29/replacing-the-cron-in-aws/)
Ответ 6
Если эта задача может быть выполнена с одной машиной, я рекомендую загружать экземпляр программно, используя туманный камень, написанный на рубине.
После запуска экземпляра вы можете запустить команду через ssh. После завершения вы можете выключиться и с туманом.
Amazon EMR также является хорошим решением, если ваша задача может быть записана на карте. EMR позаботится о запуске/остановке экземпляров. Инструмент эластичный mapreduce-ruby cli может помочь вам его автоматизировать
Ответ 7
Вы можете использовать AWS Opswork для установки заданий cron для вашего приложения. Для получения дополнительной информации прочтите руководство пользователя на AWS OpsWork. Я нашел страницу, объясняющую, как настроить задания cron: http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-extend-cron.html