如何在AWS Cognito每秒请求数超出配额阈值时触发告警并限流
Amazon Cognito 认证请求限流与告警落地方案
整体实现逻辑
- 三层限流拦截:前端滑动窗口限流→API Gateway网关限流→Cognito服务配额兜底,逐层拦截超额请求,避免Cognito过载
- 告警规则绑定:通过CloudWatch监控Cognito认证请求指标、API Gateway限流触发指标,超阈值时触发多渠道告警
- 降级逻辑统一:所有限流场景返回标准化提示,同时记录全量错误日志到持久化存储,方便后续排查
具体配置操作
1. Cognito配额与监控配置
首先确认你的Cognito用户池默认认证请求配额:AWS默认单用户池的InitiateAuth接口配额为每秒50次请求,突发峰值支持100次,如果业务需要更高配额,可在AWS服务配额控制台提交提升申请。
CloudWatch告警配置步骤:
- 进入CloudWatch控制台,创建告警,选择Cognito的
UserAuthentication指标 - 统计方式选
Sum,统计周期设为1秒 - 阈值设置为你设定的每秒最大请求量,连续1个周期超出阈值即触发告警
- 关联SNS主题,绑定运维通知渠道(邮箱、企业微信机器人、短信等)
2. API Gateway 限流配置
所有发往Cognito的认证请求统一经过API Gateway转发,在对应路由的限流配置项中设置:
- 速率限制(Rate limit):设置为每秒允许的平均认证请求量
- 突发限制(Burst limit):设置为允许的瞬时最大请求量
配置完成后,超过限流阈值的请求会被API Gateway直接拦截,不会转发到Cognito服务。
示例代码(Node.js 中间层实现)
const { CognitoIdentityProviderClient, InitiateAuthCommand } = require("@aws-sdk/client-cognito-identity-provider"); const { rateLimit } = require('express-rate-limit'); const client = new CognitoIdentityProviderClient({ region: "us-east-1" }); // 本地限流规则:单IP每秒最多10次认证请求,可根据业务调整 const authLimiter = rateLimit({ windowMs: 1000, limit: 10, standardHeaders: true, legacyHeaders: false, // 前端/中间层限流触发处理 handler: (req, res) => { const errMsg = "当前认证请求量过大,请1秒后重试"; const logPath = "/aws/cloudwatch/logs/us-east-1/cognito-auth-error-log-group"; // 错误日志写入CloudWatch console.error(JSON.stringify({ type: "AUTH_THROTTLE", ip: req.ip, timestamp: Date.now(), message: errMsg, logStorage: logPath })); res.status(429).json({ code: "AUTH_RATE_LIMIT_EXCEEDED", message: errMsg, errorLogStorage: logPath }); } }); // 认证接口核心逻辑 app.post('/api/auth', authLimiter, async (req, res) => { try { const { username, password } = req.body; const command = new InitiateAuthCommand({ AuthFlow: "USER_PASSWORD_AUTH", ClientId: process.env.COGNITO_CLIENT_ID, AuthParameters: { USERNAME: username, PASSWORD: password } }); const response = await client.send(command); res.status(200).json(response.AuthenticationResult); } catch (err) { // 捕获Cognito服务端返回的限流错误 if (err.name === "TooManyRequestsException") { const errMsg = "服务端认证请求量已达上限,请稍后重试"; const logPath = "/aws/cloudwatch/logs/us-east-1/cognito-auth-error-log-group"; console.error(JSON.stringify({ type: "COGNITO_THROTTLE", username: username, timestamp: Date.now(), cognitoError: err.message, logStorage: logPath })); return res.status(429).json({ code: "COGNITO_RATE_LIMIT_EXCEEDED", message: errMsg, errorLogStorage: logPath }); } // 其他业务错误处理 res.status(400).json({ code: err.name, message: err.message }); } });
超限请求返回响应示例
中间层限流触发返回
{ "code": "AUTH_RATE_LIMIT_EXCEEDED", "message": "当前认证请求量过大,请1秒后重试", "errorLogStorage": "/aws/cloudwatch/logs/us-east-1/cognito-auth-error-log-group" }
Cognito服务配额超限触发返回
{ "code": "COGNITO_RATE_LIMIT_EXCEEDED", "message": "服务端认证请求量已达上限,请稍后重试", "errorLogStorage": "/aws/cloudwatch/logs/us-east-1/cognito-auth-error-log-group" }
内容的提问来源于stack exchange,提问作者pqthinh
相关产品推荐
相关产品推荐

