如何将EC2生成的JSON对象传递至Angular应用?
实现方案详解
方案一:S3存储计算结果 + 前端获取通知/轮询
这是你提到的思路,具体落地可分两种模式:
- 被动通知模式
- 给存储计算结果的S3桶配置事件通知:当EC2上传JSON文件完成时,触发Lambda函数。
- Lambda通过AWS SNS或API Gateway WebSocket向前端Angular推送通知,附带结果文件的标识(如文件名、预签名URL)。
- Angular收到通知后,直接通过预签名URL下载S3上的JSON文件,或调用接口获取权限后读取。
- 主动轮询模式
- Angular上传文件到S3时,生成唯一关联ID(如UUID),并和文件名一起留存(前端本地存储或后端数据库)。
- EC2处理完成后,将JSON文件以关联ID命名(或在文件元数据中写入关联ID)上传到结果S3桶。
- Angular定期调用轻量后端接口(如Lambda+API Gateway),传入关联ID查询结果文件是否存在;若存在,接口返回预签名URL,Angular据此下载JSON。
注意:需给Angular配置合法的S3访问权限,推荐用Cognito身份池生成临时凭证,或通过后端生成预签名URL,避免前端暴露密钥。
方案二:API Gateway 实现结果回调/查询
该方案更适配实时性需求或不想依赖S3静态读取的场景,具体步骤:
- Angular上传文件到S3时,同时生成唯一请求ID,将请求ID、文件信息一并写入SQS(或通过后端接口存入DynamoDB)。
- 搭建API Gateway,创建两个接口:
- 查询接口:前端传入请求ID,查询计算结果;
- 回调接口:供EC2上传计算完成后的JSON结果,同时携带请求ID。
- EC2完成计算后,调用API Gateway的回调接口,将JSON和请求ID提交到后端(如Lambda),Lambda将结果存入DynamoDB并关联请求ID。
- Angular可选择:
- 定期调用查询接口,根据请求ID获取JSON结果;
- 改用API Gateway的WebSocket API,Angular建立长连接后,Lambda收到EC2的回调结果时直接推送给前端,无需轮询。
额外优化点
- 幂等处理:在SQS中开启消息去重,或给上传文件生成唯一哈希值,避免重复触发EC2计算;
- 状态跟踪:在DynamoDB中记录文件的处理状态(上传中、计算中、完成、失败),前端可直观展示进度;
- 错误处理:若EC2计算失败,通过同样的通知/查询机制告知前端,避免无限等待。
内容的提问来源于stack exchange,提问作者blackcoder
相关产品推荐
相关产品推荐

