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
相关产品推荐
相关产品推荐

