尝试读取 AWS SNS 消息时出错

Error when trying to read AWS SNS message

我需要 return Rekognition 发送到 SNS 的消息,但我在 CloudWatch 中收到此错误:

'Records': KeyError Traceback (most recent call last): File "/var/task/AnalyzeVideo/lambda_function.py", line 34, in lambda_handler message = event["Records"][0]["Sns"]["Message"] KeyError: 'Records'

代码:

def detect_labels(bucket, key):
    response = rekognition.start_label_detection(
        Video = {
            "S3Object": {
                "Bucket": BUCKET,
                "Name": KEY
            }
        },
        NotificationChannel = {
            "SNSTopicArn": TOPIC_ARN,
            "RoleArn": ROLE_ARN
        }
    )

    return response

def lambda_handler(event, context):
    reko_response = detect_labels(BUCKET, KEY)
    message = event["Records"][0]["Sns"]["Message"]
    return message

这是使用 python 在 AWS Lambda 中实现 Rekognition 存储视频的正确方法吗?我没有找到任何示例。

更新:

我的应用需要执行的步骤是:

  1. 在前端,用户使用 API 网关触发 lambda 函数 发送文件到 s3
  2. 当文件到达时触发相同的 lambda 函数来应用视频 识别并发送 jobId 到 SNS
  3. 当 SNS 收到消息时触发相同的 lambda 函数来获取 标签数据和 return 数据通过 API 网关
  4. 返回给用户

您的函数正在调用 rekognition.start_label_detection()(并且您可能已经在未显示的代码中创建了 rekognition 客户端)。

此 API 调用开始对视频进行标签检测。完成后,它将向给定的 SNS 主题发布一条消息。您可以将 Lambda 函数连接到 SNS,以在完成时检索标签检测的详细信息。

但是,您的代码混淆了操作顺序。相反,您应该执行以下操作:

  • 某些东西(可能不是 Lambda 函数)应该调用 start_label_detection() 来开始扫描视频的过程。这可能需要几分钟时间。
  • 应将 Lambda 函数配置为在 SNS 主题收到消息时触发。
  • 然后向 Lambda 函数传递消息的副本,可用于调用 get_label_detection() 以检索扫描的详细信息。

因此,您的第一步是将初始 start_label_detection() 请求与检索结果的代码分开。然后,修改 Lambda 函数以通过 get_label_detection() 检索结果并处理结果。