如何在Lambda中查询AWS API Gateway Usage Plan对应API Key的剩余请求配额
解决方案
AWS API Gateway 没有提供直接查询剩余配额的原生接口,你可以通过组合调用AWS官方API计算剩余额度,具体实现步骤如下:
1. 配置Lambda执行角色权限
首先需要为你的Lambda函数的执行IAM角色添加以下权限:
apigateway:getApiKey:用于通过API Key字符串查询对应的Key ID、关联的使用计划IDapigateway:getUsagePlan:用于查询使用计划配置的总配额apigateway:getUsage:用于查询指定时间段内API Key的已使用请求次数
2. 核心实现逻辑
整体计算逻辑为:剩余额度 = 使用计划月总配额 - 当前月已使用请求次数
具体流程:
- 首先从API Gateway触发Lambda的事件参数中获取用户传入的API Key字符串,调用
get_api_key接口获取该Key的ID以及关联的使用计划ID - 调用
get_usage_plan接口,获取该使用计划配置的每月请求总配额 - 调用
get_usage接口,传入使用计划ID、API Key ID、当月的起止时间范围,获取该Key当月已使用的请求次数 - 两者做差即可得到剩余请求额度
3. Python代码示例(基于boto3)
import boto3 from datetime import datetime from calendar import monthrange client = boto3.client('apigateway') def get_remaining_quota(api_key_str): # 1. 获取API Key详情 key_resp = client.get_api_key( apiKey=api_key_str, includeValue=False ) key_id = key_resp['id'] usage_plan_id = key_resp['stageKeys'][0]['usagePlanId'] # 可按实际关联的使用计划逻辑调整 # 2. 获取使用计划总配额 plan_resp = client.get_usage_plan(usagePlanId=usage_plan_id) monthly_quota = plan_resp['quota']['limit'] # 3. 计算当月起止时间(UTC时间,可按需调整时区) now = datetime.utcnow() start_date = datetime(now.year, now.month, 1).strftime('%Y-%m-%d') end_date = datetime(now.year, now.month, monthrange(now.year, now.month)[1]).strftime('%Y-%m-%d') # 4. 获取当月已使用次数 usage_resp = client.get_usage( usagePlanId=usage_plan_id, keyId=key_id, startDate=start_date, endDate=end_date ) used_count = sum(usage_resp['items'][0]) # 5. 返回剩余额度,避免出现负数 return max(0, monthly_quota - used_count)
4. 注意事项
getUsage接口返回的调用数据存在2-5分钟的延迟,如果你需要近实时的配额统计,建议自行在DynamoDB中维护请求计数:每次API请求触发Lambda时,对应用户Key的计数原子加1,查询时直接读取DynamoDB中的数值即可- 如果你的使用计划配额是按天/周配置的,只需调整
getUsage接口传入的时间范围即可
内容的提问来源于stack exchange,提问作者SamuelCarreira
相关产品推荐
相关产品推荐

