Планирование работы на AWS EC2 - PullRequest
14 голосов
/ 11 января 2012

У меня есть веб-сайт, работающий на AWS EC2.Мне нужно создать ночную работу, которая генерирует файл карты сайта и загружает файлы в различные браузеры.Я ищу утилиту на AWS, которая позволяет эту функциональность.Я рассмотрел следующее:

1) Создайте запрос к веб-серверу, который запускает его для выполнения этой задачи

  • Мне не нравится этот подход, потому что он связываетсерверный поток и использует циклы процессора на хосте

2) Создайте задание cron на машине, на которой запущен веб-сервер для выполнения этой задачи

  • Опять яэтот подход не нравится, поскольку он отнимает циклы ЦП у веб-сервера

3) Создайте еще один экземпляр EC2 и настройте задание cron для запуска задачи

  • Thisрешает проблемы с ресурсами веб-сервера, но зачем платить за дополнительный экземпляр EC2 для запуска задания в течение <5 минут?Трата денег! </li>

Есть ли другие варианты?Это работа для ElasticMapReduce?

Ответы [ 7 ]

16 голосов
/ 11 января 2012

Если бы я был на вашем месте, я бы, вероятно, начал с попытки запуска задания cron на веб-сервере каждую ночь во время отлива и отслеживания использования ресурса, чтобы убедиться, что он не мешает веб-серверу.

Если вы обнаружите, что он не очень хорошо работает или у вас высокие стандарты элегантности вашей архитектуры (я могу восхищаться этим), то вам, вероятно, потребуется запустить отдельный экземпляр.

Я согласен с тем, что запускать экземпляр 24 часа в сутки для задания, которое нужно запускать раз в ночь, кажется бесполезным.

Вот один подход: задание cron на вашем основном компьютере (в настоящее время веб-сервер) может запустить новый экземпляр для запуска задачи. Он может передать сценарий пользовательских данных, который запускается при запуске экземпляра, и экземпляр может завершить работу самостоятельно, когда завершит задачу (где для экземпляра-init-shutdown-поведение было установлено «завершить»).

К сожалению, это не соответствует вашему желанию обеспечить разделение интересов, усложняется, когда вы начинаете масштабирование до нескольких веб-серверов, и требует, чтобы ваш веб-сервер был активен для выполнения задания.

Пару месяцев назад я предложил другой подход для запуска экземпляра по расписанию cron, полностью полагаясь на существующие функции AWS и не требуя запуска других серверов.

Основная идея состоит в том, чтобы использовать автоматическое масштабирование Amazon с повторяющимся действием, которое каждую ночь масштабирует группу от «0» до «1» в определенное время. Экземпляр может завершить сам себя, когда задание выполнено, а автоматическое масштабирование может очиститься намного позже, чтобы убедиться, что оно завершено.

Я предоставил более подробную информацию и рабочий пример в этой статье:

Запуск экземпляров EC2 в повторяющемся расписании с автоматическим масштабированием
http://alestic.com/2011/11/ec2-schedule-instance

9 голосов
/ 24 февраля 2015

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 голосов
/ 21 августа 2015

AWS DataPipeline

Вы можете использовать AWS Data Pipeline для планирования задачи с заданным периодом.Действие может быть любой командой, когда вы настраиваете свой конвейер с ShellCommandActivity .

Вы даже можете использовать свой существующий экземпляр EC2 для запуска команды: Setup 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 минут.
Цены : около $ 1,00 в месяц.

2 голосов
/ 28 января 2013

Если вы работаете с * nix-версией EC2, я бы посоветовал запустить его в cron с помощью команды nice.

nice меняет приоритет задания.Вы можете сделать его намного более низким приоритетом, поэтому, если ваш веб-сервер занят, заданию cron придется ждать ЦП.

Чем выше значение nice, тем ниже приоритет.Диапазон значений: от -20 (наиболее благоприятный график) до 19 (наименее благоприятный).

1 голос
/ 25 сентября 2017

Вам следует рассмотреть CloudWatch Event и Lambda (http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html).. Вы платите только за фактические прогоны. Я предполагаю, что работники, обслуживаемые Elastic beanstalk, все еще стоят денег, даже когда они простаивают.

Обновление: нашел эту хорошую статью (http://brianstempin.com/2016/02/29/replacing-the-cron-in-aws/)

0 голосов
/ 26 февраля 2014

Вы можете использовать AWS Opswork для настройки заданий cron для вашего приложения. Для получения дополнительной информации прочитайте их руководство пользователя на AWS OpsWork. Я нашел страницу, объясняющую, как настроить задания cron: http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-extend-cron.html

0 голосов
/ 11 января 2012

Если эту задачу можно выполнить на одном компьютере, я рекомендую загрузить экземпляр программно с помощью fog gem , написанного на ruby.

После запуска экземпляра вы можете запустить команду через ssh.После завершения вы также можете отключиться с помощью тумана.

Amazon EMR также является хорошим решением, если ваша задача может быть написана в виде сокращения карты.EMR позаботится о запуске / остановке экземпляров.Инструмент astic-mapreduce-ruby cli может помочь вам автоматизировать его

...