Планирование работы на 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