Назначенные задачи 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». Пример конфигурации ниже:
Добавить запланированное событие в существующую лямбду
Перейдите на вкладку «Триггеры» вашей лямбды, выберите «Добавить триггер» и укажите триггер «Событие EventWatch-Schedule». Пример скриншота, где у меня есть существующая lambda с триггером SNS:
После загрузки пользовательский интерфейс для настройки этого триггера идентичен экрану вышеприведенного выше раздела «Добавить запланированное событие в новый 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. - В этом учебном пособии описывается конфигурация этого плана.
- AWS предоставил образец «плана», который использует выражение cron, называемое
Заметки
- Имя этого типа события изменилось с «Запланированное событие» на «События 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 в месяц.
Вот как я это делаю:
-
Создайте Лямбду, которая:
- продувки с учетом SQS
- отправляет туда сообщение с задержкой 10 минут
- https://gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
-
Создать 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
, мы можем
- создать функцию,
- создать правило,
- предоставить разрешение,
- правило и функция ссылки
Создать функцию
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
Отказ от ответственности: я участвую в проекте.