You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Amazon S3预签名URL上传后如何获取AWS Lambda的Rekognition处理结果

基于预签名URL+S3+Rekognition的端到端实现方案

核心流程解决思路

以下是3种不同场景下的可行落地方案,可直接覆盖你需要的结果回传需求:


方案1:客户端轮询+临时结果存储(中小流量场景首选,开发成本最低)

  • 客户端第一次请求对接API Gateway的Lambda获取预签名URL时,Lambda先生成全局唯一的任务ID(requestId),将任务ID、用户上传的比对参数(比如目标比对图片的S3路径、用户标识)存入DynamoDB,状态标记为pending,同时将任务ID和预签名URL一同返回给React Native客户端。
  • 客户端使用预签名URL完成图片上传后,携带任务ID每隔2~3秒请求API Gateway的结果查询接口,接口通过任务ID查询DynamoDB内的任务状态。
  • S3上传事件触发的Lambda接收到通知后,调用Rekognition接口完成人脸比对,将比对结果、任务状态更新为completed/failed写入DynamoDB对应的任务记录中。
  • 客户端轮询到任务状态为完成时,直接获取结果并终止轮询,若超过预设的超时时间(建议30秒)未获取到结果则提示用户重试。

补充优化:可给DynamoDB的任务表设置TTL自动清理过期记录,避免存储无效的历史任务数据。


方案2:API Gateway WebSocket实时推送(低延迟场景首选)

  • 客户端请求预签名URL之前,先与API Gateway的WebSocket接口建立长连接,连接成功后获取后端返回的唯一连接ID(connectionId)。
  • 客户端请求预签名URL时,将connectionId一同传给Lambda,Lambda生成任务ID后,将任务ID、connectionId、比对参数存入DynamoDB,状态标记为pending,返回预签名URL和任务ID给客户端。
  • S3触发的Lambda完成Rekognition比对后,调用API Gateway的@connections接口,通过存储的connectionId将比对结果主动推送给对应的客户端,推送完成后可主动断开连接或复用连接。

该方案无需轮询,实时性更高,适合对结果返回速度要求高的场景,仅需额外维护WebSocket连接逻辑。


方案3:APP端移动推送(比对耗时较长场景首选)

  • 客户端请求预签名URL时,将自身的移动推送令牌(APNs/FCM令牌)一同传给Lambda,存入DynamoDB对应的任务记录中。
  • S3触发的Lambda完成Rekognition比对后,调用AWS SNS的移动推送能力,将比对结果推送到用户的APP端,用户点击推送即可直接跳转至结果页,无需停留在上传页面等待。

该方案适合人脸比对耗时久(如比对大容量人脸库)的场景,避免用户长时间停留在上传页等待。


Lambda调用人脸Rekognition的示例代码(Node.js环境)

import { RekognitionClient, CompareFacesCommand } from "@aws-sdk/client-rekognition";
// 初始化Rekognition客户端,替换为你的AWS区域
const rekognitionClient = new RekognitionClient({ region: "us-east-1" });

export const handler = async (event) => {
  // 从S3上传事件中解析刚上传的图片信息
  const uploadBucket = event.Records[0].s3.bucket.name;
  const uploadImageKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
  
  // 可通过uploadImageKey关联DynamoDB中存储的对应任务记录,获取目标比对图片的信息
  const targetImageKey = "待比对的目标图片S3 Key";
  const targetBucket = "目标图片所在存储桶名称";

  try {
    const compareCommand = new CompareFacesCommand({
      SourceImage: {
        S3Object: { Bucket: uploadBucket, Name: uploadImageKey }
      },
      TargetImage: {
        S3Object: { Bucket: targetBucket, Name: targetImageKey }
      },
      SimilarityThreshold: 80 // 自定义相似度阈值,单位为%
    });
    const rekognitionRes = await rekognitionClient.send(compareCommand);
    // 将rekognitionRes中的比对结果写入DynamoDB对应任务记录即可
    return rekognitionRes;
  } catch (error) {
    console.error("Rekognition调用失败:", error);
    throw error;
  }
};

权限与安全注意事项

  • 生成预签名URL的Lambda执行角色需要配置s3:PutObject权限,预签名URL的有效期建议设置为10分钟以内,避免被滥用。
  • S3触发的Lambda执行角色需要同时配置rekognition:CompareFaces权限、S3存储桶的s3:GetObject权限、DynamoDB的读写权限。
  • 生成预签名URL时可指定Content-Type和文件大小上限,避免用户上传非图片类型的超大文件。

内容的提问来源于stack exchange,提问作者CarlosIS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:45:03