Запланированные задачи AWS Lambda

148

Amazon анонсировала AWS Lambda ( http://aws.amazon.com/lambda/ ).

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

Запланированные задачи

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

Когда я прочитал это, я понял, что наконец-то у меня появился способ постоянно выполнять задачи, подобные cron. Я хочу запускать определенный запрос каждый день, скажем, в 17:00.

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

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

Натан Х
источник

Ответы:

160

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

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

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

Перейдите к этапу создания «Настроить триггеры» и укажите триггер «Событие CloudWatch - Расписание». Пример конфигурации ниже:

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

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

Перейдите на вкладку «Триггеры» лямбда-выражения, выберите «Добавить триггер» и укажите триггер «Событие CloudWatch - Расписание». Пример снимка экрана, на котором у меня есть лямбда с триггером SNS:

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

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

Обсуждение

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

cron(0 17 * * ? *)

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

Примечания

  • Имя этого типа события было изменено с «Запланированное событие» на «События CloudWatch - Расписание» с момента первого выпуска этой функции.
  • До выпуска этой функции рекомендованным решением этой проблемы (согласно «Приступая к работе с AWS Lambda» за 42 минуты 50 секунд ) было использование SWF для создания таймера или создание таймера с внешним приложением.
  • Пользовательский интерфейс Lambda был переработан с тех пор, как появился пост в блоге о запланированном событии, и скриншоты в нем больше не точны. Смотрите мои обновленные скриншоты выше от 10.03.2017 для последних изменений.
Энтони Нис
источник
знаете ли вы, есть ли надежда на поддержку с точностью до 1 минуты?
kaptan
3
Это немного
похоже
4
Тип источника событий теперь "События CloudWatch - Расписание"
Гай Дахер,
@GuyDaher Спасибо, я соответствующим образом обновил свой ответ.
Энтони Нис,
3
Теперь он поддерживает скорость 1 мин. docs.aws.amazon.com/lambda/latest/dg/…
advncd
18

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

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

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

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

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

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

Шади
источник
9
Больше не верный ответ. Ненадежные городские часы больше не доступны
синяя кожа
16

НОВОЕ РЕШЕНИЕ: Запланированные задания Lambda

Вернер Фогель объявил сегодня (10/08) на re: Invent, что у AWS Lambda теперь есть собственный планировщик.

С.Е. AWS Lambda релиз примечание на 2015-10-08 :

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


СТАРОЕ РЕШЕНИЕ: планирование с помощью AWS Data Pipeline

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

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

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

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

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

Вы также можете использовать 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 доллара в месяц.

Ив М.
источник
9

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

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

  • Создать будильник CloudWatch для: ApproximateNumberOfMessagesVisible> 0 в течение 1 минуты

  • Подписка на рассылку сообщений в социальных сетях
  • Подпишитесь на Lambda в SNS Topic

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

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

maplpro
источник
4
Этот ответ в основном представляет собой инструкции для одного механизма, который может реализовать ненадежные городские часы, описанные в ответе Шади . Учитывая, что автор UTC предупреждает, что он «может исчезнуть без предупреждения в любой момент», ваш подход, вероятно, намного лучше.
Брайан
Первая реализация - 1 сообщение - работает пару дней и останавливается. Похоже, периодически сообщение просто не доставляется в SQS. Добавил еще 2 сообщения (всего 3) - теперь работает уже неделю. В CloudWatch я вижу периодические промахи - доставлено всего 2 сообщения, таймер по-прежнему тикает нормально. Gist обновлен gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro
@Brian Как автор «Ненадежных городских часов» ( townclock.io ), я согласен с тем, что использование собственных часов дает вам больше контроля, чем зависимость от какого-то незнакомца (меня). На самом деле, я призываю человек , чтобы запустить свою собственную ненадежную Town Clock и опубликовал источник на GitHub: github.com/alestic/alestic-unreliable-town-clock
Эрик Хаммонд
4

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

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

D2TheC
источник
Времена изменились, и теперь Lambda поддерживает планирование типа cron из коробки docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
D2TheC
2

На странице функции Добавить триггер вы можете добавить события CloudWatch и сделать его типом расписания.

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

Дарья Ю
источник
1

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

Джонни
источник
1

Путь через веб-консоль довольно прост. Просто создайте 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"}]'
Леон - Хан Ли
источник
1

Простой способ выполнить ваш запрос в лямбда-выражении для определенного интервала времени - установить правило для вашей лямбда-функции. для этого после создания лямбда-функции перейдите в cloudwatch >> rules >> schedule. и определите выражение cron, а в целевом разделе выберите лямбда-функцию, которую вы хотите запустить.

ПКП
источник
1

Запуск от имени cron в AWS

Пример настройки триггера события расписания облачных часов для лямбда-выражения с использованием облачной информации.


  LambdaSchedule:
    Type: "AWS::Events::Rule"
    Properties:
      Description: A schedule for the Lambda function..
      ScheduleExpression: rate(5 minutes)
      State: ENABLED
      Targets:
        - Arn: !Sub ${LambdaFunction.Arn}
          Id: LambdaSchedule

  LambdaSchedulePermission:
    Type: "AWS::Lambda::Permission"
    Properties:
      Action: 'lambda:InvokeFunction'
      FunctionName: !Sub ${LambdaFunction.Arn}
      Principal: 'events.amazonaws.com'
      SourceArn: !Sub ${LambdaSchedule.Arn}

  LambdaFunction:
    Type: "AWS::Lambda::Function"
    Properties:
      Description: Scheduled lambda to run every 5 minutes
      CodeUri: ./build/package.zip
      Handler: index.lambda_handler
      MemorySize: 128
      Runtime: python3.6
Трайчо Иванов
источник
0

При создании лямбда-функции создайте триггер «События CloudWatch - Расписание»

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

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

Для вашего требования расписание Cron - "0 0 17 1/1 *? *"

AMS
источник
-1

Diksha - это планировщик AWS Lambda на основе AWS SWF Trigger, рекомендованный командой AWS . Можно запланировать задания с помощью выражений 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

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

Нехал Мехта
источник