AWS Lambda повторяется через определенное время - PullRequest
1 голос
/ 19 июня 2019

У меня есть лямбда, которая, наряду с другими вещами, выполняет GET-запрос, каждый день, в 5 часов утра , на каком-то сервисе, вызванном CloudWatchEvents.

Эта служба может иметь или не иметь нужные мне данные к моменту запроса.

Поэтому, если данных там нет, мне нужно повторно вызвать лямбду, скажем, 6 утра . Если это все еще не там, снова в 7:00 , и так далее.

Как мне добиться этого с помощью инфраструктуры AWS?

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

Это очень хороший вариант использования для Шаговых функций .

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

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

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

1 голос
/ 19 июня 2019

У меня была похожая ситуация, моей лямбде нужно было менять расписание на выходных, и вот как я ее решил.

def lambda_handler(event, context):
    reschedule_event()
    keep_working()

REGULAR_SCHEDULE = 'rate(20 minutes)'
WEEKEND_SHEDULE = 'rate(1 hour)'
RULE_NAME = 'My Rule'

def reschedule_event():
    """
    Cambia la planificación de la lambda, para que descanse los findes :D
    """
    sched = boto3.client('events')
    current = sched.describe_rule(Name=RULE_NAME)
    if is_weekend() and 'minutes' in current['ScheduleExpression']:
        sched.put_rule(
            Name=RULE_NAME,
            ScheduleExpression=WEEKEND_SCHEDULE,
        )
    if not is_weekend and 'hour' in current['ScheduleExpression']:
        sched.put_rule(
            Name=RULE_NAME,
            ScheduleExpression=REGULAR_SCHEDULE,
        )

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

...