Как запустить одну и ту же лямбда-функцию с несколькими триггерами? - PullRequest
0 голосов
/ 03 ноября 2018

Мое приложение должно выполнить следующие шаги:

  1. Во внешнем интерфейсе пользователь запускает лямбда-функцию с помощью API-шлюза, который отправляет файл на s3.
  2. Когда файл поступает в s3, активируйте ту же лямбда-функцию для применения видео распознавание и отправка jobId в SNS.
  3. Когда SNS получает сообщение, запустите ту же лямбда-функцию, чтобы получить пометить данные и вернуть данные обратно пользователю с помощью шлюза API

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

Примечание: данные метки необходимо возвращать обратно пользователю через API

Должно быть что-то вроде этого:

rekognition = boto3.client("rekognition")
sns = boto3.client("sns")

def lambda_handler(event, context):
    # should be triggered when s3 recives file after API call
    response = rekognition.start_label_detection(
        Video = {
            "S3Object": {
                "Bucket": BUCKET,
                "Name": KEY
            }
        },
        NotificationChannel = {
            "SNSTopicArn": SNS_TOPIC_ARN,
            "RoleArn": ROLE_ARN
        }
    )

    # should be triggerd when sns message has arrived
    if "Records" in event:
        message = event["Records"][0]["Sns"]["Message"]
        #perform get lables here from jobId...



    # should return labels back to the user
    return {
        "statusCode": 200,
        "body": json.dumps(lables),
        "headers": {
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/json"

        }
    }

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

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

Шаги будут:

  1. Во внешнем интерфейсе пользователь запускает лямбда-функцию с помощью API-шлюза, который отправляет файл на s3.
  2. Когда файл поступает в s3, он запускает другую лямбда-функцию для применения распознавания видео. Этот звонок будет включать тему Amazon SNS, которая получит уведомление, когда распознавание будет завершено.
  3. Когда SNS получает сообщение, он запускает третью лямбда-функцию для получения данных метки.

Проблема в том, что запуск Amazon Rekognition Video может занять несколько минут, в зависимости от продолжительности видео. Вы должны , а не проектировать вашу систему так, чтобы она ждала и отвечала на исходный вызов API с результатом, потому что это, вероятно, истекло время ожидания.

Скорее, ваш интерфейс должен:

  1. Загрузить видео (которое вызывает вышеописанное)
  2. Получать уведомления, когда все закончено (или опрашивать на предмет завершения).

Вы должны проектировать его как асинхронный процесс (не ожидающий), а не как синхронный процесс (ожидающий результат).

0 голосов
/ 03 ноября 2018

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

Анализатор событий Aws GitHub repo https://github.com/iammehrabalam/awseventparser

Примеры событий AWS из разных источников https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...