如何使用多个触发器来触发相同的lambda函数?

时间:2018-11-03 10:55:39

标签: python amazon-web-services amazon-s3 aws-lambda

我的应用需要采取的步骤是:

  1. 在前端,用户使用API​​网关触发lambda函数 发送文件到s3。
  2. 文件在s3中到达时,触发相同的lambda函数以应用视频 识别并将jobId发送到SNS。
  3. SNS收到消息时,触发相同的lambda函数以获取 标记数据,然后使用API​​网关将数据返回给用户

当我分别测试它们时,所有步骤都可以工作,但是如上所述,我不知道如何使代码一起工作。如果我要创建多个lambda函数,请使用一个lambda或尝试其他选项。

注意:标签数据需要通过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 :(得分:1)

如果要向lambda添加多个事件源触发器,则必须首先使用 event 参数(处理程序中的第一个参数)来标识事件类型。

Aws事件解析器GitHub存储库https://github.com/iammehrabalam/awseventparser

来自不同来源的AWS事件样本 https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html

答案 1 :(得分:1)

根据Error when trying to read AWS SNS message,您应该创建三个独立的Lambda函数。从一个功能完成所有操作没有任何好处。实际上,这只会使事情变得更困难。

步骤将是:

  1. 在前端,用户使用API​​网关触发一个lambda函数,该函数会将文件发送到s3。
  2. 文件在s3到达时,将触发另一个lambda函数以应用视频识别。该呼叫将包含一个Amazon SNS主题,当识别完成时,该主题将收到通知。
  3. SNS收到消息后,将触发第三个lambda函数以获取标签数据。

问题是,运行Amazon Rekognition Video可能需要几分钟,具体取决于视频的长度。您应该将系统设计为等待并响应原始API调用,并返回结果,因为它可能会超时。

相反,您的前端应:

  1. 上传视频(触发以上操作)
  2. 一切完成后(或轮询完成)接收通知。

您应将其设计为异步过程(不等待),而不是同步过程(等待结果)。