AWS无服务架构下API调用添加lastModifiedTime的最优方案咨询
无侵入实现API调用时间戳记录的方案
按落地成本、侵入性从低到高排序,可按需选择:
最高优先级方案:API Gateway 前置Lambda拦截,完全无需修改现有业务代码
你现有的API Gateway本身支持为全量路由统一配置请求预处理逻辑,只需要两步即可完成配置:- 新建一个独立的日志专用Lambda函数,逻辑仅包含提取API请求路径、生成时间戳、写入DynamoDB,示例代码如下:
import boto3 import time ddb = boto3.resource('dynamodb').Table('api_last_modified') def lambda_handler(event, context): # HTTP API 类型路径提取方式,REST API可替换为 event['requestContext']['resourcePath'] api_path = event['requestContext']['http']['path'] timestamp = int(time.time() * 1000) ddb.put_item(Item={ "api_path": api_path, "lastModifiedTime": timestamp }) # 放行请求到后续业务逻辑 return { "statusCode": 200, "headers": {} }- 在API Gateway控制台批量选中所有现有路由,配置请求预处理关联上述Lambda即可,全量配置耗时不超过15分钟,完全不侵入现有30余个业务Lambda的逻辑。
如果你的场景不需要对时间戳做高频低延迟查询,还可以直接开启API Gateway访问日志,将请求路径、请求时间字段直接投递到CloudWatch Logs留存,连额外的Lambda和DynamoDB都不需要创建,成本最低。
次优先级方案:复用现有逻辑减少改造量
如果你的API已经配置了统一的Lambda授权器,可以直接将记录时间戳的逻辑加到授权器代码中,授权器是所有请求的必经路径,不需要额外新增资源,也不需要修改业务代码。
如果允许对现有Lambda做极少量修改,可以将时间戳记录逻辑封装为Lambda层(Lambda Layer),所有业务Lambda绑定该层后,仅需在入口函数新增一行调用代码即可,相比修改所有业务表相关代码的改造量降低90%以上。
你最初考虑的全量修改业务代码的方案侵入性最强,后续如果需要新增日志字段还需要再次迭代所有业务代码,维护成本最高,不推荐使用。
内容的提问来源于stack exchange,提问作者CCCC
相关产品推荐
相关产品推荐

