Назначенные задачи AWMS Lambda

Amazon объявила AWS Lambda ( http://aws.amazon.com/lambda/ ).

Описание продукта включает:

Дела по расписанию

Функции AWS Lambda могут запускаться внешними таймерами событий, поэтому функции могут выполняться в течение регулярного запланированного времени обслуживания или непиковых часов. Например, вы можете запустить функцию AWS Lambda для выполнения очистки в ночное время архива в нерабочее время.

Когда я прочитал это, я понял, что мог бы наконец иметь способ последовательно выполнять «cron-like» задачи. Скажем, я хочу, чтобы каждый конкретный запрос выполнялся каждый день в 5 вечера.

Однако я не нашел это нигде в документации. Они упоминают только триггеры программных событий или события других служб AWS.

Я неправильно понял? Или может кто-то указать мне на документацию?

Поддержка родных для запланированных событий добавлена ​​8 октября 2015 года:

Как было объявлено в этом сообщении в блоге AWS , планирование теперь поддерживается как тип источника события (также называемый триггерами), называемый « CloudWatch Events – Schedule », и может быть выражен как выражение скорости или cron.

Добавить запланированное событие в новую лямбду

Перейдите к шагу создания настраиваемых триггеров и укажите триггер «EventWatch Event – Schedule». Пример конфигурации ниже:

Изображение, отображающее конфигурацию для создания запланированного события в 17:00 по UTC.

Добавить запланированное событие в существующую лямбду

Перейдите на вкладку «Триггеры» вашей лямбды, выберите «Добавить триггер» и укажите триггер «Событие EventWatch-Schedule». Пример скриншота, где у меня есть существующая lambda с триггером SNS:

Изображение, показывающее, как перейти к добавлению триггерного интерфейса с консоли Lambda.

После загрузки пользовательский интерфейс для настройки этого триггера идентичен экрану вышеприведенного выше раздела «Добавить запланированное событие в новый lambda».

обсуждение

Для примера вашего примера вы хотите использовать cron() вместо rate() . Выражения Cron в lambda требуют всех полей и выражаются в UTC. Поэтому для запуска функции каждый день в 17:00 (UTC) используйте следующее выражение cron:

 cron(0 17 * * ? *) 

Дополнительные ресурсы

  • Документация AWS – Выражения расписания с использованием скорости или Cron
  • Документация AWS – Запуск функции AWS lambda в расписании с использованием AWS CLI
  • Документация AWS – Учебник: Использование AWS Lambda с запланированными событиями
    • AWS предоставил образец «плана», который использует выражение cron, называемое lambda-canary которое можно выбрать при создании функции с консоли AWS.
    • В этом учебном пособии описывается конфигурация этого плана.

Заметки

  • Имя этого типа события изменилось с «Запланированное событие» на «События CloudWatch – Расписание», так как эта функция была впервые выпущена.
  • Перед выпуском этой функции рекомендованное решение этой проблемы (за «Начало работы с AWS Lambda» в 42 минуты 50 секунд ) должно было использовать SWF для создания таймера или для создания таймера с внешним приложением.
  • Пользовательский интерфейс Lambda был перестроен после того, как вышло сообщение о запланированном блоге событий, а скриншоты внутри уже не точны. См. Мои обновленные скриншоты выше от 3/10/2017 для последних изменений.

С момента появления этого сообщения, похоже, появилось еще одно решение: Расписание повторных AWS Lambda Invocations с ненадежными городскими часами (UTC), в которых автор предлагает подписаться на тему SNS « Ненадежные городские часы» . Я не использовал ни SWF, ни SNS, но мне кажется, что решение SNS проще. Вот выдержка из статьи

Ненадежные городские часы (UTC)

Ненадежные городские часы (UTC) – это новая, бесплатная, публичная тема SNS (Amazon Simple Notification Service), которая каждые четверть часа передает всем абонентам сообщение «звон». Он может отправлять куранты в функции AWMS Lambda, очереди SQS и адреса электронной почты.

Вы можете использовать атрибуты chime для запуска своего кода каждые пятнадцать минут или запускать свой код только один раз в час (например, когда минута == «00») или один раз в день (например, когда час == «00» и минута = = «00») или любой другой серии интервалов.

Вы даже можете подписаться на функцию, которую вы хотите запускать только один раз в определенное время в будущем: следует ли игнорировать все вызовы до тех пор, пока она не появится. Когда пришло время, он может выполнить свою работу, а затем отказаться от подписки на тему SNS.

Подключение вашего кода к ненадежным городским часам выполняется быстро и легко. Никакой процесс создания приложения или создания учетной записи не требуется

НОВОЕ РЕШЕНИЕ: Запланированные вакансии в Лямбда

Werner Vogel объявил сегодня вечером (10/08): Re: изобретать, что AWS Lambda теперь имеет собственный планировщик.

Выделите примечание к выпуску AWS Lambda на 2015-10-08 :

Вы также можете настроить AWS Lambda для запуска своего кода на регулярной основе по расписанию с помощью консоли AWS Lambda. Вы можете указать фиксированную ставку (количество часов, дней или недель), или вы можете указать выражение cron. Пример см. В Пошаговом руководстве 5: Использование функций lambda для обработки запланированных событий (Python) .


СТАРЫЙ РЕШЕНИЕ: Планирование с использованием AWS Data Pipeline

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

Например, вы можете запустить команду AWS CLI для:

  • Поместить сообщение в SQS
  • или непосредственно вызвать функцию lambda (см. вызов )

Вы можете легко создать запланированную задачу AWS Data Pipeline непосредственно в консоли AWS (например, с помощью команды AWS CLI):

введите описание изображения здесь

Вы также можете использовать API для определения своего планирования:

 { "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" } ] } ] } 

Пределы : Минимальный интервал планирования составляет 15 минут.
Ценообразование : около $ 1,00 в месяц.

Вот как я это делаю:

  • Создайте Лямбду, которая:

  • Создать CloudWatch Alarm для: ApproximateNumberOfMessagesVisible> 0 за 1 минуту

  • Подписаться SNS Тема для тревоги
  • Подписаться на Lambda для темы SNS

Теперь у вас есть таймер с разрешением приблизительно 15 минут.

Затем другие функции Лямбды подписываются на тему SNS Topic и вызывают каждые 15 минут.

Поскольку теперь легко можно запускать lambda-функции через HTTP (например, используя GET или curl), простым решением является использование управляемого CRON, например easycron: https://www.easycron.com/, чтобы запустить вашу lambda-функцию.

У нас была та же проблема, и я закончил работу cron-службы в Google App Engine на python, так как это позволило повысить гибкость и сложность самой работы CRON.

Путь веб-консоли довольно прост. Просто создайте правило CloudWatch для лямбды и добавьте его на вкладке Triggers лямбды.

Для тех, кому необходимо автоматизировать это с помощью aws cli , мы можем

  1. создать функцию,
  2. создать правило,
  3. предоставить разрешение,
  4. правило и функция ссылки

Создать функцию

 aws lambda create-function --function-name ${FUNCTION-NAME} \ --runtime java8 \ --role 'arn:aws:iam::${Account}:role/${ROLE}' \ --handler org.yourCompany.LambdaApp \ --code '{"S3Bucket":"yourBucket", "S3Key": "RC/yourapp.jar"}' \ --description 'check hive connection' \ --timeout 180 \ --memory-size 384 \ --publish \ --vpc-config '{"SubnetIds": ["subnet-1d2e3435", "subnet-0df4547a"], "SecurityGroupIds": ["sg-cb17b1ae", "sg-0e7ae277"]}' \ --environment Variables={springEnv=dev} 

Создать правила

 ## create aws events put-rule --name ${ruleName} \ --schedule-expression 'rate(5 minutes)' \ --state ENABLED \ --description 'check hive connection' # grant permission to the Rule to allow it to trigger the function aws lambda add-permission --function-name ${functionName} \ --statement-id 123 \ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn arn:aws:events:us-east-1:acc:rule/${ruleName} # link rule and function aws events put-targets --rule ${ruleName} \ --targets '[{"Id":"1", "Arn":"arn:aws:lambda:us-east-1:acc:function:RC-checkhive"}]' 

Вы также можете планировать его с помощью событий cloudWatch. Создайте правило -> прикрепите цель (lambda) и настройте расписание cron / rate по правилу.

При создании lambda-функции создайте триггер «CloudWatch Events – Schedule»

Теперь вы можете использовать пресеты AWS в расписании, например rate = 15 минут, или вы можете использовать выражение cron.

введите описание изображения здесь

Для вашего требования Cron Schedule «0 0 17 1/1 *? *»

Дикша – это AWS Lambda Scheduler на основе AWS SWF Trigger, как рекомендовано AWS Team . Можно назначить задания с использованием выражений cron, а также указать, сколько времени вы хотите запустить, когда начинать или когда заканчивать. Вы можете просмотреть статус, а также историю запланированных заданий. Управление безопасностью осуществляется с помощью правил AWS.

Как только вы настроите движок diksha, вы можете планировать функции с использованием выражения cron следующим образом:

java -jar diksha-client-0.0.1.jar -lcfg cf1 -cj “jobName | functionName | context | 0 0-59 * * * * | 10”

В этой задаче работа будет выполняться каждую минуту 10 раз. AWS SWF запускает функцию самостоятельно.

Подробная информация: https://github.com/milindparikh/diksha

Отказ от ответственности: я участвую в проекте.

Давайте будем гением компьютера.