代码之家  ›  专栏  ›  技术社区  ›  Harry

如何用多个触发器触发同一个lambda函数?

  •  0
  • Harry  · 技术社区  · 6 年前

    1. 在前端,用户使用API网关触发一个lambda函数 将文件发送到s3。
    2. 当文件到达s3时,触发相同的lambda函数来应用视频
    3. 当SNS接收到消息时,触发同一lambda函数以获取消息 标记数据并使用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 回复  |  直到 6 年前
        1
  •  3
  •   John Rotenstein    6 年前

    根据 Error when trying to read AWS SNS message ,您应该创建 三个独立的Lambda函数

    步骤如下:

    1. 在前端,用户通过API网关触发lambda函数,将文件发送到s3。
    2. 当文件到达s3时,它将触发 另一个lambda函数 应用视频识别。此调用将包含一个Amazon SNS主题,当识别完成时,该主题将收到通知。
    3. 第三个lambda函数

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

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

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

        2
  •  2
  •   iammehrabalam    6 年前